diff --git a/apps/admin_audit/appinfo/app.php b/apps/admin_audit/appinfo/app.php deleted file mode 100644 index 2cbed5bf57..0000000000 --- a/apps/admin_audit/appinfo/app.php +++ /dev/null @@ -1,21 +0,0 @@ - - - admin_audit - Log audit info - 0.1 - AGPL - Bart Visscher - 4 - Audit user actions in Owncloud - true - diff --git a/apps/admin_audit/lib/hooks_handlers.php b/apps/admin_audit/lib/hooks_handlers.php deleted file mode 100644 index 17a553837d..0000000000 --- a/apps/admin_audit/lib/hooks_handlers.php +++ /dev/null @@ -1,73 +0,0 @@ - - - admin_dependencies_chk - ownCloud dependencies info - AGPL - Brice Maron (eMerzh) - 4 - true - Display OwnCloud's dependencies informations (missings modules, ...) - diff --git a/apps/admin_dependencies_chk/appinfo/version b/apps/admin_dependencies_chk/appinfo/version deleted file mode 100644 index d1c6331b31..0000000000 --- a/apps/admin_dependencies_chk/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.01 \ No newline at end of file diff --git a/apps/admin_dependencies_chk/css/style.css b/apps/admin_dependencies_chk/css/style.css deleted file mode 100644 index 30f204be7b..0000000000 --- a/apps/admin_dependencies_chk/css/style.css +++ /dev/null @@ -1,9 +0,0 @@ -#status_list legend { font-weight: bold; color: #888888; } -.state > li { margin-bottom: 3px; padding-left: 0.5em; list-style-type: circle; } -.state .state_module { font-weight:bold; text-shadow: 0 1px 0 #DDD; cursor:help;} - -.state_used ul, .state_used li { display:inline; } - -.state_ok .state_module { color: #009700; } -.state_warning .state_module { color: #FF9B29; } -.state_error .state_module { color: #FF3B3B; } diff --git a/apps/admin_dependencies_chk/l10n/.gitkeep b/apps/admin_dependencies_chk/l10n/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/admin_dependencies_chk/l10n/ca.php b/apps/admin_dependencies_chk/l10n/ca.php deleted file mode 100644 index 08f4ec8078..0000000000 --- a/apps/admin_dependencies_chk/l10n/ca.php +++ /dev/null @@ -1,14 +0,0 @@ - "El mòdul php-json és necessari per moltes aplicacions per comunicacions internes", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "El mòdul php-curl és necessari per mostrar el títol de la pàgina quan s'afegeixen adreces d'interès", -"The php-gd module is needed to create thumbnails of your images" => "El mòdul php-gd és necessari per generar miniatures d'imatges", -"The php-ldap module is needed connect to your ldap server" => "El mòdul php-ldap és necessari per connectar amb el servidor ldap", -"The php-zip module is needed download multiple files at once" => "El mòdul php-zip és necessari per baixar múltiples fitxers de cop", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "El mòdul php-mb_multibyte és necessari per gestionar correctament la codificació.", -"The php-ctype module is needed validate data." => "El mòdul php-ctype és necessari per validar dades.", -"The php-xml module is needed to share files with webdav." => "El mòdul php-xml és necessari per compatir els fitxers amb webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La directiva allow_url_fopen de php.ini hauria d'establir-se en 1 per accedir a la base de coneixements dels servidors OCS", -"The php-pdo module is needed to store owncloud data into a database." => "El mòdul php-pdo és necessari per desar les dades d'ownCloud en una base de dades.", -"Dependencies status" => "Estat de dependències", -"Used by :" => "Usat per:" -); diff --git a/apps/admin_dependencies_chk/l10n/cs_CZ.php b/apps/admin_dependencies_chk/l10n/cs_CZ.php deleted file mode 100644 index f750f13aef..0000000000 --- a/apps/admin_dependencies_chk/l10n/cs_CZ.php +++ /dev/null @@ -1,14 +0,0 @@ - "Modul php-json je třeba pro vzájemnou komunikaci mnoha aplikací", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modul php-curl je třeba pro zobrazení titulu strany v okamžiku přidání záložky", -"The php-gd module is needed to create thumbnails of your images" => "Modul php-gd je třeba pro tvorbu náhledů Vašich obrázků", -"The php-ldap module is needed connect to your ldap server" => "Modul php-ldap je třeba pro připojení na Váš ldap server", -"The php-zip module is needed download multiple files at once" => "Modul php-zip je třeba pro souběžné stahování souborů", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modul php-mb_multibyte je třeba pro správnou funkci kódování.", -"The php-ctype module is needed validate data." => "Modul php-ctype je třeba k ověřování dat.", -"The php-xml module is needed to share files with webdav." => "Modul php-xml je třeba ke sdílení souborů prostřednictvím WebDAV.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Příkaz allow_url_fopen ve Vašem php.ini souboru by měl být nastaven na 1 kvůli získávání informací z OCS serverů", -"The php-pdo module is needed to store owncloud data into a database." => "Modul php-pdo je třeba pro ukládání dat ownCloud do databáze", -"Dependencies status" => "Status závislostí", -"Used by :" => "Používáno:" -); diff --git a/apps/admin_dependencies_chk/l10n/de.php b/apps/admin_dependencies_chk/l10n/de.php deleted file mode 100644 index 7877e7d679..0000000000 --- a/apps/admin_dependencies_chk/l10n/de.php +++ /dev/null @@ -1,14 +0,0 @@ - "Das Modul php-json wird von vielen Anwendungen zur internen Kommunikation benötigt.", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Das Modul php-curl wird benötigt, um den Titel der Seite für die Lesezeichen hinzuzufügen.", -"The php-gd module is needed to create thumbnails of your images" => "Das Modul php-gd wird für die Erzeugung der Vorschaubilder benötigt.", -"The php-ldap module is needed connect to your ldap server" => "Das Modul php-ldap wird für die Verbindung mit dem LDAP-Server benötigt.", -"The php-zip module is needed download multiple files at once" => "Das Modul php-zip wird für den gleichzeitigen Download mehrerer Dateien benötigt.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Das Modul php_mb_multibyte wird benötigt, um das Encoding richtig zu handhaben.", -"The php-ctype module is needed validate data." => "Das Modul php-ctype wird benötigt, um Daten zu prüfen.", -"The php-xml module is needed to share files with webdav." => "Das Modul php-xml wird benötigt, um Dateien über WebDAV zu teilen.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Die Richtlinie allow_url_fopen in Ihrer php.ini sollte auf 1 gesetzt werden, um die Wissensbasis vom OCS-Server abrufen.", -"The php-pdo module is needed to store owncloud data into a database." => "Das Modul php-pdo wird benötigt, um Daten in der Datenbank zu speichern.", -"Dependencies status" => "Status der Abhängigkeiten", -"Used by :" => "Benutzt von:" -); diff --git a/apps/admin_dependencies_chk/l10n/el.php b/apps/admin_dependencies_chk/l10n/el.php deleted file mode 100644 index 9dd455b670..0000000000 --- a/apps/admin_dependencies_chk/l10n/el.php +++ /dev/null @@ -1,4 +0,0 @@ - "Κατάσταση εξαρτήσεων", -"Used by :" => "Χρησιμοποιήθηκε από:" -); diff --git a/apps/admin_dependencies_chk/l10n/eo.php b/apps/admin_dependencies_chk/l10n/eo.php deleted file mode 100644 index 65896831f7..0000000000 --- a/apps/admin_dependencies_chk/l10n/eo.php +++ /dev/null @@ -1,14 +0,0 @@ - "La modulo php-json necesas por komuniko inter la multaj aplikaĵoj", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "La modulo php-curl necesas por venigi la paĝotitolon dum aldono de legosigno", -"The php-gd module is needed to create thumbnails of your images" => "La modulo php-gd necesas por krei bildetojn.", -"The php-ldap module is needed connect to your ldap server" => "La modulo php-ldap necesas por konekti al via LDAP-servilo.", -"The php-zip module is needed download multiple files at once" => "La modulo php-zip necesas por elŝuti plurajn dosierojn per unu fojo.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "La modulo php-mb_multibyte necesas por ĝuste administri la kodprezenton.", -"The php-ctype module is needed validate data." => "La modulo php-ctype necesas por validkontroli datumojn.", -"The php-xml module is needed to share files with webdav." => "La modulo php-xml necesas por kunhavigi dosierojn per WebDAV.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La ordono allow_url_fopen de via php.ini devus valori 1 por ricevi scibazon el OCS-serviloj", -"The php-pdo module is needed to store owncloud data into a database." => "La modulo php-pdo necesas por konservi datumojn de ownCloud en datumbazo.", -"Dependencies status" => "Stato de dependoj", -"Used by :" => "Uzata de:" -); diff --git a/apps/admin_dependencies_chk/l10n/es.php b/apps/admin_dependencies_chk/l10n/es.php deleted file mode 100644 index cbf13951ac..0000000000 --- a/apps/admin_dependencies_chk/l10n/es.php +++ /dev/null @@ -1,4 +0,0 @@ - "Estado de las dependencias", -"Used by :" => "Usado por:" -); diff --git a/apps/admin_dependencies_chk/l10n/et_EE.php b/apps/admin_dependencies_chk/l10n/et_EE.php deleted file mode 100644 index 529c8e78d1..0000000000 --- a/apps/admin_dependencies_chk/l10n/et_EE.php +++ /dev/null @@ -1,14 +0,0 @@ - "php-json moodul on vajalik paljude rakenduse poolt omvahelise suhtlemise jaoks", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "php-curl moodul on vajalik lehe pealkirja tõmbamiseks järjehoidja lisamisel", -"The php-gd module is needed to create thumbnails of your images" => "php-gd moodul on vajalik sinu piltidest pisipiltide loomiseks", -"The php-ldap module is needed connect to your ldap server" => "php-ldap moodul on vajalik sinu ldap serveriga ühendumiseks", -"The php-zip module is needed download multiple files at once" => "php-zip moodul on vajalik mitme faili korraga alla laadimiseks", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "php-mb_multibyte moodul on vajalik kodeerimise korrektseks haldamiseks.", -"The php-ctype module is needed validate data." => "php-ctype moodul on vajalik andmete kontrollimiseks.", -"The php-xml module is needed to share files with webdav." => "php-xml moodul on vajalik failide jagamiseks webdav-iga.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Sinu php.ini failis oleva direktiivi allow_url_fopen väärtuseks peaks määrama 1, et saaks tõmmata teadmistebaasi OCS-i serveritest", -"The php-pdo module is needed to store owncloud data into a database." => "php-pdo moodul on vajalik owncloudi andmete salvestamiseks andmebaasi.", -"Dependencies status" => "Sõltuvuse staatus", -"Used by :" => "Kasutab :" -); diff --git a/apps/admin_dependencies_chk/l10n/fi_FI.php b/apps/admin_dependencies_chk/l10n/fi_FI.php deleted file mode 100644 index 85e33cfe8c..0000000000 --- a/apps/admin_dependencies_chk/l10n/fi_FI.php +++ /dev/null @@ -1,9 +0,0 @@ - "php-gd-moduuli vaaditaan, jotta kuvista on mahdollista luoda esikatselukuvia", -"The php-ldap module is needed connect to your ldap server" => "php-ldap-moduuli vaaditaan, jotta yhteys ldap-palvelimeen on mahdollista", -"The php-zip module is needed download multiple files at once" => "php-zip-moduuli vaaditaan, jotta useiden tiedostojen samanaikainen lataus on mahdollista", -"The php-xml module is needed to share files with webdav." => "php-xml-moduuli vaaditaan, jotta tiedostojen jako webdavia käyttäen on mahdollista", -"The php-pdo module is needed to store owncloud data into a database." => "php-pdo-moduuli tarvitaan, jotta ownCloud-tietojen tallennus tietokantaan on mahdollista", -"Dependencies status" => "Riippuvuuksien tila", -"Used by :" => "Käyttökohde:" -); diff --git a/apps/admin_dependencies_chk/l10n/fr.php b/apps/admin_dependencies_chk/l10n/fr.php deleted file mode 100644 index 1b195b78bb..0000000000 --- a/apps/admin_dependencies_chk/l10n/fr.php +++ /dev/null @@ -1,14 +0,0 @@ - "Le module php-json est requis pour l'inter-communication de nombreux modules.", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Le module php-curl est requis afin de rapatrier le titre des pages lorsque vous ajoutez un marque-pages.", -"The php-gd module is needed to create thumbnails of your images" => "Le module php-gd est requis afin de permettre la création d'aperçus pour vos images.", -"The php-ldap module is needed connect to your ldap server" => "Le module php-ldap est requis afin de permettre la connexion à votre serveur ldap.", -"The php-zip module is needed download multiple files at once" => "Le module php-zip est requis pour le téléchargement simultané de plusieurs fichiers.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Le module php-mb_multibyte est requis pour une gestion correcte des encodages.", -"The php-ctype module is needed validate data." => "Le module php-ctype est requis pour la validation des données.", -"The php-xml module is needed to share files with webdav." => "Le module php-xml est requis pour le partage de fichiers via webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La directive allow_url_fopen de votre fichier php.ini doit être à la valeur 1 afin de permettre le rapatriement de la base de connaissance depuis les serveurs OCS.", -"The php-pdo module is needed to store owncloud data into a database." => "le module php-pdo est requis pour le stockage des données ownCloud en base de données.", -"Dependencies status" => "Statut des dépendances", -"Used by :" => "Utilisé par :" -); diff --git a/apps/admin_dependencies_chk/l10n/it.php b/apps/admin_dependencies_chk/l10n/it.php deleted file mode 100644 index f51286966e..0000000000 --- a/apps/admin_dependencies_chk/l10n/it.php +++ /dev/null @@ -1,14 +0,0 @@ - "Il modulo php-json è richiesto per l'intercomunicazione di diverse applicazioni", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Il modulo php-curl è richiesto per scaricare il titolo della pagina quando si aggiunge un segnalibro", -"The php-gd module is needed to create thumbnails of your images" => "Il modulo php-gd è richiesto per creare miniature delle tue immagini", -"The php-ldap module is needed connect to your ldap server" => "Il modulo php-ldap è richiesto per collegarsi a un server ldap", -"The php-zip module is needed download multiple files at once" => "Il modulo php-zip è richiesto per scaricare diversi file contemporaneamente", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Il modulo php-mb_multibyte è richiesto per gestire correttamente la codifica.", -"The php-ctype module is needed validate data." => "Il modulo php-ctype è richiesto per la validazione dei dati.", -"The php-xml module is needed to share files with webdav." => "Il modulo php-xml è richiesto per condividere i file con webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La direttiva allow_url_fopen del tuo php.ini deve essere impostata a 1 per recuperare la base di conoscenza dai server di OCS", -"The php-pdo module is needed to store owncloud data into a database." => "Il modulo php-pdo è richiesto per archiviare i dati di ownCloud in un database.", -"Dependencies status" => "Stato delle dipendenze", -"Used by :" => "Usato da:" -); diff --git a/apps/admin_dependencies_chk/l10n/ja_JP.php b/apps/admin_dependencies_chk/l10n/ja_JP.php deleted file mode 100644 index 0770b92db1..0000000000 --- a/apps/admin_dependencies_chk/l10n/ja_JP.php +++ /dev/null @@ -1,14 +0,0 @@ - "php-jsonモジュールはアプリケーション間の内部通信に必要です", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "php-curlモジュールはブックマーク追加時のページタイトル取得に必要です", -"The php-gd module is needed to create thumbnails of your images" => "php-gdモジュールはサムネイル画像の生成に必要です", -"The php-ldap module is needed connect to your ldap server" => "php-ldapモジュールはLDAPサーバへの接続に必要です", -"The php-zip module is needed download multiple files at once" => "php-zipモジュールは複数ファイルの同時ダウンロードに必要です", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "php-mb_multibyteモジュールはエンコードを正しく扱うために必要です", -"The php-ctype module is needed validate data." => "php-ctypeモジュールはデータのバリデーションに必要です", -"The php-xml module is needed to share files with webdav." => "php-xmlモジュールはWebDAVでのファイル共有に必要です", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "php.iniのallow_url_fopenはOCSサーバから知識ベースを取得するために1に設定しなくてはなりません", -"The php-pdo module is needed to store owncloud data into a database." => "php-pdoモジュールはデータベースにownCloudのデータを格納するために必要です", -"Dependencies status" => "依存関係の状況", -"Used by :" => "利用先 :" -); diff --git a/apps/admin_dependencies_chk/l10n/lt_LT.php b/apps/admin_dependencies_chk/l10n/lt_LT.php deleted file mode 100644 index 4fed2ab93d..0000000000 --- a/apps/admin_dependencies_chk/l10n/lt_LT.php +++ /dev/null @@ -1,14 +0,0 @@ - "Php-json modulis yra reikalingas duomenų keitimuisi tarp programų", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Php-curl modulis automatiškai nuskaito tinklapio pavadinimą kuomet išsaugoma žymelė.", -"The php-gd module is needed to create thumbnails of your images" => "Php-gd modulis yra naudojamas paveikslėlių miniatiūroms kurti.", -"The php-ldap module is needed connect to your ldap server" => "Php-ldap modulis yra reikalingas prisijungimui prie jūsų ldap serverio", -"The php-zip module is needed download multiple files at once" => "Php-zip modulis yra reikalingas kelių failų atsiuntimui iš karto.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Php-mb_multibyte modulis yra naudojamas apdoroti įvairius teksto kodavimo formatus.", -"The php-ctype module is needed validate data." => "Php-ctype modulis yra reikalingas duomenų tikrinimui.", -"The php-xml module is needed to share files with webdav." => "Php-xml modulis yra reikalingas failų dalinimuisi naudojant webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "allow_url_fopen direktyva turėtų būti nustatyta į \"1\" jei norite automatiškai gauti žinių bazės informaciją iš OCS serverių.", -"The php-pdo module is needed to store owncloud data into a database." => "Php-pdo modulis yra reikalingas duomenų saugojimui į owncloud duomenų bazę.", -"Dependencies status" => "Priklausomybės", -"Used by :" => "Naudojama:" -); diff --git a/apps/admin_dependencies_chk/l10n/nb_NO.php b/apps/admin_dependencies_chk/l10n/nb_NO.php deleted file mode 100644 index 98fcf4fe2a..0000000000 --- a/apps/admin_dependencies_chk/l10n/nb_NO.php +++ /dev/null @@ -1,14 +0,0 @@ - "Modulen php-jason blir benyttet til inter kommunikasjon", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modulen php-curl blir brukt til å hente sidetittelen når bokmerke blir lagt til", -"The php-gd module is needed to create thumbnails of your images" => "Modulen php-gd blir benyttet til å lage miniatyr av bildene dine", -"The php-ldap module is needed connect to your ldap server" => "Modulen php-ldap benyttes for å koble til din ldapserver", -"The php-zip module is needed download multiple files at once" => "Modulen php-zup benyttes til å laste ned flere filer på en gang.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modulen php-mb_multibyte benyttes til å håndtere korrekt tegnkoding.", -"The php-ctype module is needed validate data." => "Modulen php-ctype benyttes til å validere data.", -"The php-xml module is needed to share files with webdav." => "Modulen php-xml benyttes til å dele filer med webdav", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Direktivet allow_url_fopen i php.ini bør settes til 1 for å kunne hente kunnskapsbasen fra OCS-servere", -"The php-pdo module is needed to store owncloud data into a database." => "Modulen php-pdo benyttes til å lagre ownCloud data i en database.", -"Dependencies status" => "Avhengighetsstatus", -"Used by :" => "Benyttes av:" -); diff --git a/apps/admin_dependencies_chk/l10n/pl.php b/apps/admin_dependencies_chk/l10n/pl.php deleted file mode 100644 index e40d23cb7e..0000000000 --- a/apps/admin_dependencies_chk/l10n/pl.php +++ /dev/null @@ -1,14 +0,0 @@ - "Moduł php-json jest wymagane przez wiele aplikacji do wewnętrznej łączności", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modude php-curl jest wymagany do pobrania tytułu strony podczas dodawania zakładki", -"The php-gd module is needed to create thumbnails of your images" => "Moduł php-gd jest wymagany do tworzenia miniatury obrazów", -"The php-ldap module is needed connect to your ldap server" => "Moduł php-ldap jest wymagany aby połączyć się z serwerem ldap", -"The php-zip module is needed download multiple files at once" => "Moduł php-zip jest wymagany aby pobrać wiele plików na raz", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Moduł php-mb_multibyte jest wymagany do poprawnego zarządzania kodowaniem.", -"The php-ctype module is needed validate data." => "Moduł php-ctype jest wymagany do sprawdzania poprawności danych.", -"The php-xml module is needed to share files with webdav." => "Moduł php-xml jest wymagany do udostępniania plików przy użyciu protokołu webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Dyrektywy allow_url_fopen użytkownika php.ini powinna być ustawiona na 1 do pobierania bazy wiedzy z serwerów OCS", -"The php-pdo module is needed to store owncloud data into a database." => "Moduł php-pdo jest wymagany do przechowywania danych owncloud w bazie danych.", -"Dependencies status" => "Stan zależności", -"Used by :" => "Używane przez:" -); diff --git a/apps/admin_dependencies_chk/l10n/ru.php b/apps/admin_dependencies_chk/l10n/ru.php deleted file mode 100644 index 58e699cb48..0000000000 --- a/apps/admin_dependencies_chk/l10n/ru.php +++ /dev/null @@ -1,14 +0,0 @@ - "Модуль php-json необходим многим приложениям для внутренних связей", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Модуль php-curl необходим для получения заголовка страницы при добавлении закладок", -"The php-gd module is needed to create thumbnails of your images" => "Модуль php-gd необходим для создания уменьшенной копии для предпросмотра ваших картинок.", -"The php-ldap module is needed connect to your ldap server" => "Модуль php-ldap необходим для соединения с вашим ldap сервером", -"The php-zip module is needed download multiple files at once" => "Модуль php-zip необходим для загрузки нескольких файлов за раз", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Модуль php-mb_multibyte необходим для корректного управления кодировками.", -"The php-ctype module is needed validate data." => "Модуль php-ctype необходим для проверки данных.", -"The php-xml module is needed to share files with webdav." => "Модуль php-xml необходим для открытия файлов через webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Директива allow_url_fopen в файле php.ini должна быть установлена в 1 для получения базы знаний с серверов OCS", -"The php-pdo module is needed to store owncloud data into a database." => "Модуль php-pdo необходим для хранения данных ownСloud в базе данных.", -"Dependencies status" => "Статус зависимостей", -"Used by :" => "Используется:" -); diff --git a/apps/admin_dependencies_chk/l10n/sl.php b/apps/admin_dependencies_chk/l10n/sl.php deleted file mode 100644 index 0d36aa379c..0000000000 --- a/apps/admin_dependencies_chk/l10n/sl.php +++ /dev/null @@ -1,14 +0,0 @@ - "Modul php-json je potreben za medsebojno komunikacijo veliko aplikacij.", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modul php-curl je potreben za pridobivanje naslova strani pri dodajanju zaznamkov.", -"The php-gd module is needed to create thumbnails of your images" => "Modul php-gd je potreben za ustvarjanje sličic za predogled.", -"The php-ldap module is needed connect to your ldap server" => "Modul php-ldap je potreben za povezavo z vašim ldap strežnikom.", -"The php-zip module is needed download multiple files at once" => "Modul php-zip je potreben za prenašanje večih datotek hkrati.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modul php-mb_multibyte je potreben za pravilno upravljanje kodiranja.", -"The php-ctype module is needed validate data." => "Modul php-ctype je potreben za preverjanje veljavnosti podatkov.", -"The php-xml module is needed to share files with webdav." => "Modul php-xml je potreben za izmenjavo datotek preko protokola WebDAV.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Direktiva allow_url_fopen v vaši php.ini datoteki mora biti nastavljena na 1, če želite omogočiti dostop do zbirke znanja na strežnikih OCS.", -"The php-pdo module is needed to store owncloud data into a database." => "Modul php-pdo je potreben za shranjevanje ownCloud podatkov v podatkovno zbirko.", -"Dependencies status" => "Stanje odvisnosti", -"Used by :" => "Uporablja:" -); diff --git a/apps/admin_dependencies_chk/l10n/sv.php b/apps/admin_dependencies_chk/l10n/sv.php deleted file mode 100644 index 07868f3c03..0000000000 --- a/apps/admin_dependencies_chk/l10n/sv.php +++ /dev/null @@ -1,14 +0,0 @@ - "Modulen php-json behövs av många applikationer som interagerar.", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modulen php-curl behövs för att hämta sidans titel när du lägger till bokmärken.", -"The php-gd module is needed to create thumbnails of your images" => "Modulen php-gd behövs för att skapa miniatyrer av dina bilder.", -"The php-ldap module is needed connect to your ldap server" => "Modulen php-ldap behövs för att ansluta mot din ldapserver.", -"The php-zip module is needed download multiple files at once" => "Modulen php-zip behövs för att kunna ladda ner flera filer på en gång.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modulen php-mb_multibyte behövs för att hantera korrekt teckenkodning.", -"The php-ctype module is needed validate data." => "Modulen php-ctype behövs för att validera data.", -"The php-xml module is needed to share files with webdav." => "Modulen php-xml behövs för att kunna dela filer med webdav.", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Direktivet allow_url_fopen i php.ini bör sättas till 1 för att kunna hämta kunskapsbasen från OCS-servrar.", -"The php-pdo module is needed to store owncloud data into a database." => "Modulen php-pdo behövs för att kunna lagra ownCloud data i en databas.", -"Dependencies status" => "Beroenden status", -"Used by :" => "Används av:" -); diff --git a/apps/admin_dependencies_chk/l10n/th_TH.php b/apps/admin_dependencies_chk/l10n/th_TH.php deleted file mode 100644 index 01d5c36366..0000000000 --- a/apps/admin_dependencies_chk/l10n/th_TH.php +++ /dev/null @@ -1,14 +0,0 @@ - "โมดูล php-json จำเป็นต้องใช้สำหรับแอพพลิเคชั่นหลายๆตัวเพื่อการเชื่อมต่อสากล", -"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "โมดูล php-curl จำเป็นต้องใช้สำหรับดึงข้อมูลชื่อหัวเว็บเมื่อเพิ่มเข้าไปยังรายการโปรด", -"The php-gd module is needed to create thumbnails of your images" => "โมดูล php-gd จำเป็นต้องใช้สำหรับสร้างรูปภาพขนาดย่อของรูปภาพของคุณ", -"The php-ldap module is needed connect to your ldap server" => "โมดูล php-ldap จำเป็นต้องใช้สำหรับการเชื่อมต่อกับเซิร์ฟเวอร์ ldap ของคุณ", -"The php-zip module is needed download multiple files at once" => "โมดูล php-zip จำเป็นต้องใช้สำหรับดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์ในครั้งเดียว", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "โมดูล php-mb_multibyte จำเป็นต้องใช้สำหรับการจัดการการแปลงรหัสไฟล์อย่างถูกต้อง", -"The php-ctype module is needed validate data." => "โมดูล php-ctype จำเป็นต้องใช้สำหรับตรวจสอบความถูกต้องของข้อมูล", -"The php-xml module is needed to share files with webdav." => "โมดูล php-xml จำเป็นต้องใช้สำหรับแชร์ไฟล์ด้วย webdav", -"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "คำสั่ง allow_url_fopen ที่อยู่ในไฟล์ php.ini ของคุณ ควรกำหนดเป็น 1 เพื่อดึงข้อมูลของฐานความรู้ต่างๆจากเซิร์ฟเวอร์ของ OCS", -"The php-pdo module is needed to store owncloud data into a database." => "โมดูล php-pdo จำเป็นต้องใช้สำหรับจัดเก็บข้อมูลใน owncloud เข้าไปไว้ยังฐานข้อมูล", -"Dependencies status" => "สถานะการอ้างอิง", -"Used by :" => "ใช้งานโดย:" -); diff --git a/apps/admin_dependencies_chk/settings.php b/apps/admin_dependencies_chk/settings.php deleted file mode 100644 index 4e0803f791..0000000000 --- a/apps/admin_dependencies_chk/settings.php +++ /dev/null @@ -1,102 +0,0 @@ -. - * - */ -$l=OC_L10N::get('admin_dependencies_chk'); -$tmpl = new OCP\Template( 'admin_dependencies_chk', 'settings'); - -$modules = array(); - -//Possible status are : ok, error, warning -$modules[] =array( - 'status' => function_exists('json_encode') ? 'ok' : 'error', - 'part'=> 'php-json', - 'modules'=> array('core'), - 'message'=> $l->t('The php-json module is needed by the many applications for inter communications')); - -$modules[] =array( - 'status' => function_exists('curl_init') ? 'ok' : 'error', - 'part'=> 'php-curl', - 'modules'=> array('bookmarks'), - 'message'=> $l->t('The php-curl modude is needed to fetch the page title when adding a bookmarks')); - -$modules[] =array( - 'status' => function_exists('imagepng') ? 'ok' : 'error', - 'part'=> 'php-gd', - 'modules'=> array('gallery'), - 'message'=> $l->t('The php-gd module is needed to create thumbnails of your images')); - -$modules[] =array( - 'status' => function_exists("ldap_bind") ? 'ok' : 'error', - 'part'=> 'php-ldap', - 'modules'=> array('user_ldap'), - 'message'=> $l->t('The php-ldap module is needed connect to your ldap server')); - -$modules[] =array( - 'status' => class_exists('ZipArchive') ? 'ok' : 'warning', - 'part'=> 'php-zip', - 'modules'=> array('admin_export','core'), - 'message'=> $l->t('The php-zip module is needed download multiple files at once')); - -$modules[] =array( - 'status' => function_exists('mb_detect_encoding') ? 'ok' : 'error', - 'part'=> 'php-mb_multibyte ', - 'modules'=> array('core'), - 'message'=> $l->t('The php-mb_multibyte module is needed to manage correctly the encoding.')); - -$modules[] =array( - 'status' => function_exists('ctype_digit') ? 'ok' : 'error', - 'part'=> 'php-ctype', - 'modules'=> array('core'), - 'message'=> $l->t('The php-ctype module is needed validate data.')); - -$modules[] =array( - 'status' => class_exists('DOMDocument') ? 'ok' : 'error', - 'part'=> 'php-xml', - 'modules'=> array('core'), - 'message'=> $l->t('The php-xml module is needed to share files with webdav.')); - -$modules[] =array( - 'status' => ini_get('allow_url_fopen') == '1' ? 'ok' : 'error', - 'part'=> 'allow_url_fopen', - 'modules'=> array('core'), - 'message'=> $l->t('The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers')); - -$modules[] =array( - 'status' => class_exists('PDO') ? 'ok' : 'warning', - 'part'=> 'php-pdo', - 'modules'=> array('core'), - 'message'=> $l->t('The php-pdo module is needed to store owncloud data into a database.')); - -foreach($modules as $key => $module) { - $enabled = false ; - foreach($module['modules'] as $app) { - if(OCP\App::isEnabled($app) || $app=='core'){ - $enabled = true; - } - } - if($enabled == false) unset($modules[$key]); -} - -OCP\UTIL::addStyle('admin_dependencies_chk', 'style'); -$tmpl->assign( 'items', $modules ); - -return $tmpl->fetchPage(); diff --git a/apps/admin_dependencies_chk/templates/settings.php b/apps/admin_dependencies_chk/templates/settings.php deleted file mode 100644 index 8ff27ebb18..0000000000 --- a/apps/admin_dependencies_chk/templates/settings.php +++ /dev/null @@ -1,16 +0,0 @@ -
- t('Dependencies status');?> - -
\ No newline at end of file diff --git a/apps/admin_migrate/appinfo/app.php b/apps/admin_migrate/appinfo/app.php deleted file mode 100644 index 7a12a32856..0000000000 --- a/apps/admin_migrate/appinfo/app.php +++ /dev/null @@ -1,33 +0,0 @@ -. -* -*/ - - -OCP\App::registerAdmin('admin_migrate','settings'); - -// add settings page to navigation -$entry = array( - 'id' => "admin_migrate_settings", - 'order'=>1, - 'href' => OCP\Util::linkTo( "admin_migrate", "settings.php" ), - 'name' => 'Export' -); diff --git a/apps/admin_migrate/appinfo/info.xml b/apps/admin_migrate/appinfo/info.xml deleted file mode 100644 index f48c666ffe..0000000000 --- a/apps/admin_migrate/appinfo/info.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - admin_migrate - ownCloud Instance Migration - Import/Export your owncloud instance - AGPL - Thomas Schmidt and Tom Needham - 4 - true - - diff --git a/apps/admin_migrate/appinfo/version b/apps/admin_migrate/appinfo/version deleted file mode 100644 index ceab6e11ec..0000000000 --- a/apps/admin_migrate/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/apps/admin_migrate/l10n/.gitkeep b/apps/admin_migrate/l10n/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/admin_migrate/l10n/ca.php b/apps/admin_migrate/l10n/ca.php deleted file mode 100644 index 8743b39760..0000000000 --- a/apps/admin_migrate/l10n/ca.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exporta aquesta instància de ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Això crearà un fitxer comprimit amb les dades d'aquesta instància ownCloud.\n Escolliu el tipus d'exportació:", -"Export" => "Exporta" -); diff --git a/apps/admin_migrate/l10n/cs_CZ.php b/apps/admin_migrate/l10n/cs_CZ.php deleted file mode 100644 index 0dc1a61d5d..0000000000 --- a/apps/admin_migrate/l10n/cs_CZ.php +++ /dev/null @@ -1,5 +0,0 @@ - "Export této instance ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Bude vytvořen komprimovaný soubor obsahující data této instance ownCloud.⏎ Zvolte typ exportu:", -"Export" => "Export" -); diff --git a/apps/admin_migrate/l10n/da.php b/apps/admin_migrate/l10n/da.php deleted file mode 100644 index a33635cdc1..0000000000 --- a/apps/admin_migrate/l10n/da.php +++ /dev/null @@ -1,4 +0,0 @@ - "Eksporter ownCloud instans", -"Export" => "Eksporter" -); diff --git a/apps/admin_migrate/l10n/de.php b/apps/admin_migrate/l10n/de.php deleted file mode 100644 index d42179b75a..0000000000 --- a/apps/admin_migrate/l10n/de.php +++ /dev/null @@ -1,5 +0,0 @@ - "Diese ownCloud-Instanz exportieren.", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Dies wird eine komprimierte Datei erzeugen, welche die Daten dieser ownCloud-Instanz enthält.\n Bitte wählen Sie den Exporttyp:", -"Export" => "Exportieren" -); diff --git a/apps/admin_migrate/l10n/el.php b/apps/admin_migrate/l10n/el.php deleted file mode 100644 index 95034c46a4..0000000000 --- a/apps/admin_migrate/l10n/el.php +++ /dev/null @@ -1,4 +0,0 @@ - "Αυτό θα δημιουργήσει ένα συμπιεσμένο αρχείο που θα περιέχει τα δεδομένα από αυτό το ownCloud.\n Παρακαλώ επιλέξτε τον τύπο εξαγωγής:", -"Export" => "Εξαγωγή" -); diff --git a/apps/admin_migrate/l10n/eo.php b/apps/admin_migrate/l10n/eo.php deleted file mode 100644 index a37be76425..0000000000 --- a/apps/admin_migrate/l10n/eo.php +++ /dev/null @@ -1,5 +0,0 @@ - "Malenporti ĉi tiun aperon de ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Ĉi tio kreos densigitan dosieron, kiu enhavos la datumojn de ĉi tiu apero de ownCloud.\nBonvolu elekti la tipon de malenportado:", -"Export" => "Malenporti" -); diff --git a/apps/admin_migrate/l10n/es.php b/apps/admin_migrate/l10n/es.php deleted file mode 100644 index cb6699b1d9..0000000000 --- a/apps/admin_migrate/l10n/es.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exportar esta instancia de ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Se creará un archivo comprimido que contendrá los datos de esta instancia de owncloud.\n Por favor elegir el tipo de exportación:", -"Export" => "Exportar" -); diff --git a/apps/admin_migrate/l10n/et_EE.php b/apps/admin_migrate/l10n/et_EE.php deleted file mode 100644 index ee92f9fe21..0000000000 --- a/apps/admin_migrate/l10n/et_EE.php +++ /dev/null @@ -1,5 +0,0 @@ - "Ekspordi see ownCloudi paigaldus", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "See loob pakitud faili, milles on sinu owncloudi paigalduse andmed.\n Palun vali eksporditava faili tüüp:", -"Export" => "Ekspordi" -); diff --git a/apps/admin_migrate/l10n/fi_FI.php b/apps/admin_migrate/l10n/fi_FI.php deleted file mode 100644 index 2484eab7d3..0000000000 --- a/apps/admin_migrate/l10n/fi_FI.php +++ /dev/null @@ -1,4 +0,0 @@ - "Vie tämä ownCloud-istanssi", -"Export" => "Vie" -); diff --git a/apps/admin_migrate/l10n/fr.php b/apps/admin_migrate/l10n/fr.php deleted file mode 100644 index 0cf0a444b0..0000000000 --- a/apps/admin_migrate/l10n/fr.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exporter cette instance ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Ceci va créer une archive compressée contenant les données de cette instance ownCloud.\n Veuillez choisir le type d'export :", -"Export" => "Exporter" -); diff --git a/apps/admin_migrate/l10n/gl.php b/apps/admin_migrate/l10n/gl.php deleted file mode 100644 index 9d18e13493..0000000000 --- a/apps/admin_migrate/l10n/gl.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exporta esta instancia de ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Esto creará un ficheiro comprimido que contén os datos de esta instancia de ownCloud.\nPor favor escolla o modo de exportación:", -"Export" => "Exportar" -); diff --git a/apps/admin_migrate/l10n/it.php b/apps/admin_migrate/l10n/it.php deleted file mode 100644 index 94ba191ba6..0000000000 --- a/apps/admin_migrate/l10n/it.php +++ /dev/null @@ -1,5 +0,0 @@ - "Esporta questa istanza di ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Questa operazione creerà un file compresso che contiene i dati dell'istanza di ownCloud. Scegli il tipo di esportazione:", -"Export" => "Esporta" -); diff --git a/apps/admin_migrate/l10n/ja_JP.php b/apps/admin_migrate/l10n/ja_JP.php deleted file mode 100644 index f8e5944a6a..0000000000 --- a/apps/admin_migrate/l10n/ja_JP.php +++ /dev/null @@ -1,5 +0,0 @@ - "ownCloudをエクスポート", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "このownCloudのデータを含む圧縮ファイルを生成します。\nエクスポートの種類を選択してください:", -"Export" => "エクスポート" -); diff --git a/apps/admin_migrate/l10n/lt_LT.php b/apps/admin_migrate/l10n/lt_LT.php deleted file mode 100644 index f78263da75..0000000000 --- a/apps/admin_migrate/l10n/lt_LT.php +++ /dev/null @@ -1,5 +0,0 @@ - "Eksportuoti šią ownCloud instaliaciją", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Bus sukurtas archyvas su visais owncloud duomenimis ir failais.\n Pasirinkite eksportavimo tipą:", -"Export" => "Eksportuoti" -); diff --git a/apps/admin_migrate/l10n/nb_NO.php b/apps/admin_migrate/l10n/nb_NO.php deleted file mode 100644 index 31f4c030bd..0000000000 --- a/apps/admin_migrate/l10n/nb_NO.php +++ /dev/null @@ -1,5 +0,0 @@ - "Eksporter denne ownCloud forekomsten", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Dette vil opprette en komprimert fil som inneholder dataene fra denne ownCloud forekomsten.⏎ Vennligst velg eksporttype:", -"Export" => "Eksport" -); diff --git a/apps/admin_migrate/l10n/nl.php b/apps/admin_migrate/l10n/nl.php deleted file mode 100644 index d1a7372c10..0000000000 --- a/apps/admin_migrate/l10n/nl.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exporteer deze ownCloud instantie", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Dit maakt een gecomprimeerd bestand, met de inhoud van deze ownCloud instantie. Kies het export type:", -"Export" => "Exporteer" -); diff --git a/apps/admin_migrate/l10n/pl.php b/apps/admin_migrate/l10n/pl.php deleted file mode 100644 index 292601daa2..0000000000 --- a/apps/admin_migrate/l10n/pl.php +++ /dev/null @@ -1,5 +0,0 @@ - "Eksportuj instancję ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Spowoduje to utworzenie pliku skompresowanego, który zawiera dane tej instancji ownCloud.⏎ proszę wybrać typ eksportu:", -"Export" => "Eksport" -); diff --git a/apps/admin_migrate/l10n/ru.php b/apps/admin_migrate/l10n/ru.php deleted file mode 100644 index c862657580..0000000000 --- a/apps/admin_migrate/l10n/ru.php +++ /dev/null @@ -1,5 +0,0 @@ - "Экспортировать этот экземпляр ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Будет создан сжатый файл, содержащий данные этого экземпляра owncloud.\n Выберите тип экспорта:", -"Export" => "Экспорт" -); diff --git a/apps/admin_migrate/l10n/sl.php b/apps/admin_migrate/l10n/sl.php deleted file mode 100644 index b8d1118bfe..0000000000 --- a/apps/admin_migrate/l10n/sl.php +++ /dev/null @@ -1,5 +0,0 @@ - "Izvozi to ownCloud namestitev", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Ustvarjena bo stisnjena datoteka s podatki te ownCloud namestitve.\n Prosimo, če izberete vrsto izvoza:", -"Export" => "Izvozi" -); diff --git a/apps/admin_migrate/l10n/sv.php b/apps/admin_migrate/l10n/sv.php deleted file mode 100644 index 57866e897e..0000000000 --- a/apps/admin_migrate/l10n/sv.php +++ /dev/null @@ -1,5 +0,0 @@ - "Exportera denna instans av ownCloud", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Detta kommer att skapa en komprimerad fil som innehåller all data från denna instans av ownCloud.\n Välj exporttyp:", -"Export" => "Exportera" -); diff --git a/apps/admin_migrate/l10n/th_TH.php b/apps/admin_migrate/l10n/th_TH.php deleted file mode 100644 index 9dfaca15b5..0000000000 --- a/apps/admin_migrate/l10n/th_TH.php +++ /dev/null @@ -1,5 +0,0 @@ - "ส่งออกข้อมูลค่าสมมุติของ ownCloud นี้", -"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "ส่วนนี้จะเป็นการสร้างไฟล์บีบอัดที่บรรจุข้อมูลค่าสมมุติของ ownCloud.\n กรุณาเลือกชนิดของการส่งออกข้อมูล:", -"Export" => "ส่งออก" -); diff --git a/apps/admin_migrate/settings.php b/apps/admin_migrate/settings.php deleted file mode 100644 index daa56390af..0000000000 --- a/apps/admin_migrate/settings.php +++ /dev/null @@ -1,57 +0,0 @@ -. - * - */ -OCP\User::checkAdminUser(); -OCP\App::checkAppEnabled('admin_migrate'); - -// Export? -if (isset($_POST['admin_export'])) { - // Create the export zip - $response = json_decode( OC_Migrate::export( null, $_POST['export_type'] ) ); - if( !$response->success ){ - // Error - die('error'); - } else { - $path = $response->data; - // Download it - header("Content-Type: application/zip"); - header("Content-Disposition: attachment; filename=" . basename($path)); - header("Content-Length: " . filesize($path)); - @ob_end_clean(); - readfile( $path ); - unlink( $path ); - } -// Import? -} else if( isset($_POST['admin_import']) ){ - $from = $_FILES['owncloud_import']['tmp_name']; - - if( !OC_Migrate::import( $from, 'instance' ) ){ - die('failed'); - } - -} else { -// fill template - $tmpl = new OCP\Template('admin_migrate', 'settings'); - return $tmpl->fetchPage(); -} \ No newline at end of file diff --git a/apps/admin_migrate/templates/settings.php b/apps/admin_migrate/templates/settings.php deleted file mode 100644 index f81c9199ec..0000000000 --- a/apps/admin_migrate/templates/settings.php +++ /dev/null @@ -1,31 +0,0 @@ -
-
- t('Export this ownCloud instance');?> -

t('This will create a compressed file that contains the data of this owncloud instance. - Please choose the export type:');?> -

-

What would you like to export?

-

- ownCloud instance (suitable for import )
- ownCloud system files
- Just user files
- -

-
- -
-
- t('Import an ownCloud instance. THIS WILL DELETE ALL CURRENT OWNCLOUD DATA');?> -

t('All current ownCloud data will be replaced by the ownCloud instance that is uploaded.');?> -

-

-

- -
-
- diff --git a/apps/bookmarks/addBm.php b/apps/bookmarks/addBm.php deleted file mode 100644 index 4df93c8b05..0000000000 --- a/apps/bookmarks/addBm.php +++ /dev/null @@ -1,33 +0,0 @@ -. -* -*/ - - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('bookmarks'); - -require_once('bookmarksHelper.php'); -addBookmark($_GET['url'], '', 'Read-Later'); - -include 'templates/addBm.php'; diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php deleted file mode 100644 index baf3a288c1..0000000000 --- a/apps/bookmarks/ajax/addBookmark.php +++ /dev/null @@ -1,37 +0,0 @@ -. -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); - -require_once(OC_App::getAppPath('bookmarks').'/bookmarksHelper.php'); -$id = addBookmark($_POST['url'], $_POST['title'], $_POST['tags']); -OCP\JSON::success(array('data' => $id)); diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php deleted file mode 100644 index 26437ea0c8..0000000000 --- a/apps/bookmarks/ajax/delBookmark.php +++ /dev/null @@ -1,37 +0,0 @@ -. -* -*/ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -if (!OC_Bookmarks_Bookmarks::deleteUrl($id)){ - OC_JSON::error(); - exit(); -} - -OCP\JSON::success(); diff --git a/apps/bookmarks/ajax/editBookmark.php b/apps/bookmarks/ajax/editBookmark.php deleted file mode 100644 index 617021e412..0000000000 --- a/apps/bookmarks/ajax/editBookmark.php +++ /dev/null @@ -1,90 +0,0 @@ - -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see . -* -*/ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); - -$CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); -if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_ut = "strftime('%s','now')"; -} elseif($CONFIG_DBTYPE == 'pgsql') { - $_ut = 'date_part(\'epoch\',now())::integer'; -} elseif($CONFIG_DBTYPE == 'oci') { - $_ut = '(oracletime - to_date(\'19700101\',\'YYYYMMDD\')) * 86400'; -} else { - $_ut = "UNIX_TIMESTAMP()"; -} - -$bookmark_id = (int)$_POST["id"]; -$user_id = OCP\USER::getUser(); - -//TODO check using CURRENT_TIMESTAMP? prepare already does magic when using now() -$query = OCP\DB::prepare(' - UPDATE `*PREFIX*bookmarks` - SET `url` = ?, `title` = ?, `lastmodified` = '.$_ut.' - WHERE `id` = ? - AND `user_id` = ? - '); - -$params=array( - htmlspecialchars_decode($_POST["url"]), - htmlspecialchars_decode($_POST["title"]), - $bookmark_id, - $user_id, - ); - -$result = $query->execute($params); - -# Abort the operation if bookmark couldn't be set (probably because the user is not allowed to edit this bookmark) -if ($result->numRows() == 0) exit(); - -# Remove old tags and insert new ones. -$query = OCP\DB::prepare(' - DELETE FROM `*PREFIX*bookmarks_tags` - WHERE `bookmark_id` = ? - '); - -$params=array( - $bookmark_id - ); - -$query->execute($params); - -$query = OCP\DB::prepare(' - INSERT INTO `*PREFIX*bookmarks_tags` - (`bookmark_id`, `tag`) - VALUES (?, ?) - '); - -$tags = explode(' ', urldecode($_POST["tags"])); -foreach ($tags as $tag) { - if(empty($tag)) { - //avoid saving blankspaces - continue; - } - $params = array($bookmark_id, trim($tag)); - $query->execute($params); -} diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php deleted file mode 100644 index 785056dc11..0000000000 --- a/apps/bookmarks/ajax/recordClick.php +++ /dev/null @@ -1,39 +0,0 @@ -. -* -*/ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('bookmarks'); - -$query = OCP\DB::prepare(' - UPDATE `*PREFIX*bookmarks` - SET `clickcount` = `clickcount` + 1 - WHERE `user_id` = ? - AND `url` LIKE ? - '); - -$params=array(OCP\USER::getUser(), htmlspecialchars_decode($_POST["url"])); -$bookmarks = $query->execute($params); - -header( "HTTP/1.1 204 No Content" ); - diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php deleted file mode 100644 index cf9a2cf918..0000000000 --- a/apps/bookmarks/ajax/updateList.php +++ /dev/null @@ -1,45 +0,0 @@ - -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see . -* -*/ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('bookmarks'); - - -//Filter for tag? -$filterTag = isset($_POST['tag']) ? htmlspecialchars_decode($_POST['tag']) : false; - -$offset = isset($_POST['page']) ? intval($_POST['page']) * 10 : 0; - -$sort = isset($_POST['sort']) ? ($_POST['sort']) : 'bookmarks_sorting_recent'; -if($sort == 'bookmarks_sorting_clicks') { - $sqlSortColumn = 'clickcount'; -} else { - $sqlSortColumn = 'id'; -} - - -$bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $filterTag, true); - -OCP\JSON::success(array('data' => $bookmarks)); diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php deleted file mode 100644 index f4bca9df70..0000000000 --- a/apps/bookmarks/appinfo/app.php +++ /dev/null @@ -1,19 +0,0 @@ - -* Copyright (c) 2011 Arthur Schiwon -* This file is licensed under the Affero General Public License version 3 or -* later. -* See the COPYING-README file. -*/ - -OC::$CLASSPATH['OC_Bookmarks_Bookmarks'] = 'apps/bookmarks/lib/bookmarks.php'; -OC::$CLASSPATH['OC_Search_Provider_Bookmarks'] = 'apps/bookmarks/lib/search.php'; - -$l = new OC_l10n('bookmarks'); -OCP\App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OCP\Util::linkTo( 'bookmarks', 'index.php' ), 'icon' => OCP\Util::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => $l->t('Bookmarks'))); - -OCP\App::registerPersonal('bookmarks', 'settings'); -OCP\Util::addscript('bookmarks','bookmarksearch'); - -OC_Search::registerProvider('OC_Search_Provider_Bookmarks'); diff --git a/apps/bookmarks/appinfo/database.xml b/apps/bookmarks/appinfo/database.xml deleted file mode 100644 index d28857b075..0000000000 --- a/apps/bookmarks/appinfo/database.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - *dbname* - true - false - utf8 - - *dbprefix*bookmarks - - - id - integer - 1 - 0 - true - 4 - - - url - text - - true - 4096 - - - title - text - - true - 140 - - - user_id - text - - true - 64 - - - public - integer - 0 - 1 - - - added - integer - - false - true - 4 - - - lastmodified - integer - - false - true - 4 - - - clickcount - integer - 0 - true - true - 4 - - - - id - true - - id - descending - - - -
- - - *dbprefix*bookmarks_tags - - - bookmark_id - integer - 64 - - - - tag - text - - true - 255 - - - bookmark_tag - true - - bookmark_id - ascending - - - tag - ascending - - - -
-
- diff --git a/apps/bookmarks/appinfo/info.xml b/apps/bookmarks/appinfo/info.xml deleted file mode 100644 index 93510815f5..0000000000 --- a/apps/bookmarks/appinfo/info.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - bookmarks - Bookmarks - Bookmark manager for ownCloud - AGPL - Arthur Schiwon, Marvin Thomas Rabe - - 4 - true - diff --git a/apps/bookmarks/appinfo/migrate.php b/apps/bookmarks/appinfo/migrate.php deleted file mode 100644 index f14469269a..0000000000 --- a/apps/bookmarks/appinfo/migrate.php +++ /dev/null @@ -1,68 +0,0 @@ -'bookmarks', - 'matchcol'=>'user_id', - 'matchval'=>$this->uid, - 'idcol'=>'id' - ); - $ids = $this->content->copyRows( $options ); - - $options = array( - 'table'=>'bookmarks_tags', - 'matchcol'=>'bookmark_id', - 'matchval'=>$ids - ); - - // Export tags - $ids2 = $this->content->copyRows( $options ); - - // If both returned some ids then they worked - if( is_array( $ids ) && is_array( $ids2 ) ) - { - return true; - } else { - return false; - } - - } - - // Import function for bookmarks - function import( ){ - switch( $this->appinfo->version ){ - default: - // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM `bookmarks` WHERE `user_id` LIKE ?" ); - $results = $query->execute( array( $this->olduid ) ); - $idmap = array(); - while( $row = $results->fetchRow() ){ - // Import each bookmark, saving its id into the map - $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*bookmarks`(`url`, `title`, `user_id`, `public`, `added`, `lastmodified`) VALUES (?, ?, ?, ?, ?, ?)" ); - $query->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); - // Map the id - $idmap[$row['id']] = OCP\DB::insertid(); - } - // Now tags - foreach($idmap as $oldid => $newid){ - $query = $this->content->prepare( "SELECT * FROM `bookmarks_tags` WHERE `bookmark_id` LIKE ?" ); - $results = $query->execute( array( $oldid ) ); - while( $row = $results->fetchRow() ){ - // Import the tags for this bookmark, using the new bookmark id - $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*bookmarks_tags`(`bookmark_id`, `tag`) VALUES (?, ?)" ); - $query->execute( array( $newid, $row['tag'] ) ); - } - } - // All done! - break; - } - - return true; - } - -} - -// Load the provider -new OC_Migration_Provider_Bookmarks( 'bookmarks' ); \ No newline at end of file diff --git a/apps/bookmarks/appinfo/version b/apps/bookmarks/appinfo/version deleted file mode 100644 index 2f4536184b..0000000000 --- a/apps/bookmarks/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2 \ No newline at end of file diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php deleted file mode 100644 index 988042fc0e..0000000000 --- a/apps/bookmarks/bookmarksHelper.php +++ /dev/null @@ -1,130 +0,0 @@ - 0); - curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); - } else { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); - if ($mr > 0) { - $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); - - $rch = curl_copy_handle($ch); - curl_setopt($rch, CURLOPT_HEADER, true); - curl_setopt($rch, CURLOPT_NOBODY, true); - curl_setopt($rch, CURLOPT_FORBID_REUSE, false); - curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); - do { - curl_setopt($rch, CURLOPT_URL, $newurl); - $header = curl_exec($rch); - if (curl_errno($rch)) { - $code = 0; - } else { - $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); - if ($code == 301 || $code == 302) { - preg_match('/Location:(.*?)\n/', $header, $matches); - $newurl = trim(array_pop($matches)); - } else { - $code = 0; - } - } - } while ($code && --$mr); - curl_close($rch); - if (!$mr) { - if ($maxredirect === null) { - trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); - } else { - $maxredirect = 0; - } - return false; - } - curl_setopt($ch, CURLOPT_URL, $newurl); - } - } - return curl_exec($ch); -} - -function getURLMetadata($url) { - //allow only http(s) and (s)ftp - $protocols = '/^[hs]{0,1}[tf]{0,1}tp[s]{0,1}\:\/\//i'; - //if not (allowed) protocol is given, assume http - if(preg_match($protocols, $url) == 0) { - $url = 'http://' . $url; - } - $metadata['url'] = $url; - - if (!function_exists('curl_init')){ - return $metadata; - } - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $page = curl_exec_follow($ch); - curl_close($ch); - - @preg_match( "/(.*)<\/title>/si", $page, $match ); - $metadata['title'] = htmlspecialchars_decode(@$match[1]); - - return $metadata; -} - -function addBookmark($url, $title, $tags='') { - $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_ut = "strftime('%s','now')"; - } elseif($CONFIG_DBTYPE == 'pgsql') { - $_ut = 'date_part(\'epoch\',now())::integer'; - } else { - $_ut = "UNIX_TIMESTAMP()"; - } - - //FIXME: Detect when user adds a known URL - $query = OCP\DB::prepare(" - INSERT INTO `*PREFIX*bookmarks` - (`url`, `title`, `user_id`, `public`, `added`, `lastmodified`) - VALUES (?, ?, ?, 0, $_ut, $_ut) - "); - - if(empty($title)) { - $metadata = getURLMetadata($url); - if(isset($metadata['title'])) // Check for problems fetching the title - $title = $metadata['title']; - } - - if(empty($title)) { - $l = OC_L10N::get('bookmarks'); - $title = $l->t('unnamed'); - } - - $params=array( - htmlspecialchars_decode($url), - htmlspecialchars_decode($title), - OCP\USER::getUser() - ); - $query->execute($params); - - $b_id = OCP\DB::insertid('*PREFIX*bookmarks'); - - if($b_id !== false) { - $query = OCP\DB::prepare(" - INSERT INTO `*PREFIX*bookmarks_tags` - (`bookmark_id`, `tag`) - VALUES (?, ?) - "); - - $tags = explode(' ', urldecode($tags)); - foreach ($tags as $tag) { - if(empty($tag)) { - //avoid saving blankspaces - continue; - } - $params = array($b_id, trim($tag)); - $query->execute($params); - } - - return $b_id; - } -} diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css deleted file mode 100644 index a67afcd44f..0000000000 --- a/apps/bookmarks/css/bookmarks.css +++ /dev/null @@ -1,87 +0,0 @@ -#content { overflow: auto; height: 100%; } -#firstrun { width: 80%; margin: 5em auto auto auto; text-align: center; font-weight:bold; font-size:1.5em; color:#777; position: relative;} -#firstrun small { display: block; font-weight: normal; font-size: 0.5em; margin-bottom: 1.5em; } -#firstrun .button { font-size: 0.7em; } -#firstrun #selections { font-size:0.8em; font-weight: normal; width: 100%; margin: 2em auto auto auto; clear: both; } - -.bookmarks_headline { - font-size: large; - font-weight: bold; - margin-left: 2em; - padding: 2.5ex 0.5ex; -} - -.bookmarks_menu { - margin-left: 1.5em; - padding: 0.5ex; -} - -.bookmarks_list { - overflow: auto; - position: fixed; - top: 6.5em; -} - -.bookmarks_addBml { - text-decoration: underline; -} - -.bookmarks_label { - width: 7em; - display: inline-block; - text-align: right; -} - -.bookmarks_input { - width: 8em; -} - -.bookmark_actions { - position: absolute; - right: 1em; - top: 0.7em; - display: none; -} -.bookmark_actions span { margin: 0 0.4em; } -.bookmark_actions img { opacity: 0.3; } -.bookmark_actions img:hover { opacity: 1; cursor: pointer; } - -.bookmark_single { - position: relative; - padding: 0.5em 1em; - border-bottom: 1px solid #DDD; - -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; -} - -.bookmark_single:hover { - background-color:#f8f8f8 -} - -.bookmark_single:hover .bookmark_actions { - display: block; -} - -.bookmark_title { font-weight: bold; display: inline-block; margin-right: 0.8em; } -.bookmark_url { display: none; color: #999; } -.bookmark_single:hover .bookmark_url { display: inline; } -.bookmark_tags { - position: absolute; - top: 0.5em; - right: 6em; - text-align: right; -} -.bookmark_tag { - display: inline-block; - color: white; - margin: 0 0.2em; - padding: 0 0.4em; - background-color: #1D2D44; - border-radius: 0.4em; - opacity: 0.2; -} -.bookmark_tag:hover { opacity: 0.5; } - -.loading_meta { - display: none; - margin-left: 5px; -} diff --git a/apps/bookmarks/img/bookmarks.png b/apps/bookmarks/img/bookmarks.png deleted file mode 100644 index 3e8eed2380..0000000000 Binary files a/apps/bookmarks/img/bookmarks.png and /dev/null differ diff --git a/apps/bookmarks/index.php b/apps/bookmarks/index.php deleted file mode 100644 index a4ce022987..0000000000 --- a/apps/bookmarks/index.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -/** -* ownCloud - bookmarks plugin -* -* @author Arthur Schiwon -* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see <http://www.gnu.org/licenses/>. -* -*/ - - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('bookmarks'); - -OCP\App::setActiveNavigationEntry( 'bookmarks_index' ); - -OCP\Util::addscript('bookmarks','bookmarks'); -OCP\Util::addStyle('bookmarks', 'bookmarks'); - -$tmpl = new OCP\Template( 'bookmarks', 'list', 'user' ); - -$tmpl->printPage(); diff --git a/apps/bookmarks/js/addBm.js b/apps/bookmarks/js/addBm.js deleted file mode 100644 index 625ac8420a..0000000000 --- a/apps/bookmarks/js/addBm.js +++ /dev/null @@ -1,16 +0,0 @@ -$(document).ready(function() { - $('#bookmark_add_submit').click(addBookmark); -}); - -function addBookmark(event) { - var url = $('#bookmark_add_url').val(); - var tags = $('#bookmark_add_tags').val(); - $.ajax({ - type: 'POST', - url: 'ajax/addBookmark.php', - data: 'url=' + encodeURI(url) + '&tags=' + encodeURI(tags), - success: function(data){ - window.close(); - } - }); -} \ No newline at end of file diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js deleted file mode 100644 index 7f3104e812..0000000000 --- a/apps/bookmarks/js/bookmarks.js +++ /dev/null @@ -1,201 +0,0 @@ -var bookmarks_page = 0; -var bookmarks_loading = false; - -var bookmarks_sorting = 'bookmarks_sorting_recent'; - -$(document).ready(function() { - $('#bookmark_add_submit').click(addOrEditBookmark); - $(window).resize(function () { - fillWindow($('.bookmarks_list')); - }); - $(window).resize(); - $('.bookmarks_list').scroll(updateOnBottom).empty().width($('#content').width()); - getBookmarks(); -}); - -function getBookmarks() { - if(bookmarks_loading) { - //have patience :) - return; - } - - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'updateList.php'), - data: 'tag=' + encodeURIComponent($('#bookmarkFilterTag').val()) + '&page=' + bookmarks_page + '&sort=' + bookmarks_sorting, - success: function(bookmarks){ - if (bookmarks.data.length) { - bookmarks_page += 1; - } - $('.bookmark_link').unbind('click', recordClick); - $('.bookmark_delete').unbind('click', delBookmark); - $('.bookmark_edit').unbind('click', showBookmark); - - for(var i in bookmarks.data) { - updateBookmarksList(bookmarks.data[i]); - $("#firstrun").hide(); - } - if($('.bookmarks_list').is(':empty')) { - $("#firstrun").show(); - } - - $('.bookmark_link').click(recordClick); - $('.bookmark_delete').click(delBookmark); - $('.bookmark_edit').click(showBookmark); - - bookmarks_loading = false; - if (bookmarks.data.length) { - updateOnBottom() - } - } - }); -} - -// function addBookmark() { -// Instead of creating editBookmark() function, Converted the one above to -// addOrEditBookmark() to make .js file more compact. - -function addOrEditBookmark(event) { - var id = $('#bookmark_add_id').val(); - var url = encodeEntities($('#bookmark_add_url').val()); - var title = encodeEntities($('#bookmark_add_title').val()); - var tags = encodeEntities($('#bookmark_add_tags').val()); - $("#firstrun").hide(); - if($.trim(url) == '') { - OC.dialogs.alert('A valid bookmark url must be provided', 'Error creating bookmark'); - return false; - } - if($.trim(title) == '') { - OC.dialogs.alert('A valid bookmark title must be provided', 'Error creating bookmark'); - return false; - } - if (id == 0) { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'addBookmark.php'), - data: 'url=' + encodeURIComponent(url) + '&title=' + encodeURIComponent(title) + '&tags=' + encodeURIComponent(tags), - success: function(response){ - $('.bookmarks_input').val(''); - $('.bookmarks_list').empty(); - bookmarks_page = 0; - getBookmarks(); - } - }); - } - else { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'editBookmark.php'), - data: 'id=' + id + '&url=' + encodeURIComponent(url) + '&title=' + encodeURIComponent(title) + '&tags=' + encodeURIComponent(tags), - success: function(){ - $('.bookmarks_input').val(''); - $('#bookmark_add_id').val('0'); - $('.bookmarks_list').empty(); - bookmarks_page = 0; - getBookmarks(); - } - }); - } - -} - -function delBookmark(event) { - var record = $(this).parent().parent(); - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'delBookmark.php'), - data: 'id=' + record.data('id'), - success: function(data){ - if (data.status == 'success') { - record.remove(); - if($('.bookmarks_list').is(':empty')) { - $("#firstrun").show(); - } - } - } - }); -} - -function showBookmark(event) { - var record = $(this).parent().parent(); - $('#bookmark_add_id').val(record.attr('data-id')); - $('#bookmark_add_url').val(record.children('.bookmark_url:first').text()); - $('#bookmark_add_title').val(record.children('.bookmark_title:first').text()); - $('#bookmark_add_tags').val(record.children('.bookmark_tags:first').text()); - - if ($('.bookmarks_add').css('display') == 'none') { - $('.bookmarks_add').slideToggle(); - } -} - -function replaceQueryString(url,param,value) { - var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i"); - if (url.match(re)) - return url.replace(re,'$1' + param + "=" + value + '$2'); - else - return url + '&' + param + "=" + value; -} - -function updateBookmarksList(bookmark) { - var tags = encodeEntities(bookmark.tags).split(' '); - var taglist = ''; - for ( var i=0, len=tags.length; i<len; ++i ){ - if(tags[i] != '') - taglist = taglist + '<a class="bookmark_tag" href="'+replaceQueryString( String(window.location), 'tag', encodeURIComponent(tags[i])) + '">' + tags[i] + '</a> '; - } - if(!hasProtocol(bookmark.url)) { - bookmark.url = 'http://' + bookmark.url; - } - if(bookmark.title == '') bookmark.title = bookmark.url; - $('.bookmarks_list').append( - '<div class="bookmark_single" data-id="' + bookmark.id +'" >' + - '<p class="bookmark_actions">' + - '<span class="bookmark_edit">' + - '<img class="svg" src="'+OC.imagePath('core', 'actions/rename')+'" title="Edit">' + - '</span>' + - '<span class="bookmark_delete">' + - '<img class="svg" src="'+OC.imagePath('core', 'actions/delete')+'" title="Delete">' + - '</span> ' + - '</p>' + - '<p class="bookmark_title">'+ - '<a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.title) + '</a>' + - '</p>' + - '<p class="bookmark_url"><a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.url) + '</a></p>' + - '</div>' - ); - if(taglist != '') { - $('div[data-id="'+ bookmark.id +'"]').append('<p class="bookmark_tags">' + taglist + '</p>'); - } -} - -function updateOnBottom() { - //check wether user is on bottom of the page - var top = $('.bookmarks_list>:last-child').position().top; - var height = $('.bookmarks_list').height(); - // use a bit of margin to begin loading before we are really at the - // bottom - if (top < height * 1.2) { - getBookmarks(); - } -} - -function recordClick(event) { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'recordClick.php'), - data: 'url=' + encodeURIComponent($(this).attr('href')), - }); -} - -function encodeEntities(s){ - try { - return $('<div/>').text(s).html(); - } catch (ex) { - return ""; - } -} - -function hasProtocol(url) { - var regexp = /(ftp|http|https|sftp)/; - return regexp.test(url); -} diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js deleted file mode 100644 index e8f5363c93..0000000000 --- a/apps/bookmarks/js/bookmarksearch.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2012 David Iwanowitsch <david at unclouded dot de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$(document).ready(function(){ - OC.search.customResults['Bookm.'] = function(row,item){ - var a=row.find('a'); - a.attr('target','_blank'); - a.click(recordClick); - } -}); - -function recordClick(event) { - var jsFileLocation = $('script[src*=bookmarksearch]').attr('src'); - jsFileLocation = jsFileLocation.replace('js/bookmarksearch.js', ''); - $.ajax({ - type: 'POST', - url: jsFileLocation + 'ajax/recordClick.php', - data: 'url=' + encodeURI($(this).attr('href')), - }); -} diff --git a/apps/bookmarks/l10n/bg_BG.php b/apps/bookmarks/l10n/bg_BG.php deleted file mode 100644 index 04d731b107..0000000000 --- a/apps/bookmarks/l10n/bg_BG.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Отметки", -"unnamed" => "неозаглавено", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Завлачете това в лентата с отметки на браузъра си и го натискайте, когато искате да отметнете бързо някоя страница:", -"Read later" => "Отмятане", -"Address" => "Адрес", -"Title" => "Заглавие", -"Tags" => "Етикети", -"Save bookmark" => "Запис на отметката", -"You have no bookmarks" => "Нямате отметки", -"Bookmarklet <br />" => "Бутон за отметки <br />" -); diff --git a/apps/bookmarks/l10n/ca.php b/apps/bookmarks/l10n/ca.php deleted file mode 100644 index cf90d9a887..0000000000 --- a/apps/bookmarks/l10n/ca.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Adreces d'interès", -"unnamed" => "sense nom", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrossegueu-ho al navegador i feu-hi un clic quan volgueu marcar ràpidament una adreça d'interès:", -"Read later" => "Llegeix més tard", -"Address" => "Adreça", -"Title" => "Títol", -"Tags" => "Etiquetes", -"Save bookmark" => "Desa l'adreça d'interès", -"You have no bookmarks" => "No teniu adreces d'interès", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/cs_CZ.php b/apps/bookmarks/l10n/cs_CZ.php deleted file mode 100644 index 2251969a26..0000000000 --- a/apps/bookmarks/l10n/cs_CZ.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Záložky", -"unnamed" => "nepojmenovaný", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Přetáhněte do Vašeho prohlížeče a kliněte, pokud si přejete rychle uložit stranu do záložek:", -"Read later" => "Přečíst později", -"Address" => "Adresa", -"Title" => "Název", -"Tags" => "Tagy", -"Save bookmark" => "Uložit záložku", -"You have no bookmarks" => "Nemáte žádné záložky", -"Bookmarklet <br />" => "Záložky <br />" -); diff --git a/apps/bookmarks/l10n/de.php b/apps/bookmarks/l10n/de.php deleted file mode 100644 index 14a54f1cce..0000000000 --- a/apps/bookmarks/l10n/de.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Lesezeichen", -"unnamed" => "unbenannt", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ziehen Sie dies zu Ihren Browser-Lesezeichen und klicken Sie darauf, wenn Sie eine Website schnell den Lesezeichen hinzufügen wollen.", -"Read later" => "Später lesen", -"Address" => "Adresse", -"Title" => "Titel", -"Tags" => "Tags", -"Save bookmark" => "Lesezeichen speichern", -"You have no bookmarks" => "Sie haben keine Lesezeichen", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/el.php b/apps/bookmarks/l10n/el.php deleted file mode 100644 index f282a1bbf8..0000000000 --- a/apps/bookmarks/l10n/el.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Σελιδοδείκτες", -"unnamed" => "ανώνυμο", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Σύρετε αυτό στους σελιδοδείκτες του περιηγητή σας και κάντε κλικ επάνω του, όταν θέλετε να προσθέσετε σύντομα μια ιστοσελίδα ως σελιδοδείκτη:", -"Read later" => "Ανάγνωση αργότερα", -"Address" => "Διεύθυνση", -"Title" => "Τίτλος", -"Tags" => "Ετικέτες", -"Save bookmark" => "Αποθήκευση σελιδοδείκτη", -"You have no bookmarks" => "Δεν έχετε σελιδοδείκτες", -"Bookmarklet <br />" => "Εφαρμογίδιο Σελιδοδεικτών <br />" -); diff --git a/apps/bookmarks/l10n/eo.php b/apps/bookmarks/l10n/eo.php deleted file mode 100644 index 808cda8a04..0000000000 --- a/apps/bookmarks/l10n/eo.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Legosignoj", -"unnamed" => "nenomita", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ŝovu tion ĉi al la legosignoj de via TTT-legilo kaj klaku ĝin, se vi volas rapide legosignigi TTT-paĝon:", -"Read later" => "Legi poste", -"Address" => "Adreso", -"Title" => "Titolo", -"Tags" => "Etikedoj", -"Save bookmark" => "Konservi legosignon", -"You have no bookmarks" => "Vi havas neniun legosignon" -); diff --git a/apps/bookmarks/l10n/es.php b/apps/bookmarks/l10n/es.php deleted file mode 100644 index 071b0dda70..0000000000 --- a/apps/bookmarks/l10n/es.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Marcadores", -"unnamed" => "sin nombre", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrastra desde aquí a los marcadores de tu navegador, y haz clic cuando quieras marcar una página web rápidamente:", -"Read later" => "Leer después", -"Address" => "Dirección", -"Title" => "Título", -"Tags" => "Etiquetas", -"Save bookmark" => "Guardar marcador", -"You have no bookmarks" => "No tienes marcadores", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/et_EE.php b/apps/bookmarks/l10n/et_EE.php deleted file mode 100644 index da9e4d92a6..0000000000 --- a/apps/bookmarks/l10n/et_EE.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Järjehoidjad", -"unnamed" => "nimetu", -"Read later" => "Loe hiljem", -"Address" => "Aadress", -"Title" => "Pealkiri", -"Tags" => "Sildid", -"Save bookmark" => "Salvesta järjehoidja", -"You have no bookmarks" => "Sul pole järjehoidjaid" -); diff --git a/apps/bookmarks/l10n/fa.php b/apps/bookmarks/l10n/fa.php deleted file mode 100644 index b46ce911d4..0000000000 --- a/apps/bookmarks/l10n/fa.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "نشانک‌ها", -"unnamed" => "بدون‌نام", -"Address" => "آدرس", -"Title" => "عنوان", -"Save bookmark" => "ذخیره نشانک", -"You have no bookmarks" => "شما هیچ نشانکی ندارید" -); diff --git a/apps/bookmarks/l10n/fi_FI.php b/apps/bookmarks/l10n/fi_FI.php deleted file mode 100644 index c814747411..0000000000 --- a/apps/bookmarks/l10n/fi_FI.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Kirjanmerkit", -"unnamed" => "nimetön", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Vedä tämä selaimesi kirjanmerkkipalkkiin ja napsauta sitä, kun haluat lisätä kirjanmerkin nopeasti:", -"Read later" => "Lue myöhemmin", -"Address" => "Osoite", -"Title" => "Otsikko", -"Tags" => "Tunnisteet", -"Save bookmark" => "Tallenna kirjanmerkki", -"You have no bookmarks" => "Sinulla ei ole kirjanmerkkejä", -"Bookmarklet <br />" => "Kirjanmerkitsin <br />" -); diff --git a/apps/bookmarks/l10n/fr.php b/apps/bookmarks/l10n/fr.php deleted file mode 100644 index 508c82369f..0000000000 --- a/apps/bookmarks/l10n/fr.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Favoris", -"unnamed" => "sans titre", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Glissez ceci dans les favoris de votre navigateur, et cliquer dessus lorsque vous souhaitez ajouter la page en cours à vos marques-pages :", -"Read later" => "Lire plus tard", -"Address" => "Adresse", -"Title" => "Titre", -"Tags" => "Étiquettes", -"Save bookmark" => "Sauvegarder le favori", -"You have no bookmarks" => "Vous n'avez aucun favori", -"Bookmarklet <br />" => "Gestionnaire de favoris <br />" -); diff --git a/apps/bookmarks/l10n/it.php b/apps/bookmarks/l10n/it.php deleted file mode 100644 index 862d75bde4..0000000000 --- a/apps/bookmarks/l10n/it.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Segnalibri", -"unnamed" => "senza nome", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Quando vuoi creare rapidamente un segnalibro, trascinalo sui segnalibri del browser e fai clic su di esso:", -"Read later" => "Leggi dopo", -"Address" => "Indirizzo", -"Title" => "Titolo", -"Tags" => "Tag", -"Save bookmark" => "Salva segnalibro", -"You have no bookmarks" => "Non hai segnalibri", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/lt_LT.php b/apps/bookmarks/l10n/lt_LT.php deleted file mode 100644 index 58faddc233..0000000000 --- a/apps/bookmarks/l10n/lt_LT.php +++ /dev/null @@ -1,3 +0,0 @@ -<?php $TRANSLATIONS = array( -"unnamed" => "be pavadinimo" -); diff --git a/apps/bookmarks/l10n/nb_NO.php b/apps/bookmarks/l10n/nb_NO.php deleted file mode 100644 index f0efeaca34..0000000000 --- a/apps/bookmarks/l10n/nb_NO.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Bokmerker", -"unnamed" => "uten navn", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Dra denne over din nettlesers bokmerker og klikk den, hvis du ønsker å hurtig legge til bokmerke for en nettside", -"Read later" => "Les senere", -"Address" => "Adresse", -"Title" => "Tittel", -"Tags" => "Etikett", -"Save bookmark" => "Lagre bokmerke", -"You have no bookmarks" => "Du har ingen bokmerker", -"Bookmarklet <br />" => "Bokmerke <br />" -); diff --git a/apps/bookmarks/l10n/nl.php b/apps/bookmarks/l10n/nl.php deleted file mode 100644 index e5e0894b51..0000000000 --- a/apps/bookmarks/l10n/nl.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Bladwijzers", -"unnamed" => "geen naam", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Sleep dit naar uw browser bladwijzers en klik erop, wanneer u een webpagina snel wilt voorzien van een bladwijzer:", -"Read later" => "Lees later", -"Address" => "Adres", -"Title" => "Titel", -"Tags" => "Tags", -"Save bookmark" => "Bewaar bookmark", -"You have no bookmarks" => "U heeft geen bookmarks" -); diff --git a/apps/bookmarks/l10n/ru.php b/apps/bookmarks/l10n/ru.php deleted file mode 100644 index 3abc089e3f..0000000000 --- a/apps/bookmarks/l10n/ru.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Закладки", -"unnamed" => "без имени", -"Read later" => "Прочитать позже", -"Address" => "Адрес", -"Title" => "Заголовок", -"Tags" => "Метки", -"Save bookmark" => "Сохранить закладки", -"You have no bookmarks" => "У вас нет закладок", -"Bookmarklet <br />" => "Букмарклет <br />" -); diff --git a/apps/bookmarks/l10n/sl.php b/apps/bookmarks/l10n/sl.php deleted file mode 100644 index 32a4162908..0000000000 --- a/apps/bookmarks/l10n/sl.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Zaznamki", -"unnamed" => "neimenovano", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Povlecite to povezavo med zaznamke v vašem brskalniku in jo, ko želite ustvariti zaznamek trenutne strani, preprosto kliknite:", -"Read later" => "Preberi kasneje", -"Address" => "Naslov", -"Title" => "Ime", -"Tags" => "Oznake", -"Save bookmark" => "Shrani zaznamek", -"You have no bookmarks" => "Nimate zaznamkov", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/sv.php b/apps/bookmarks/l10n/sv.php deleted file mode 100644 index 689bd452f1..0000000000 --- a/apps/bookmarks/l10n/sv.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "Bokmärken", -"unnamed" => "namnlös", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Dra till din webbläsares bokmärken och klicka på det när du vill bokmärka en webbsida snabbt:", -"Read later" => "Läs senare", -"Address" => "Adress", -"Title" => "Titel", -"Tags" => "Taggar", -"Save bookmark" => "Spara bokmärke", -"You have no bookmarks" => "Du har inga bokmärken", -"Bookmarklet <br />" => "Skriptbokmärke <br />" -); diff --git a/apps/bookmarks/l10n/th_TH.php b/apps/bookmarks/l10n/th_TH.php deleted file mode 100644 index 64a148efab..0000000000 --- a/apps/bookmarks/l10n/th_TH.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "รายการโปรด", -"unnamed" => "ยังไม่มีชื่อ", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "ลากสิ่งนี้ไปไว้ที่รายการโปรดในโปรแกรมบราวเซอร์ของคุณ แล้วคลิกที่นั่น, เมื่อคุณต้องการเก็บหน้าเว็บเพจเข้าไปไว้ในรายการโปรดอย่างรวดเร็ว", -"Read later" => "อ่านภายหลัง", -"Address" => "ที่อยู่", -"Title" => "ชื่อ", -"Tags" => "ป้ายกำกับ", -"Save bookmark" => "บันทึกรายการโปรด", -"You have no bookmarks" => "คุณยังไม่มีรายการโปรด", -"Bookmarklet <br />" => "Bookmarklet <br />" -); diff --git a/apps/bookmarks/l10n/xgettextfiles b/apps/bookmarks/l10n/xgettextfiles deleted file mode 100644 index cd55543239..0000000000 --- a/apps/bookmarks/l10n/xgettextfiles +++ /dev/null @@ -1,5 +0,0 @@ -../appinfo/app.php -../lib/search.php -../templates/settings.php -../templates/addBm.php -../templates/list.php diff --git a/apps/bookmarks/l10n/zh_CN.php b/apps/bookmarks/l10n/zh_CN.php deleted file mode 100644 index 0510738c97..0000000000 --- a/apps/bookmarks/l10n/zh_CN.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php $TRANSLATIONS = array( -"Bookmarks" => "书签", -"unnamed" => "未命名", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "拖曳此处到您的浏览器书签处,点击可以将网页快速添加到书签中。", -"Read later" => "稍后阅读", -"Address" => "地址", -"Title" => "标题", -"Tags" => "标签", -"Save bookmark" => "保存书签", -"You have no bookmarks" => "您暂无书签", -"Bookmarklet <br />" => "书签应用" -); diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php deleted file mode 100644 index e1e1338890..0000000000 --- a/apps/bookmarks/lib/bookmarks.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * ownCloud - bookmarks plugin - * - * @author Arthur Schiwon - * @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -/** - * This class manages bookmarks - */ -class OC_Bookmarks_Bookmarks{ - - /** - * @brief Finds all bookmarks, matching the filter - * @param offset result offset - * @param sqlSortColumn sort result with this column - * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings - * @param filterTagOnly if true, filter affacts only tags, else filter affects url, title and tags - * @return void - */ - public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){ - //OCP\Util::writeLog('bookmarks', 'findBookmarks ' .$offset. ' '.$sqlSortColumn.' '. $filter.' '. $filterTagOnly ,OCP\Util::DEBUG); - $CONFIG_DBTYPE = OCP\Config::getSystemValue( 'dbtype', 'sqlite' ); - - $params=array(OCP\USER::getUser()); - - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_gc_separator = ', \' \''; - } else { - $_gc_separator = 'SEPARATOR \' \''; - } - - if($filter){ - if($CONFIG_DBTYPE == 'pgsql' ) - $tagString = 'array_to_string(array_agg(tag), \' \')'; - else - $tagString = 'tags'; - - $sqlFilterTag = 'HAVING '; - if(is_array($filter)){ - $first = true; - $filterstring = ''; - foreach ($filter as $singleFilter){ - $filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? '; - $params[] = '%'.$singleFilter.'%'; - $first=false; - } - $sqlFilterTag = $sqlFilterTag . $filterstring; - } else{ - $sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? '; - $params[] = '%'.$filter.'%'; - } - } else { - $sqlFilterTag = ''; - } - - if($CONFIG_DBTYPE == 'pgsql' ){ - $query = OCP\DB::prepare(' - SELECT `id`, `url`, `title`, '.($filterTagOnly?'':'`url` || `title` ||').' array_to_string(array_agg(`tag`), \' \') as `tags` - FROM `*PREFIX*bookmarks` - LEFT JOIN `*PREFIX*bookmarks_tags` ON `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` - WHERE - `*PREFIX*bookmarks`.`user_id` = ? - GROUP BY `id`, `url`, `title` - '.$sqlFilterTag.' - ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC', - 10,$offset); - } else { - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ) - $concatFunction = '(url || title || '; - else - $concatFunction = 'Concat(Concat( url, title), '; - - $query = OCP\DB::prepare(' - SELECT `id`, `url`, `title`, ' - .($filterTagOnly?'':$concatFunction). - 'CASE WHEN `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` - THEN GROUP_CONCAT( `tag` ' .$_gc_separator. ' ) - ELSE \' \' - END ' - .($filterTagOnly?'':')').' - AS `tags` - FROM `*PREFIX*bookmarks` - LEFT JOIN `*PREFIX*bookmarks_tags` ON 1=1 - WHERE (`*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` - OR `*PREFIX*bookmarks`.`id` NOT IN ( - SELECT `*PREFIX*bookmarks_tags`.`bookmark_id` FROM `*PREFIX*bookmarks_tags` - ) - ) - AND `*PREFIX*bookmarks`.`user_id` = ? - GROUP BY `url` - '.$sqlFilterTag.' - ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC', - 10, $offset); - } - - $bookmarks = $query->execute($params)->fetchAll(); - return $bookmarks; - } - - public static function deleteUrl($id) - { - $user = OCP\USER::getUser(); - - $query = OCP\DB::prepare(" - SELECT `id` FROM `*PREFIX*bookmarks` - WHERE `id` = ? - AND `user_id` = ? - "); - - $result = $query->execute(array($id, $user)); - $id = $result->fetchOne(); - if ($id === false) { - return false; - } - - $query = OCP\DB::prepare(" - DELETE FROM `*PREFIX*bookmarks` - WHERE `id` = $id - "); - - $result = $query->execute(); - - $query = OCP\DB::prepare(" - DELETE FROM `*PREFIX*bookmarks_tags` - WHERE `bookmark_id` = $id - "); - - $result = $query->execute(); - return true; - } -} diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php deleted file mode 100644 index 1e6a3ce910..0000000000 --- a/apps/bookmarks/lib/search.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * ownCloud - bookmarks plugin - * - * @author David Iwanowitsch - * @copyright 2012 David Iwanowitsch <david at unclouded dot de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -class OC_Search_Provider_Bookmarks extends OC_Search_Provider{ - function search($query){ - $results=array(); - - $offset = 0; - $sqlSortColumn = 'id'; - - $searchquery=array(); - if(substr_count($query, ' ') > 0){ - $searchquery = explode(' ', $query); - }else{ - $searchquery = $query; - } - -// OCP\Util::writeLog('bookmarks', 'search ' .$query ,OCP\Util::DEBUG); - $bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $searchquery, false); -// OCP\Util::writeLog('bookmarks', 'found ' .count($bookmarks) ,OCP\Util::DEBUG); - //$l = new OC_l10n('bookmarks'); //resulttype can't be localized, javascript relies on that type - foreach($bookmarks as $bookmark){ - $results[]=new OC_Search_Result($bookmark['title'],'', $bookmark['url'],'Bookm.'); - } - - return $results; - } -} diff --git a/apps/bookmarks/settings.php b/apps/bookmarks/settings.php deleted file mode 100644 index 6db3617633..0000000000 --- a/apps/bookmarks/settings.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Marvin Thomas Rabe <mrabe@marvinrabe.de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$tmpl = new OCP\Template( 'bookmarks', 'settings'); - -return $tmpl->fetchPage(); diff --git a/apps/bookmarks/templates/addBm.php b/apps/bookmarks/templates/addBm.php deleted file mode 100644 index 357e0a18f2..0000000000 --- a/apps/bookmarks/templates/addBm.php +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>Read later - ownCloud - - -

Saved!

- Close the window - - \ No newline at end of file diff --git a/apps/bookmarks/templates/bookmarklet.php b/apps/bookmarks/templates/bookmarklet.php deleted file mode 100644 index 1802814d4b..0000000000 --- a/apps/bookmarks/templates/bookmarklet.php +++ /dev/null @@ -1,8 +0,0 @@ -' . $l->t('Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:') . '' - . '' - . $l->t('Read later') . ''; -} diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php deleted file mode 100644 index 4b84b43890..0000000000 --- a/apps/bookmarks/templates/list.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Copyright (c) 2011 Arthur Schiwon - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> - -
- - - - - -
-
-
- diff --git a/apps/bookmarks/templates/settings.php b/apps/bookmarks/templates/settings.php deleted file mode 100644 index 31edf7478b..0000000000 --- a/apps/bookmarks/templates/settings.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -
-
- t('Bookmarklet
');?>
- -
-
diff --git a/apps/calendar/ajax/cache/rescan.php b/apps/calendar/ajax/cache/rescan.php deleted file mode 100644 index 3417f1ae4b..0000000000 --- a/apps/calendar/ajax/cache/rescan.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $calendar){ - OC_Calendar_Repeat::cleancalendar($calendar['id']); - OC_Calendar_Repeat::generatecalendar($calendar['id']); -} -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/cache/status.php b/apps/calendar/ajax/cache/status.php deleted file mode 100644 index d2806d4789..0000000000 --- a/apps/calendar/ajax/cache/status.php +++ /dev/null @@ -1,22 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$allcached = true; -foreach($calendars as $calendar){ - if(!OC_Calendar_Repeat::is_calendar_cached($calendar['id'])){ - $allcached = false; - } -} -$l = new OC_L10N('calendar'); -if(!$allcached){ - OCP\JSON::error(array('message'=>'Not all calendars are completely cached', 'l10n'=>$l->t('Not all calendars are completely cached'))); -}else{ - OCP\JSON::success(array('message'=>'Everything seems to be completely cached', 'l10n'=>$l->t('Everything seems to be completely cached'))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/activation.php b/apps/calendar/ajax/calendar/activation.php deleted file mode 100644 index f4aadc5b01..0000000000 --- a/apps/calendar/ajax/calendar/activation.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$calendarid = $_POST['calendarid']; -$calendar = OC_Calendar_App::getCalendar($calendarid, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); -$calendar = OC_Calendar_App::getCalendar($calendarid); -OCP\JSON::success(array( - 'active' => $calendar['active'], - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/delete.php b/apps/calendar/ajax/calendar/delete.php deleted file mode 100644 index 089255cae3..0000000000 --- a/apps/calendar/ajax/calendar/delete.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$cal = $_POST["calendarid"]; -$calendar = OC_Calendar_App::getCalendar($cal, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$del = OC_Calendar_Calendar::deleteCalendar($cal); -if($del == true){ - OCP\JSON::success(); -}else{ - OCP\JSON::error(array('error'=>'dberror')); -} \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/edit.form.php b/apps/calendar/ajax/calendar/edit.form.php deleted file mode 100644 index 3916c52763..0000000000 --- a/apps/calendar/ajax/calendar/edit.form.php +++ /dev/null @@ -1,19 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); - -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = OC_Calendar_App::getCalendar($_POST['calendarid']); -$tmpl = new OCP\Template("calendar", "part.editcalendar"); -$tmpl->assign('new', false); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/edit.php b/apps/calendar/ajax/calendar/edit.php deleted file mode 100644 index 3f69666b58..0000000000 --- a/apps/calendar/ajax/calendar/edit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = OC_Calendar_App::getCalendar($_GET['calendarid'], true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$tmpl = new OCP\Template("calendar", "part.editcalendar"); -$tmpl->assign('new', false); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/new.form.php b/apps/calendar/ajax/calendar/new.form.php deleted file mode 100644 index 0783b6168f..0000000000 --- a/apps/calendar/ajax/calendar/new.form.php +++ /dev/null @@ -1,22 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = array( - 'id' => 'new', - 'displayname' => '', - 'calendarcolor' => '', -); -$tmpl = new OCP\Template('calendar', 'part.editcalendar'); -$tmpl->assign('new', true); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/new.php b/apps/calendar/ajax/calendar/new.php deleted file mode 100644 index 67d1282237..0000000000 --- a/apps/calendar/ajax/calendar/new.php +++ /dev/null @@ -1,42 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -if(trim($_POST['name']) == ''){ - OCP\JSON::error(array('message'=>'empty')); - exit; -} -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $cal){ - if($cal['displayname'] == $_POST['name']){ - OCP\JSON::error(array('message'=>'namenotavailable')); - exit; - } -} - -$userid = OCP\USER::getUser(); -$calendarid = OC_Calendar_Calendar::addCalendar($userid, strip_tags($_POST['name']), 'VEVENT,VTODO,VJOURNAL', null, 0, $_POST['color']); -OC_Calendar_Calendar::setCalendarActive($calendarid, 1); - -$calendar = OC_Calendar_Calendar::find($calendarid); -$tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); -$tmpl->assign('calendar', $calendar); -if(OC_Calendar_Share::allUsersSharedwith($calendarid, OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; -}else{ - $shared = true; -} -$tmpl->assign('shared', $shared); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); diff --git a/apps/calendar/ajax/calendar/overview.php b/apps/calendar/ajax/calendar/overview.php deleted file mode 100644 index 1d8e49ea5f..0000000000 --- a/apps/calendar/ajax/calendar/overview.php +++ /dev/null @@ -1,12 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$l10n = OC_L10N::get('calendar'); -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$output = new OCP\Template("calendar", "part.choosecalendar"); -$output -> printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/update.php b/apps/calendar/ajax/calendar/update.php deleted file mode 100644 index c09b1008c9..0000000000 --- a/apps/calendar/ajax/calendar/update.php +++ /dev/null @@ -1,49 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -if(trim($_POST['name']) == ''){ - OCP\JSON::error(array('message'=>'empty')); - exit; -} -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $cal){ - if($cal['displayname'] == $_POST['name'] && $cal['id'] != $_POST['id']){ - OCP\JSON::error(array('message'=>'namenotavailable')); - exit; - } -} - -$calendarid = $_POST['id']; -$calendar = OC_Calendar_App::getCalendar($calendarid, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -OC_Calendar_Calendar::editCalendar($calendarid, strip_tags($_POST['name']), null, null, null, $_POST['color']); -OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); - -$calendar = OC_Calendar_App::getCalendar($calendarid); -$tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); -$tmpl->assign('calendar', $calendar); -if(OC_Calendar_Share::allUsersSharedwith($calendarid, OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; -}else{ - $shared = true; -} -$tmpl->assign('shared', $shared); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); diff --git a/apps/calendar/ajax/categories/rescan.php b/apps/calendar/ajax/categories/rescan.php deleted file mode 100644 index 08c32865b6..0000000000 --- a/apps/calendar/ajax/categories/rescan.php +++ /dev/null @@ -1,43 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -foreach ($_POST as $key=>$element) { - debug('_POST: '.$key.'=>'.print_r($element, true)); -} - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('calendar','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('calendar','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); -} - -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -if(count($calendars) == 0) { - bailOut(OC_Calendar_App::$l10n->t('No calendars found.')); -} -$events = array(); -foreach($calendars as $calendar) { - $calendar_events = OC_Calendar_Object::all($calendar['id']); - $events = $events + $calendar_events; -} -if(count($events) == 0) { - bailOut(OC_Calendar_App::$l10n->t('No events found.')); -} - -OC_Calendar_App::scanCategories($events); -$categories = OC_Calendar_App::getCategoryOptions(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); \ No newline at end of file diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php deleted file mode 100644 index 819025543a..0000000000 --- a/apps/calendar/ajax/changeview.php +++ /dev/null @@ -1,21 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$view = $_POST['v']; -switch($view){ - case 'agendaWeek': - case 'month'; - case 'list': - break; - default: - OCP\JSON::error(array('message'=>'unexpected parameter: ' . $view)); - exit; -} -OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'currentview', $view); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/delete.php b/apps/calendar/ajax/event/delete.php deleted file mode 100644 index 17e45c001e..0000000000 --- a/apps/calendar/ajax/event/delete.php +++ /dev/null @@ -1,21 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$result = OC_Calendar_Object::delete($id); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/edit.form.php b/apps/calendar/ajax/event/edit.form.php deleted file mode 100644 index 2751248153..0000000000 --- a/apps/calendar/ajax/event/edit.form.php +++ /dev/null @@ -1,272 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -if(!OCP\User::isLoggedIn()) { - die(''); -} -OCP\JSON::checkAppEnabled('calendar'); - -$id = $_POST['id']; -$data = OC_Calendar_App::getEventObject($id, true, true); - -if(!$data){ - OCP\JSON::error(array('data' => array('message' => self::$l10n->t('Wrong calendar')))); - exit; -} -$access = OC_Calendar_App::getaccess($id, OC_Calendar_Share::EVENT); -$object = OC_VObject::parse($data['calendardata']); -$vevent = $object->VEVENT; - -$dtstart = $vevent->DTSTART; -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -switch($dtstart->getDateType()) { - case Sabre_VObject_Property_DateTime::UTC: - $timeOffset = $_SESSION['timezone']*60; - $newDT = $dtstart->getDateTime(); - $newDT->add(new DateInterval("PT" . $timeOffset . "M")); - $dtstart->setDateTime($newDT); - $newDT = $dtend->getDateTime(); - $newDT->add(new DateInterval("PT" . $timeOffset . "M")); - $dtend->setDateTime($newDT); - case Sabre_VObject_Property_DateTime::LOCALTZ: - case Sabre_VObject_Property_DateTime::LOCAL: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = $dtstart->getDateTime()->format('H:i'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = $dtend->getDateTime()->format('H:i'); - $allday = false; - break; - case Sabre_VObject_Property_DateTime::DATE: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = ''; - $dtend->getDateTime()->modify('-1 day'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = ''; - $allday = true; - break; -} - -$summary = $vevent->getAsString('SUMMARY'); -$location = $vevent->getAsString('LOCATION'); -$categories = $vevent->getAsString('CATEGORIES'); -$description = $vevent->getAsString('DESCRIPTION'); -$last_modified = $vevent->__get('LAST-MODIFIED'); -if ($last_modified){ - $lastmodified = $last_modified->getDateTime()->format('U'); -}else{ - $lastmodified = 0; -} -if($data['repeating'] == 1){ - $rrule = explode(';', $vevent->getAsString('RRULE')); - $rrulearr = array(); - foreach($rrule as $rule){ - list($attr, $val) = explode('=', $rule); - $rrulearr[$attr] = $val; - } - if(!isset($rrulearr['INTERVAL']) || $rrulearr['INTERVAL'] == ''){ - $rrulearr['INTERVAL'] = 1; - } - if(array_key_exists('BYDAY', $rrulearr)){ - if(substr_count($rrulearr['BYDAY'], ',') == 0){ - if(strlen($rrulearr['BYDAY']) == 2){ - $repeat['weekdays'] = array($rrulearr['BYDAY']); - }elseif(strlen($rrulearr['BYDAY']) == 3){ - $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 1); - $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 1, 2)); - }elseif(strlen($rrulearr['BYDAY']) == 4){ - $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 2); - $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 2, 2)); - } - }else{ - $byday_days = explode(',', $rrulearr['BYDAY']); - foreach($byday_days as $byday_day){ - if(strlen($byday_day) == 2){ - $repeat['weekdays'][] = $byday_day; - }elseif(strlen($byday_day) == 3){ - $repeat['weekofmonth'] = substr($byday_day , 0, 1); - $repeat['weekdays'][] = substr($byday_day , 1, 2); - }elseif(strlen($byday_day) == 4){ - $repeat['weekofmonth'] = substr($byday_day , 0, 2); - $repeat['weekdays'][] = substr($byday_day , 2, 2); - } - } - } - } - if(array_key_exists('BYMONTHDAY', $rrulearr)){ - if(substr_count($rrulearr['BYMONTHDAY'], ',') == 0){ - $repeat['bymonthday'][] = $rrulearr['BYMONTHDAY']; - }else{ - $bymonthdays = explode(',', $rrulearr['BYMONTHDAY']); - foreach($bymonthdays as $bymonthday){ - $repeat['bymonthday'][] = $bymonthday; - } - } - } - if(array_key_exists('BYYEARDAY', $rrulearr)){ - if(substr_count($rrulearr['BYYEARDAY'], ',') == 0){ - $repeat['byyearday'][] = $rrulearr['BYYEARDAY']; - }else{ - $byyeardays = explode(',', $rrulearr['BYYEARDAY']); - foreach($byyeardays as $yearday){ - $repeat['byyearday'][] = $yearday; - } - } - } - if(array_key_exists('BYWEEKNO', $rrulearr)){ - if(substr_count($rrulearr['BYWEEKNO'], ',') == 0){ - $repeat['byweekno'][] = (string) $rrulearr['BYWEEKNO']; - }else{ - $byweekno = explode(',', $rrulearr['BYWEEKNO']); - foreach($byweekno as $weekno){ - $repeat['byweekno'][] = (string) $weekno; - } - } - } - if(array_key_exists('BYMONTH', $rrulearr)){ - $months = OC_Calendar_App::getByMonthOptions(); - if(substr_count($rrulearr['BYMONTH'], ',') == 0){ - $repeat['bymonth'][] = $months[$month]; - }else{ - $bymonth = explode(',', $rrulearr['BYMONTH']); - foreach($bymonth as $month){ - $repeat['bymonth'][] = $months[$month]; - } - } - } - switch($rrulearr['FREQ']){ - case 'DAILY': - $repeat['repeat'] = 'daily'; - break; - case 'WEEKLY': - if($rrulearr['INTERVAL'] % 2 == 0){ - $repeat['repeat'] = 'biweekly'; - $rrulearr['INTERVAL'] = $rrulearr['INTERVAL'] / 2; - }elseif($rrulearr['BYDAY'] == 'MO,TU,WE,TH,FR'){ - $repeat['repeat'] = 'weekday'; - }else{ - $repeat['repeat'] = 'weekly'; - } - break; - case 'MONTHLY': - $repeat['repeat'] = 'monthly'; - if(array_key_exists('BYDAY', $rrulearr)){ - $repeat['month'] = 'weekday'; - }else{ - $repeat['month'] = 'monthday'; - } - break; - case 'YEARLY': - $repeat['repeat'] = 'yearly'; - if(array_key_exists('BYMONTH', $rrulearr)){ - $repeat['year'] = 'bydaymonth'; - }elseif(array_key_exists('BYWEEKNO', $rrulearr)){ - $repeat['year'] = 'byweekno'; - }else{ - $repeat['year'] = 'byyearday'; - } - } - $repeat['interval'] = $rrulearr['INTERVAL']; - if(array_key_exists('COUNT', $rrulearr)){ - $repeat['end'] = 'count'; - $repeat['count'] = $rrulearr['COUNT']; - }elseif(array_key_exists('UNTIL', $rrulearr)){ - $repeat['end'] = 'date'; - $endbydate_day = substr($rrulearr['UNTIL'], 6, 2); - $endbydate_month = substr($rrulearr['UNTIL'], 4, 2); - $endbydate_year = substr($rrulearr['UNTIL'], 0, 4); - $repeat['date'] = $endbydate_day . '-' . $endbydate_month . '-' . $endbydate_year; - }else{ - $repeat['end'] = 'never'; - } - if(array_key_exists('weekdays', $repeat)){ - $repeat_weekdays_ = array(); - $days = OC_Calendar_App::getWeeklyOptions(); - foreach($repeat['weekdays'] as $weekday){ - $repeat_weekdays_[] = $days[$weekday]; - } - $repeat['weekdays'] = $repeat_weekdays_; - } -}else{ - $repeat['repeat'] = 'doesnotrepeat'; -} -if($access == 'owner'){ - $calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -}else{ - $calendar_options = array(OC_Calendar_App::getCalendar($data['calendarid'], false)); -} -$category_options = OC_Calendar_App::getCategoryOptions(); -$repeat_options = OC_Calendar_App::getRepeatOptions(); -$repeat_end_options = OC_Calendar_App::getEndOptions(); -$repeat_month_options = OC_Calendar_App::getMonthOptions(); -$repeat_year_options = OC_Calendar_App::getYearOptions(); -$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions(); -$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth(); -$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions(); -$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions(); -$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions(); -$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions(); - -if($access == 'owner' || $access == 'rw'){ - $tmpl = new OCP\Template('calendar', 'part.editevent'); -}elseif($access == 'r'){ - $tmpl = new OCP\Template('calendar', 'part.showevent'); -} - -$tmpl->assign('eventid', $id); -$tmpl->assign('access', $access); -$tmpl->assign('lastmodified', $lastmodified); -$tmpl->assign('calendar_options', $calendar_options); -$tmpl->assign('repeat_options', $repeat_options); -$tmpl->assign('repeat_month_options', $repeat_month_options); -$tmpl->assign('repeat_weekly_options', $repeat_weekly_options); -$tmpl->assign('repeat_end_options', $repeat_end_options); -$tmpl->assign('repeat_year_options', $repeat_year_options); -$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options); -$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options); -$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options); -$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options); -$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options); - -$tmpl->assign('title', $summary); -$tmpl->assign('location', $location); -$tmpl->assign('categories', $categories); -$tmpl->assign('calendar', $data['calendarid']); -$tmpl->assign('allday', $allday); -$tmpl->assign('startdate', $startdate); -$tmpl->assign('starttime', $starttime); -$tmpl->assign('enddate', $enddate); -$tmpl->assign('endtime', $endtime); -$tmpl->assign('description', $description); - -$tmpl->assign('repeat', $repeat['repeat']); -if($repeat['repeat'] != 'doesnotrepeat'){ - $tmpl->assign('repeat_month', $repeat['month']); - $tmpl->assign('repeat_weekdays', $repeat['weekdays']); - $tmpl->assign('repeat_interval', $repeat['interval']); - $tmpl->assign('repeat_end', $repeat['end']); - $tmpl->assign('repeat_count', $repeat['count']); - $tmpl->assign('repeat_weekofmonth', $repeat['weekofmonth']); - $tmpl->assign('repeat_date', $repeat['date']); - $tmpl->assign('repeat_year', $repeat['year']); - $tmpl->assign('repeat_byyearday', $repeat['byyearday']); - $tmpl->assign('repeat_bymonthday', $repeat['bymonthday']); - $tmpl->assign('repeat_bymonth', $repeat['bymonth']); - $tmpl->assign('repeat_byweekno', $repeat['byweekno']); -} else { - $tmpl->assign('repeat_month', 'monthday'); - $tmpl->assign('repeat_weekdays', array()); - $tmpl->assign('repeat_interval', 1); - $tmpl->assign('repeat_end', 'never'); - $tmpl->assign('repeat_count', '10'); - $tmpl->assign('repeat_weekofmonth', 'auto'); - $tmpl->assign('repeat_date', ''); - $tmpl->assign('repeat_year', 'bydate'); -} -$tmpl->printpage(); diff --git a/apps/calendar/ajax/event/edit.php b/apps/calendar/ajax/event/edit.php deleted file mode 100644 index db78bf6e5e..0000000000 --- a/apps/calendar/ajax/event/edit.php +++ /dev/null @@ -1,46 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; - -if(!array_key_exists('calendar', $_POST)){ - $cal = OC_Calendar_Object::getCalendarid($id); - $_POST['calendar'] = $cal; -}else{ - $cal = $_POST['calendar']; -} - -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} - -$errarr = OC_Calendar_Object::validateRequest($_POST); -if($errarr){ - //show validate errors - OCP\JSON::error($errarr); - exit; -}else{ - $data = OC_Calendar_App::getEventObject($id, false, false); - $vcalendar = OC_VObject::parse($data['calendardata']); - - OC_Calendar_App::isNotModified($vcalendar->VEVENT, $_POST['lastmodified']); - OC_Calendar_Object::updateVCalendarFromRequest($_POST, $vcalendar); - - OC_Calendar_Object::edit($id, $vcalendar->serialize()); - if ($data['calendarid'] != $cal) { - OC_Calendar_Object::moveToCalendar($id, $cal); - } - OCP\JSON::success(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/event/move.php b/apps/calendar/ajax/event/move.php deleted file mode 100644 index f4e2b36376..0000000000 --- a/apps/calendar/ajax/event/move.php +++ /dev/null @@ -1,47 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$vcalendar = OC_Calendar_App::getVCalendar($id, false, false); -$vevent = $vcalendar->VEVENT; - -$allday = $_POST['allDay']; -$delta = new DateInterval('P0D'); -$delta->d = $_POST['dayDelta']; -$delta->i = $_POST['minuteDelta']; -OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']); - -$dtstart = $vevent->DTSTART; -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -$start_type = $dtstart->getDateType(); -$end_type = $dtend->getDateType(); -if ($allday && $start_type != Sabre_VObject_Property_DateTime::DATE){ - $start_type = $end_type = Sabre_VObject_Property_DateTime::DATE; - $dtend->setDateTime($dtend->getDateTime()->modify('+1 day'), $end_type); -} -if (!$allday && $start_type == Sabre_VObject_Property_DateTime::DATE){ - $start_type = $end_type = Sabre_VObject_Property_DateTime::LOCALTZ; -} -$dtstart->setDateTime($dtstart->getDateTime()->add($delta), $start_type); -$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); -unset($vevent->DURATION); - -$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); -$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - -$result = OC_Calendar_Object::edit($id, $vcalendar->serialize()); -$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime(); -OCP\JSON::success(array('lastmodified'=>(int)$lastmodified->format('U'))); \ No newline at end of file diff --git a/apps/calendar/ajax/event/new.form.php b/apps/calendar/ajax/event/new.form.php deleted file mode 100644 index db04cdf2d4..0000000000 --- a/apps/calendar/ajax/event/new.form.php +++ /dev/null @@ -1,75 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -if(!OCP\User::isLoggedIn()) { - die(''); -} -OCP\JSON::checkAppEnabled('calendar'); - -if (!isset($_POST['start'])){ - OCP\JSON::error(); - die; -} -$start = $_POST['start']; -$end = $_POST['end']; -$allday = $_POST['allday']; - -if (!$end){ - $duration = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'duration', '60'); - $end = $start + ($duration * 60); -} -$start = new DateTime('@'.$start); -$end = new DateTime('@'.$end); -$timezone = OC_Calendar_App::getTimezone(); -$start->setTimezone(new DateTimeZone($timezone)); -$end->setTimezone(new DateTimeZone($timezone)); - -$calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$repeat_options = OC_Calendar_App::getRepeatOptions(); -$repeat_end_options = OC_Calendar_App::getEndOptions(); -$repeat_month_options = OC_Calendar_App::getMonthOptions(); -$repeat_year_options = OC_Calendar_App::getYearOptions(); -$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions(); -$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth(); -$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions(); -$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions(); -$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions(); -$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions(); - -$tmpl = new OCP\Template('calendar', 'part.newevent'); -$tmpl->assign('access', 'owner'); -$tmpl->assign('calendar_options', $calendar_options); -$tmpl->assign('repeat_options', $repeat_options); -$tmpl->assign('repeat_month_options', $repeat_month_options); -$tmpl->assign('repeat_weekly_options', $repeat_weekly_options); -$tmpl->assign('repeat_end_options', $repeat_end_options); -$tmpl->assign('repeat_year_options', $repeat_year_options); -$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options); -$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options); -$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options); -$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options); -$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options); - -$tmpl->assign('eventid', 'new'); -$tmpl->assign('startdate', $start->format('d-m-Y')); -$tmpl->assign('starttime', $start->format('H:i')); -$tmpl->assign('enddate', $end->format('d-m-Y')); -$tmpl->assign('endtime', $end->format('H:i')); -$tmpl->assign('allday', $allday); -$tmpl->assign('repeat', 'doesnotrepeat'); -$tmpl->assign('repeat_month', 'monthday'); -$tmpl->assign('repeat_weekdays', array()); -$tmpl->assign('repeat_interval', 1); -$tmpl->assign('repeat_end', 'never'); -$tmpl->assign('repeat_count', '10'); -$tmpl->assign('repeat_weekofmonth', 'auto'); -$tmpl->assign('repeat_date', ''); -$tmpl->assign('repeat_year', 'bydate'); -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/new.php b/apps/calendar/ajax/event/new.php deleted file mode 100644 index bc0439cc31..0000000000 --- a/apps/calendar/ajax/event/new.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$errarr = OC_Calendar_Object::validateRequest($_POST); -if($errarr){ - //show validate errors - OCP\JSON::error($errarr); - exit; -}else{ - $cal = $_POST['calendar']; - $vcalendar = OC_Calendar_Object::createVCalendarFromRequest($_POST); - $result = OC_Calendar_Object::add($cal, $vcalendar->serialize()); - OCP\JSON::success(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/event/resize.php b/apps/calendar/ajax/event/resize.php deleted file mode 100644 index 15b687b55d..0000000000 --- a/apps/calendar/ajax/event/resize.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -$id = $_POST['id']; - -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} - -$vcalendar = OC_Calendar_App::getVCalendar($id, false, false); -$vevent = $vcalendar->VEVENT; - -$delta = new DateInterval('P0D'); -$delta->d = $_POST['dayDelta']; -$delta->i = $_POST['minuteDelta']; - -OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']); - -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -$end_type = $dtend->getDateType(); -$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); -unset($vevent->DURATION); - -$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); -$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - -OC_Calendar_Object::edit($id, $vcalendar->serialize()); -$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime(); -OCP\JSON::success(array('lastmodified'=>(int)$lastmodified->format('U'))); \ No newline at end of file diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php deleted file mode 100644 index ae55cbc02d..0000000000 --- a/apps/calendar/ajax/events.php +++ /dev/null @@ -1,30 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -session_write_close(); - -// Look for the calendar id -$calendar_id = null; -if (strval(intval($_GET['calendar_id'])) == strval($_GET['calendar_id'])) { // integer for sure. - $id = intval($_GET['calendar_id']); - $calendarrow = OC_Calendar_App::getCalendar($id, true, false); // Let's at least security check otherwise we might as well use OC_Calendar_Calendar::find() - if($calendarrow !== false && is_int($calendar_id['userid']) && $id == $calendar_id['userid']) { - $calendar_id = $id; - } -} -$calendar_id = (is_null($calendar_id)?strip_tags($_GET['calendar_id']):$calendar_id); - -$start = (version_compare(PHP_VERSION, '5.3.0', '>='))?DateTime::createFromFormat('U', $_GET['start']):new DateTime('@' . $_GET['start']); -$end = (version_compare(PHP_VERSION, '5.3.0', '>='))?DateTime::createFromFormat('U', $_GET['end']):new DateTime('@' . $_GET['end']); -$events = OC_Calendar_App::getrequestedEvents($_GET['calendar_id'], $start, $end); -$output = array(); -foreach($events as $event){ - $output = array_merge($output, OC_Calendar_App::generateEventOutput($event, $start, $end)); -} -OCP\JSON::encodedPrint(OCP\Util::sanitizeHTML($output)); diff --git a/apps/calendar/ajax/import/calendarcheck.php b/apps/calendar/ajax/import/calendarcheck.php deleted file mode 100644 index a91bab7057..0000000000 --- a/apps/calendar/ajax/import/calendarcheck.php +++ /dev/null @@ -1,18 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$calname = strip_tags($_POST['calname']); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\User::getUser()); -foreach($calendars as $calendar){ - if($calendar['displayname'] == $calname){ - OCP\JSON::success(array('message'=>'exists')); - exit; - } -} -OCP\JSON::error(); \ No newline at end of file diff --git a/apps/calendar/ajax/import/dialog.php b/apps/calendar/ajax/import/dialog.php deleted file mode 100644 index 18fe226172..0000000000 --- a/apps/calendar/ajax/import/dialog.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$tmpl = new OCP\Template('calendar', 'part.import'); -$tmpl->assign('path', $_POST['path']); -$tmpl->assign('filename', $_POST['filename']); -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/import/dropimport.php b/apps/calendar/ajax/import/dropimport.php deleted file mode 100644 index f46e731409..0000000000 --- a/apps/calendar/ajax/import/dropimport.php +++ /dev/null @@ -1,32 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$data = $_POST['data']; -$data = explode(',', $data); -$data = end($data); -$data = base64_decode($data); -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$import = new OC_Calendar_Import($data); -$import->setUserID(OCP\User::getUser()); -$import->setTimeZone(OC_Calendar_App::$tz); -$import->disableProgressCache(); -if(!$import->isValid()){ - OCP\JSON::error(); - exit; -} -$newcalendarname = strip_tags($import->createCalendarName()); -$newid = OC_Calendar_Calendar::addCalendar(OCP\User::getUser(),$newcalendarname,'VEVENT,VTODO,VJOURNAL',null,0,$import->createCalendarColor()); -$import->setCalendarID($newid); -$import->import(); -$count = $import->getCount(); -if($count == 0){ - OC_Calendar_Calendar::deleteCalendar($newid); - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('The file contained either no events or all events are already saved in your calendar.'))); -}else{ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in the new calendar') . ' ' . $newcalendarname, 'eventSource'=>OC_Calendar_Calendar::getEventSourceInfo(OC_Calendar_Calendar::find($newid)))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/import/import.php b/apps/calendar/ajax/import/import.php deleted file mode 100644 index b1dfc464d0..0000000000 --- a/apps/calendar/ajax/import/import.php +++ /dev/null @@ -1,151 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); -session_write_close(); -if (isset($_POST['progresskey']) && isset($_POST['getprogress'])) { - echo OCP\JSON::success(array('percent'=>OC_Cache::get($_POST['progresskey']))); - exit; -} -$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); -if(!$file){ - OCP\JSON::error(array('error'=>'404')); -} -$import = new OC_Calendar_Import($file); -$import->setUserID(OCP\User::getUser()); -$import->setTimeZone(OC_Calendar_App::$tz); -$import->enableProgressCache(); -$import->setProgresskey($_POST['progresskey']); -if(!$import->isValid()){ - OCP\JSON::error(array('error'=>'notvalid')); - exit; -} -$newcal = false; -if($_POST['method'] == 'new'){ - $calendars = OC_Calendar_Calendar::allCalendars(OCP\User::getUser()); - foreach($calendars as $calendar){ - if($calendar['displayname'] == $_POST['calname']){ - $id = $calendar['id']; - $newcal = false; - break; - } - $newcal = true; - } - if($newcal){ - $id = OC_Calendar_Calendar::addCalendar(OCP\USER::getUser(), strip_tags($_POST['calname']),'VEVENT,VTODO,VJOURNAL',null,0,strip_tags($_POST['calcolor'])); - OC_Calendar_Calendar::setCalendarActive($id, 1); - } -}else{ - $calendar = OC_Calendar_App::getCalendar($_POST['id']); - if($calendar['userid'] != OCP\USER::getUser()){ - OCP\JSON::error(array('error'=>'missingcalendarrights')); - exit(); - } - $id = $_POST['id']; -} -$import->setCalendarID($id); -try{ - $import->import(); -}catch (Exception $e) { - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('Import failed'), 'debug'=>$e->getMessage())); - //write some log -} -$count = $import->getCount(); -if($count == 0){ - if($newcal){ - OC_Calendar_Calendar::deleteCalendar($id); - } - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('The file contained either no events or all events are already saved in your calendar.'))); -}else{ - if($newcal){ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in the new calendar') . ' ' . strip_tags($_POST['calname']))); - }else{ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in your calendar'))); - } -} -/* //////////////////////////// Attention: following code is quite painfull !!! /////////////////////// -writeProgress('20'); -// normalize the newlines -$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file); -$lines = explode("\n", $file); -unset($file); -writeProgress('30'); -// analyze the file, group components by uid, and keep refs to originating calendar object -// $cals is array calendar objects, keys are 1st line# $cal, ie array( $cal => $caldata ) -// $caldata is array( 'first' => 1st component line#, 'last' => last comp line#, 'end' => end line# ) -// $caldata is used to create prefix/suffix strings when building import text -// $uids is array of component arrays, keys are $uid, ie array( $uid => array( $beginlineno => $component ) ) -// $component is array( 'end' => end line#, 'cal'=> $cal ) -$comp=$uid=$cal=false; -$cals=$uids=array(); -$i = 0; -foreach($lines as $line) { - - if(strpos($line, ':')!==false) { - list($attr, $val) = explode(':', strtoupper($line)); - if ($attr == 'BEGIN' && $val == 'VCALENDAR') { - $cal = $i; - $cals[$cal] = array('first'=>$i,'last'=>$i,'end'=>$i); - } elseif ($attr =='BEGIN' && $cal!==false && isset($comps[$val])) { - $comp = $val; - $beginNo = $i; - } elseif ($attr == 'END' && $cal!==false && $val == 'VCALENDAR') { - if($comp!==false) { - unset($cals[$cal]); // corrupt calendar, unset it - } else { - $cals[$cal]['end'] = $i; - } - $comp=$uid=$cal=false; // reset calendar - } elseif ($attr == 'END' && $comp!==false && $val == $comp) { - if(! $uid) { - $uid = OC_Calendar_Object::createUID(); - } - $uids[$uid][$beginNo] = array('end'=>$i, 'cal'=>$cal); - if ($cals[$cal]['first'] == $cal) { - $cals[$cal]['first'] = $beginNo; - } - $cals[$cal]['last'] = $i; - $comp=$uid=false; // reset component - } elseif ($attr =="UID" && $comp!==false) { - list($attr, $uid) = explode(':', $line); - } - } - $i++; -} -// import the calendar -writeProgress('60'); -foreach($uids as $uid) { - $prefix=$suffix=$content=array(); - foreach($uid as $begin=>$details) { - - $cal = $details['cal']; - if(!isset($cals[$cal])) { - continue; // from corrupt/incomplete calendar - } - $cdata = $cals[$cal]; - // if we have multiple components from different calendar objects, - // we should really merge their elements (enhancement?) -- 1st one wins for now. - if(! count($prefix)) { - $prefix = array_slice($lines, $cal, $cdata['first'] - $cal); - } - if(! count($suffix)) { - $suffix = array_slice($lines, $cdata['last']+1, $cdata['end'] - $cdata['last']); - } - $content = array_merge($content, array_slice($lines, $begin, $details['end'] - $begin + 1)); - } - if(count($content)) { - $import = join($nl, array_merge($prefix, $content, $suffix)) . $nl; - OC_Calendar_Object::add($id, $import); - } -} -// finished import -writeProgress('100'); -sleep(3); -OC_Cache::remove($progresskey); -OCP\JSON::success();*/ diff --git a/apps/calendar/ajax/settings/getfirstday.php b/apps/calendar/ajax/settings/getfirstday.php deleted file mode 100644 index bc995f7d6e..0000000000 --- a/apps/calendar/ajax/settings/getfirstday.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -$firstday = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'firstday', 'mo'); -OCP\JSON::encodedPrint(array('firstday' => $firstday)); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/gettimezonedetection.php b/apps/calendar/ajax/settings/gettimezonedetection.php deleted file mode 100644 index 6bc9a07a1e..0000000000 --- a/apps/calendar/ajax/settings/gettimezonedetection.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::success(array('detection' => OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection'))); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/guesstimezone.php b/apps/calendar/ajax/settings/guesstimezone.php deleted file mode 100644 index 6b6b8bef9c..0000000000 --- a/apps/calendar/ajax/settings/guesstimezone.php +++ /dev/null @@ -1,26 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); - -$l = OC_L10N::get('calendar'); - -$lat = $_POST['lat']; -$lng = $_POST['lng']; - -$timezone = OC_Geo::timezone($lat, $lng); - -if($timezone == OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezone')){ - OCP\JSON::success(); - exit; -} -OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezone', $timezone); -$message = array('message'=> $l->t('New Timezone:') . $timezone); -OCP\JSON::success($message); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/setfirstday.php b/apps/calendar/ajax/settings/setfirstday.php deleted file mode 100644 index 73cf0c19b7..0000000000 --- a/apps/calendar/ajax/settings/setfirstday.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -if(isset($_POST["firstday"])){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'firstday', $_POST["firstday"]); - OCP\JSON::success(); -}else{ - OCP\JSON::error(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/settimeformat.php b/apps/calendar/ajax/settings/settimeformat.php deleted file mode 100644 index 6136857e2f..0000000000 --- a/apps/calendar/ajax/settings/settimeformat.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -if(isset($_POST["timeformat"])){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timeformat', $_POST["timeformat"]); - OCP\JSON::success(); -}else{ - OCP\JSON::error(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/settimezone.php b/apps/calendar/ajax/settings/settimezone.php deleted file mode 100644 index 06db66d578..0000000000 --- a/apps/calendar/ajax/settings/settimezone.php +++ /dev/null @@ -1,26 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Init owncloud - - -$l=OC_L10N::get('calendar'); - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -// Get data -if( isset( $_POST['timezone'] ) ){ - $timezone=$_POST['timezone']; - OCP\Config::setUserValue( OCP\USER::getUser(), 'calendar', 'timezone', $timezone ); - OCP\JSON::success(array('data' => array( 'message' => $l->t('Timezone changed') ))); -}else{ - OCP\JSON::error(array('data' => array( 'message' => $l->t('Invalid request') ))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/timeformat.php b/apps/calendar/ajax/settings/timeformat.php deleted file mode 100644 index eebb687dfa..0000000000 --- a/apps/calendar/ajax/settings/timeformat.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -$timeformat = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'timeformat', "24"); -OCP\JSON::encodedPrint(array("timeformat" => $timeformat)); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/timezonedetection.php b/apps/calendar/ajax/settings/timezonedetection.php deleted file mode 100644 index 5f03f647b3..0000000000 --- a/apps/calendar/ajax/settings/timezonedetection.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -if(array_key_exists('timezonedetection', $_POST) && $_POST['timezonedetection'] == 'on'){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection', 'true'); -}else{ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection', 'false'); -} -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/activation.php b/apps/calendar/ajax/share/activation.php deleted file mode 100644 index bce8693577..0000000000 --- a/apps/calendar/ajax/share/activation.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$id = strip_tags($_POST['id']); -$activation = strip_tags($_POST['activation']); -OC_Calendar_Share::set_active(OCP\USER::getUser(), $id, $activation); -OCP\JSON::success(); diff --git a/apps/calendar/ajax/share/changepermission.php b/apps/calendar/ajax/share/changepermission.php deleted file mode 100644 index 5aff7666f7..0000000000 --- a/apps/calendar/ajax/share/changepermission.php +++ /dev/null @@ -1,50 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -$permission = (int) strip_tags($_POST['permission']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -} -if($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -$success = OC_Calendar_Share::changepermission($sharewith, $sharetype, $id, $permission, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/dropdown.php b/apps/calendar/ajax/share/dropdown.php deleted file mode 100644 index 86cf4ac090..0000000000 --- a/apps/calendar/ajax/share/dropdown.php +++ /dev/null @@ -1,18 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$user = OCP\USER::getUser(); -$calid = $_POST['calid']; -$calendar = OC_Calendar_Calendar::find($calid); -if($calendar['userid'] != $user){ - OCP\JSON::error(); - exit; -} -$tmpl = new OCP\Template('calendar', 'share.dropdown'); -$tmpl->assign('calid', $calid); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/share.php b/apps/calendar/ajax/share/share.php deleted file mode 100644 index 77e1ab9d65..0000000000 --- a/apps/calendar/ajax/share/share.php +++ /dev/null @@ -1,61 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexpected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexpected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -} -if($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -if($sharetype == 'user' && OCP\USER::getUser() == $sharewith){ - OCP\JSON::error(array('message'=>'you can not share with yourself')); -} -$success = OC_Calendar_Share::share(OCP\USER::getUser(), $sharewith, $sharetype, $id, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -if($success){ - if($sharetype == 'public'){ - OCP\JSON::success(array('message'=>$success)); - }else{ - OCP\JSON::success(array('message'=>'shared')); - } -}else{ - OCP\JSON::error(array('message'=>'can not share')); - exit; -} \ No newline at end of file diff --git a/apps/calendar/ajax/share/unshare.php b/apps/calendar/ajax/share/unshare.php deleted file mode 100644 index c7c0611318..0000000000 --- a/apps/calendar/ajax/share/unshare.php +++ /dev/null @@ -1,53 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -}elseif($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -$success = OC_Calendar_Share::unshare(OCP\USER::getUser(), $sharewith, $sharetype, $id, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -if($success){ - OCP\JSON::success(); -}else{ - OCP\JSON::error(array('message'=>'can not unshare')); - exit; -} \ No newline at end of file diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php deleted file mode 100644 index 0078705578..0000000000 --- a/apps/calendar/appinfo/app.php +++ /dev/null @@ -1,44 +0,0 @@ - 'calendar_index', - 'order' => 10, - 'href' => OCP\Util::linkTo( 'calendar', 'index.php' ), - 'icon' => OCP\Util::imagePath( 'calendar', 'icon.svg' ), - 'name' => $l->t('Calendar'))); -OC_Search::registerProvider('OC_Search_Provider_Calendar'); -OCP\Share::registerBackend('calendar', 'OC_Share_Backend_Calendar'); -OCP\Share::registerBackend('event', 'OC_Share_Backend_Event'); diff --git a/apps/calendar/appinfo/database.xml b/apps/calendar/appinfo/database.xml deleted file mode 100644 index 16e10010d5..0000000000 --- a/apps/calendar/appinfo/database.xml +++ /dev/null @@ -1,345 +0,0 @@ - - - - *dbname* - true - false - - utf8 - - - - *dbprefix*calendar_objects - - - - - id - integer - 0 - true - 1 - true - 4 - - - - calendarid - integer - - true - true - 4 - - - - objecttype - text - - true - 40 - - - - startdate - timestamp - CURRENT_TIMESTAMP - false - - - - enddate - timestamp - CURRENT_TIMESTAMP - false - - - - repeating - integer - - false - 4 - - - - summary - text - - false - 255 - - - - calendardata - text - false - - - - uri - text - - false - 255 - - - - lastmodified - integer - - false - 4 - - - - -
- - - - *dbprefix*calendar_calendars - - - - - id - integer - 0 - true - 1 - true - 4 - - - - userid - text - - false - 255 - - - - displayname - text - - false - 100 - - - - uri - text - - false - 255 - - - - active - integer - 1 - true - 4 - - - - ctag - integer - 0 - true - true - 4 - - - - calendarorder - integer - 0 - true - true - 4 - - - - calendarcolor - text - - false - 10 - - - - timezone - text - false - - - - components - text - - false - 100 - - - - -
- - - - *dbprefix*calendar_share_event - - - - - owner - text - true - 255 - - - - share - text - true - 255 - - - - sharetype - text - true - 6 - - - - eventid - integer - - true - true - 11 - - - - permissions - integer - true - 1 - - - - -
- - - - *dbprefix*calendar_share_calendar - - - - - owner - text - true - 255 - - - - share - text - true - 255 - - - - sharetype - text - true - 6 - - - - calendarid - integer - - true - true - 11 - - - - permissions - integer - true - 1 - - - - active - integer - 1 - true - 4 - - - - -
- - - - *dbprefix*calendar_repeat - - - - - id - integer - 0 - true - 1 - true - 4 - - - - eventid - integer - 0 - true - true - 4 - - - - calid - integer - 0 - true - true - 4 - - - - startdate - timestamp - 0000-00-00 00:00:00 - false - - - - enddate - timestamp - 0000-00-00 00:00:00 - false - - - - -
- -
diff --git a/apps/calendar/appinfo/info.xml b/apps/calendar/appinfo/info.xml deleted file mode 100644 index dde0260f07..0000000000 --- a/apps/calendar/appinfo/info.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - calendar - Calendar - AGPL - Georg Ehrke, Bart Visscher, Jakob Sack - 4 - true - Calendar with CalDAV support - - - appinfo/remote.php - appinfo/remote.php - - - share.php - share.php - - diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php deleted file mode 100644 index f499d90966..0000000000 --- a/apps/calendar/appinfo/remote.php +++ /dev/null @@ -1,46 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\App::checkAppEnabled('calendar'); - -if(substr($_SERVER["REQUEST_URI"],0,strlen(OC_App::getAppWebPath('calendar').'/caldav.php')) == OC_App::getAppWebPath('calendar'). '/caldav.php'){ - $baseuri = OC_App::getAppWebPath('calendar').'/caldav.php'; -} - -// only need authentication apps -$RUNTIME_APPTYPES=array('authentication'); -OC_App::loadApps($RUNTIME_APPTYPES); - -// Backends -$authBackend = new OC_Connector_Sabre_Auth(); -$principalBackend = new OC_Connector_Sabre_Principal(); -$caldavBackend = new OC_Connector_Sabre_CalDAV(); - -// Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); -$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening - -$calendarRoot = new OC_Connector_Sabre_CalDAV_CalendarRoot($principalBackend, $caldavBackend); -$calendarRoot->disableListing = true; // Disable listening - -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $calendarRoot, - ); - -// Fire up server -$server = new Sabre_DAV_Server($nodes); -$server->setBaseUri($baseuri); -// Add plugins -$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); -$server->addPlugin(new Sabre_CalDAV_Plugin()); -$server->addPlugin(new Sabre_DAVACL_Plugin()); -$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new Sabre_CalDAV_ICSExportPlugin()); - -// And off we go! -$server->exec(); diff --git a/apps/calendar/appinfo/update.php b/apps/calendar/appinfo/update.php deleted file mode 100644 index 0e11c99884..0000000000 --- a/apps/calendar/appinfo/update.php +++ /dev/null @@ -1,24 +0,0 @@ -execute(); - while( $row = $result->fetchRow()) { - $id = $row['id']; - $color = $row['calendarcolor']; - if ($color[0] == '#' || strlen($color) < 6) { - continue; - } - $color = '#' .$color; - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `calendarcolor`=? WHERE `id`=?' ); - $r = $stmt->execute(array($color,$id)); - } -} -if (version_compare($installedVersion, '0.5', '<')) { - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); - foreach($calendars as $calendar){ - OC_Calendar_Repeat::cleanCalendar($calendar['id']); - OC_Calendar_Repeat::generateCalendar($calendar['id']); - } -} \ No newline at end of file diff --git a/apps/calendar/appinfo/version b/apps/calendar/appinfo/version deleted file mode 100644 index cb0c939a93..0000000000 --- a/apps/calendar/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.5.2 diff --git a/apps/calendar/caldav.php b/apps/calendar/caldav.php deleted file mode 100644 index 7b811d3cdf..0000000000 --- a/apps/calendar/caldav.php +++ /dev/null @@ -1,6 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$l10n = OC_L10N::get('calendar'); -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$tmpl = new OCP\Template('calendar', 'part.choosecalendar'); -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/css/import.css b/apps/calendar/css/import.css deleted file mode 100644 index fd82006072..0000000000 --- a/apps/calendar/css/import.css +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -#calendar_import_newcalform, #calendar_import_mergewarning, #calendar_import_process, #calendar_import_done{display:none;} -#calendar_import_process_message, #calendar_import_status, #calendar_import_form_message, #calendar_import_mergewarning{text-align:center;} -#calendar_import_form_message{font-weight: bold;} -#calendar_import_newcalendar{width:415px;float:right;} -#calendar_import_mergewarning{clear: both;} -#calendar_import_defaultcolors{clear:both;margin: 0 auto;text-align: center;} -.calendar_import_warning{border-color: #fc3333;} -.calendar-colorpicker-color{display:inline-block;width:20px;height:5px;margin: 0 auto;cursor:pointer;border:2px solid transparent;margin-top: 5px;} \ No newline at end of file diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css deleted file mode 100644 index 64a779b9a9..0000000000 --- a/apps/calendar/css/style.css +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Copyright (c) 2011 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -#view { float: left; font-size: 12px; height: 100%;} -#datecontrol {text-align: center;} -#datecontrol_left{font-size: 12px;} -#datecontrol_right{font-size: 12px;} -#datecontrol_date_label {margin: 0; padding: 0; font-size: 12px;} -#choosecalendar {margin-right: 170px; float: right; font-size: 12px;} - -#choosecalendar_dialog {display: none;} -#newentry_dialog {display: none;} -#editentry_dialog {display: none;} -#parsingfail_dialog{display: none;} - -#loading { display: none;margin: 0;padding:0;margin-top:5px;} - -#fullcalendar {position: relative;bottom: 0; right: 0; left: 0; top: 3em;} -.fc-content{padding:2px 4px;} -#listview {margin: 0; padding: 10px; background: #EEEEEE;} -#listview #more_before, #listview #more_after {border: 1px solid #1a1a1a; width:25em;padding: 3px;text-align: center;} -#listview #events {width:25em;padding: 4px;} -#listview #events .day {width:auto;padding-left:10px;border-bottom: 2px solid #EEEEEE;text-align:left;} - -.actions {height: 33px; min-width: 800px;} -.controls {min-width: 800px;} -.center {text-align: center;} -.dateinfo {height: 20px;width: 100%; overflow: hidden; margin-top: 0; padding: 0; font-size: 12px;background: #F7F7F7;} -.events {width: 100%; margin: 0; padding: 0;min-height: 100px;} -.calendar_row {height: 20px; text-align: center;background: #ffffff;} -#oneweekview .calendar_row {width: 13.5%;} -.calendar_time {height: 20px; width: 50px; text-align:right;background: #ffffff;} -.day {text-align: center; background: #ffffff; margin: 0; padding: 0; vertical-align: top; width: 14%; height: 22%;} -.weekend {background: #F3F3F3; } -.weekend_thead, .weekend_row{height: 20px;text-align: center;text-align: center;background: #F3F3F3;} -.thisday{background: #FFFABC;} -.event {position:relative;} -.event.colored {border-bottom: 1px solid white;} - -input[type="button"].active {color: #6193CF} -#fromtime, #totime { -color:#333; -} -#fromtime.disabled, #totime.disabled { -color:#A9A9A9; -} -select#category{width:140px;} -button.category{margin:0 3px;} - -.calendar-colorpicker-color{display:inline-block;width:20px;height:20px;margin-right:2px;cursor:pointer;border:2px solid transparent;} -.calendar-colorpicker-color.active{border:2px solid black;} - -#event {padding: 0;margin: 0;margin-top:-5px} - -.calendar_share_dropdown{ display:block; position:absolute; z-index:100; width:16em; right:0; margin-right:7em; background:#F8F8F8; padding:1em; --moz-box-shadow:0 1px 1px #777; -webkit-box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777; --moz-border-radius:0 0 1em 1em; -webkit-border-radius:0 0 1em 1em; border-radius:0 0 1em 1em;} - -.fc-list-table -{ - margin: 10px; - border-style: hidden; - border-width: 10px; - padding: 10px; - vertical-align: top; - width: 100%; -} -.fc-list-table tr:hover -{ - color: #0000FF; - background-color: #CCFFCC; -} - - -.fc-list-date -{ - margin: 16px; - white-space: nowrap; - text-align: left; - width: 100%; - background-color: #808080; - color: #FFFFFF; - font-weight: bold; - font-family: Arial, Helvetica, sans-serif; -} -.fc-list-time -{ - text-align: center; - white-space: nowrap; - width: 1%; -} - -.fc-list-event -{ - text-align: left; -} - -.fc-list-event .fc-event-title -{ - cursor: pointer; -} -.tipsy-event .tipsy-inner{ -background-color:#0098E4; -border:2px solid #1d2d44; -max-width:400px; -padding:0; -} -.tipsy-event .tipsy-arrow-s{ -border-top-color:#1d2d44; -} -.tipsy-event .tipsy-arrow-n{ -border-bottom-color:#1d2d44; -} -.tipsy-event .summary, -.tipsy-event .timespan, -.tipsy-event .description{ -padding:0 8px; -} -.tipsy-event .summary{ -background-color:#1d2d44; -font-size:1.2em; -font-weight:bold; -text-align:left; -padding:0 8px 2px; -} -.tipsy-event .description{ -line-height:1.2; -margin-bottom:4px; -} - -#choosecalendar a.settings{ - margin-top: 25px; - margin-right: 10px; -} - -#fullcalendar{ - overflow: scroll; -} \ No newline at end of file diff --git a/apps/calendar/export.php b/apps/calendar/export.php deleted file mode 100644 index 1374c49cc0..0000000000 --- a/apps/calendar/export.php +++ /dev/null @@ -1,30 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$cal = isset($_GET['calid']) ? $_GET['calid'] : NULL; -$event = isset($_GET['eventid']) ? $_GET['eventid'] : NULL; -if(isset($cal)){ - $calendar = OC_Calendar_App::getCalendar($cal, true); - if(!$calendar){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $calendar['displayname']) . '.ics'); - echo OC_Calendar_Export::export($cal, OC_Calendar_Export::CALENDAR); -}elseif(isset($event)){ - $data = OC_Calendar_App::getEventObject($_GET['eventid'], true); - if(!$data){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $data['summary']) . '.ics'); - echo OC_Calendar_Export::export($event, OC_Calendar_Export::EVENT); -} \ No newline at end of file diff --git a/apps/calendar/img/Icon License b/apps/calendar/img/Icon License deleted file mode 100644 index b1b292ace6..0000000000 --- a/apps/calendar/img/Icon License +++ /dev/null @@ -1,2 +0,0 @@ -http://thenounproject.com/noun/calendar/#icon-No404 -Creative Commons BY 3.0 \ No newline at end of file diff --git a/apps/calendar/img/icon.png b/apps/calendar/img/icon.png deleted file mode 100644 index 267efd997f..0000000000 Binary files a/apps/calendar/img/icon.png and /dev/null differ diff --git a/apps/calendar/img/icon.svg b/apps/calendar/img/icon.svg deleted file mode 100644 index 211f74df06..0000000000 --- a/apps/calendar/img/icon.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - -image/svg+xml - - - \ No newline at end of file diff --git a/apps/calendar/index.php b/apps/calendar/index.php deleted file mode 100644 index a8ad4ab335..0000000000 --- a/apps/calendar/index.php +++ /dev/null @@ -1,71 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); - -// Create default calendar ... -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser(), false); -if( count($calendars) == 0){ - OC_Calendar_Calendar::addCalendar(OCP\USER::getUser(),'Default calendar'); - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser(), true); -} - -$eventSources = array(); -foreach($calendars as $calendar){ - if($calendar['active'] == 1) { - $eventSources[] = OC_Calendar_Calendar::getEventSourceInfo($calendar); - } -} - -$events_baseURL = OCP\Util::linkTo('calendar', 'ajax/events.php'); -$eventSources[] = array('url' => $events_baseURL.'?calendar_id=shared_rw', - 'backgroundColor' => '#1D2D44', - 'borderColor' => '#888', - 'textColor' => 'white', - 'editable'=>'true'); -$eventSources[] = array('url' => $events_baseURL.'?calendar_id=shared_r', - 'backgroundColor' => '#1D2D44', - 'borderColor' => '#888', - 'textColor' => 'white', - 'editable' => 'false'); - -OCP\Util::emitHook('OC_Calendar', 'getSources', array('sources' => &$eventSources)); -$categories = OC_Calendar_App::getCategoryOptions(); - -//Fix currentview for fullcalendar -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "oneweekview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "agendaWeek"); -} -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "onemonthview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "month"); -} -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "listview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "list"); -} - -OCP\Util::addscript('3rdparty/fullcalendar', 'fullcalendar'); -OCP\Util::addStyle('3rdparty/fullcalendar', 'fullcalendar'); -OCP\Util::addscript('3rdparty/timepicker', 'jquery.ui.timepicker'); -OCP\Util::addStyle('3rdparty/timepicker', 'jquery.ui.timepicker'); -if(OCP\Config::getUserValue(OCP\USER::getUser(), "calendar", "timezone") == null || OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection') == 'true'){ - OCP\Util::addscript('calendar', 'geo'); -} -OCP\Util::addscript('calendar', 'calendar'); -OCP\Util::addStyle('calendar', 'style'); -OCP\Util::addscript('', 'jquery.multiselect'); -OCP\Util::addStyle('', 'jquery.multiselect'); -OCP\Util::addscript('contacts','jquery.multi-autocomplete'); -OCP\Util::addscript('','oc-vcategories'); -OCP\App::setActiveNavigationEntry('calendar_index'); -$tmpl = new OCP\Template('calendar', 'calendar', 'user'); -$tmpl->assign('eventSources', $eventSources,false); -$tmpl->assign('categories', $categories); -if(array_key_exists('showevent', $_GET)){ - $tmpl->assign('showevent', $_GET['showevent'], false); -} -$tmpl->printPage(); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js deleted file mode 100644 index 23846c89b8..0000000000 --- a/apps/calendar/js/calendar.js +++ /dev/null @@ -1,935 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -Calendar={ - UI:{ - loading: function(isLoading){ - if (isLoading){ - $('#loading').show(); - }else{ - $('#loading').hide(); - } - }, - startEventDialog:function(){ - Calendar.UI.loading(false); - $('.tipsy').remove(); - $('#fullcalendar').fullCalendar('unselect'); - Calendar.UI.lockTime(); - $( "#from" ).datepicker({ - dateFormat : 'dd-mm-yy' - }); - $( "#to" ).datepicker({ - dateFormat : 'dd-mm-yy' - }); - $('#fromtime').timepicker({ - showPeriodLabels: false - }); - $('#totime').timepicker({ - showPeriodLabels: false - }); - $('#category').multiple_autocomplete({source: categories}); - Calendar.UI.repeat('init'); - $('#end').change(function(){ - Calendar.UI.repeat('end'); - }); - $('#repeat').change(function(){ - Calendar.UI.repeat('repeat'); - }); - $('#advanced_year').change(function(){ - Calendar.UI.repeat('year'); - }); - $('#advanced_month').change(function(){ - Calendar.UI.repeat('month'); - }); - $( "#event" ).tabs({ selected: 0}); - $('#event').dialog({ - width : 500, - height: 600, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - } - }); - }, - newEvent:function(start, end, allday){ - start = Math.round(start.getTime()/1000); - if (end){ - end = Math.round(end.getTime()/1000); - } - if($('#event').dialog('isOpen') == true){ - // TODO: save event - $('#event').dialog('destroy').remove(); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/event', 'new.form.php'), {start:start, end:end, allday:allday?1:0}, Calendar.UI.startEventDialog); - } - }, - editEvent:function(calEvent, jsEvent, view){ - if (calEvent.editable == false || calEvent.source.editable == false) { - return; - } - var id = calEvent.id; - if($('#event').dialog('isOpen') == true){ - // TODO: save event - $('#event').dialog('destroy').remove(); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/event', 'edit.form.php'), {id: id}, Calendar.UI.startEventDialog); - } - }, - submitDeleteEventForm:function(url){ - var post = $( '#event_form' ).serialize(); - $('#errorbox').empty(); - Calendar.UI.loading(true); - $.post(url, post, function(data){ - Calendar.UI.loading(false); - if(data.status == 'success'){ - $('#fullcalendar').fullCalendar('removeEvents', $('#event_form input[name=id]').val()); - $('#event').dialog('destroy').remove(); - } else { - $('#errorbox').html(t('calendar', 'Deletion failed')); - } - - }, "json"); - }, - validateEventForm:function(url){ - var post = $( "#event_form" ).serialize(); - $("#errorbox").empty(); - Calendar.UI.loading(true); - $.post(url, post, - function(data){ - Calendar.UI.loading(false); - if(data.status == "error"){ - var output = missing_field + ":
"; - if(data.title == "true"){ - output = output + missing_field_title + "
"; - } - if(data.cal == "true"){ - output = output + missing_field_calendar + "
"; - } - if(data.from == "true"){ - output = output + missing_field_fromdate + "
"; - } - if(data.fromtime == "true"){ - output = output + missing_field_fromtime + "
"; - } - if(data.to == "true"){ - output = output + missing_field_todate + "
"; - } - if(data.totime == "true"){ - output = output + missing_field_totime + "
"; - } - if(data.endbeforestart == "true"){ - output = output + missing_field_startsbeforeends + "!
"; - } - if(data.dberror == "true"){ - output = "There was a database fail!"; - } - $("#errorbox").html(output); - } else - if(data.status == 'success'){ - $('#event').dialog('destroy').remove(); - $('#fullcalendar').fullCalendar('refetchEvents'); - } - },"json"); - }, - moveEvent:function(event, dayDelta, minuteDelta, allDay, revertFunc){ - $('.tipsy').remove(); - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/event', 'move.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, allDay: allDay?1:0, lastmodified: event.lastmodified}, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - event.lastmodified = data.lastmodified; - console.log("Event moved successfully"); - }else{ - revertFunc(); - $('#fullcalendar').fullCalendar('refetchEvents'); - } - }); - }, - resizeEvent:function(event, dayDelta, minuteDelta, revertFunc){ - $('.tipsy').remove(); - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/event', 'resize.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, lastmodified: event.lastmodified}, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - event.lastmodified = data.lastmodified; - console.log("Event resized successfully"); - }else{ - revertFunc(); - $('#fullcalendar').fullCalendar('refetchEvents'); - } - }); - }, - showadvancedoptions:function(){ - $("#advanced_options").slideDown('slow'); - $("#advanced_options_button").css("display", "none"); - }, - showadvancedoptionsforrepeating:function(){ - if($("#advanced_options_repeating").is(":hidden")){ - $('#advanced_options_repeating').slideDown('slow'); - }else{ - $('#advanced_options_repeating').slideUp('slow'); - } - }, - getEventPopupText:function(event){ - if (event.allDay){ - var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}") - }else{ - var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy] ' + defaulttime + '{ -[ ddd d MMMM yyyy]' + defaulttime + '}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy] HH:mm{ -[ ddd d MMMM yyyy] HH:mm}") - // Tue 18 October 2011 08:00 - 16:00 - } - var html = - '
' + event.title + '
' + - '
' + timespan + '
'; - if (event.description){ - html += '
' + event.description + '
'; - } - return html; - }, - lockTime:function(){ - if($('#allday_checkbox').is(':checked')) { - $("#fromtime").attr('disabled', true) - .addClass('disabled'); - $("#totime").attr('disabled', true) - .addClass('disabled'); - } else { - $("#fromtime").attr('disabled', false) - .removeClass('disabled'); - $("#totime").attr('disabled', false) - .removeClass('disabled'); - } - }, - showCalDAVUrl:function(username, calname){ - $('#caldav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(calname)); - $('#caldav_url').show(); - $("#caldav_url_close").show(); - }, - initScroll:function(){ - if(window.addEventListener) - document.addEventListener('DOMMouseScroll', Calendar.UI.scrollCalendar, false); - //}else{ - document.onmousewheel = Calendar.UI.scrollCalendar; - //} - }, - scrollCalendar:function(event){ - $('.tipsy').remove(); - var direction; - if(event.detail){ - if(event.detail < 0){ - direction = 'top'; - }else{ - direction = 'down'; - } - } - if (event.wheelDelta){ - if(event.wheelDelta > 0){ - direction = 'top'; - }else{ - direction = 'down'; - } - } - var scroll = $(document).scrollTop(), - doc_height = $(document).height(), - win_height = $(window).height(); - if(direction == 'down' && win_height == (doc_height - scroll)){ - $('#fullcalendar').fullCalendar('next'); - $(document).scrollTop(0); - event.preventDefault(); - }else if (direction == 'top' && scroll == 0) { - $('#fullcalendar').fullCalendar('prev'); - $(document).scrollTop(win_height); - event.preventDefault(); - } - }, - repeat:function(task){ - if(task=='init'){ - $('#byweekno').multiselect({ - header: false, - noneSelectedText: $('#advanced_byweekno').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#weeklyoptions').multiselect({ - header: false, - noneSelectedText: $('#weeklyoptions').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('input[name="bydate"]').datepicker({ - dateFormat : 'dd-mm-yy' - }); - $('#byyearday').multiselect({ - header: false, - noneSelectedText: $('#byyearday').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#bymonth').multiselect({ - header: false, - noneSelectedText: $('#bymonth').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#bymonthday').multiselect({ - header: false, - noneSelectedText: $('#bymonthday').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - Calendar.UI.repeat('end'); - Calendar.UI.repeat('month'); - Calendar.UI.repeat('year'); - Calendar.UI.repeat('repeat'); - } - if(task == 'end'){ - $('#byoccurrences').css('display', 'none'); - $('#bydate').css('display', 'none'); - if($('#end option:selected').val() == 'count'){ - $('#byoccurrences').css('display', 'block'); - } - if($('#end option:selected').val() == 'date'){ - $('#bydate').css('display', 'block'); - } - } - if(task == 'repeat'){ - $('#advanced_month').css('display', 'none'); - $('#advanced_weekday').css('display', 'none'); - $('#advanced_weekofmonth').css('display', 'none'); - $('#advanced_byyearday').css('display', 'none'); - $('#advanced_bymonth').css('display', 'none'); - $('#advanced_byweekno').css('display', 'none'); - $('#advanced_year').css('display', 'none'); - $('#advanced_bymonthday').css('display', 'none'); - if($('#repeat option:selected').val() == 'monthly'){ - $('#advanced_month').css('display', 'block'); - Calendar.UI.repeat('month'); - } - if($('#repeat option:selected').val() == 'weekly'){ - $('#advanced_weekday').css('display', 'block'); - } - if($('#repeat option:selected').val() == 'yearly'){ - $('#advanced_year').css('display', 'block'); - Calendar.UI.repeat('year'); - } - if($('#repeat option:selected').val() == 'doesnotrepeat'){ - $('#advanced_options_repeating').slideUp('slow'); - } - } - if(task == 'month'){ - $('#advanced_weekday').css('display', 'none'); - $('#advanced_weekofmonth').css('display', 'none'); - if($('#advanced_month_select option:selected').val() == 'weekday'){ - $('#advanced_weekday').css('display', 'block'); - $('#advanced_weekofmonth').css('display', 'block'); - } - } - if(task == 'year'){ - $('#advanced_weekday').css('display', 'none'); - $('#advanced_byyearday').css('display', 'none'); - $('#advanced_bymonth').css('display', 'none'); - $('#advanced_byweekno').css('display', 'none'); - $('#advanced_bymonthday').css('display', 'none'); - if($('#advanced_year_select option:selected').val() == 'byyearday'){ - //$('#advanced_byyearday').css('display', 'block'); - } - if($('#advanced_year_select option:selected').val() == 'byweekno'){ - $('#advanced_byweekno').css('display', 'block'); - } - if($('#advanced_year_select option:selected').val() == 'bydaymonth'){ - $('#advanced_bymonth').css('display', 'block'); - $('#advanced_bymonthday').css('display', 'block'); - $('#advanced_weekday').css('display', 'block'); - } - } - - }, - setViewActive: function(view){ - $('#view input[type="button"]').removeClass('active'); - var id; - switch (view) { - case 'agendaWeek': - id = 'oneweekview_radio'; - break; - case 'month': - id = 'onemonthview_radio'; - break; - case 'list': - id = 'listview_radio'; - break; - } - $('#'+id).addClass('active'); - }, - categoriesChanged:function(newcategories){ - categories = $.map(newcategories, function(v) {return v;}); - console.log('Calendar categories changed to: ' + categories); - $('#category').multiple_autocomplete('option', 'source', categories); - }, - Calendar:{ - overview:function(){ - if($('#choosecalendar_dialog').dialog('isOpen') == true){ - $('#choosecalendar_dialog').dialog('moveToTop'); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/calendar', 'overview.php'), function(){ - $('#choosecalendar_dialog').dialog({ - width : 600, - height: 400, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - } - }); - Calendar.UI.loading(false); - }); - } - }, - activation:function(checkbox, calendarid) - { - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/calendar', 'activation.php'), { calendarid: calendarid, active: checkbox.checked?1:0 }, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - checkbox.checked = data.active == 1; - if (data.active == 1){ - $('#fullcalendar').fullCalendar('addEventSource', data.eventSource); - }else{ - $('#fullcalendar').fullCalendar('removeEventSource', data.eventSource.url); - } - } - }); - }, - newCalendar:function(object){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('calendar', 'ajax/calendar', 'new.form.php'), - function(){Calendar.UI.Calendar.colorPicker(this)}); - $(object).closest('tr').after(tr).hide(); - }, - edit:function(object, calendarid){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('calendar', 'ajax/calendar', 'edit.form.php'), {calendarid: calendarid}, - function(){Calendar.UI.Calendar.colorPicker(this)}); - $(object).closest('tr').after(tr).hide(); - }, - deleteCalendar:function(calid){ - var check = confirm("Do you really want to delete this calendar?"); - if(check == false){ - return false; - }else{ - $.post(OC.filePath('calendar', 'ajax/calendar', 'delete.php'), { calendarid: calid}, - function(data) { - if (data.status == 'success'){ - var url = 'ajax/events.php?calendar_id='+calid; - $('#fullcalendar').fullCalendar('removeEventSource', url); - $('#choosecalendar_dialog').dialog('destroy').remove(); - Calendar.UI.Calendar.overview(); - $('#fullcalendar').fullCalendar('refetchEvents'); - } - }); - } - }, - submit:function(button, calendarid){ - var displayname = $.trim($("#displayname_"+calendarid).val()); - var active = $("#edit_active_"+calendarid+":checked").length; - var description = $("#description_"+calendarid).val(); - var calendarcolor = $("#calendarcolor_"+calendarid).val(); - if(displayname == ''){ - $("#displayname_"+calendarid).css('background-color', '#FF2626'); - $("#displayname_"+calendarid).focus(function(){ - $("#displayname_"+calendarid).css('background-color', '#F8F8F8'); - }); - } - - var url; - if (calendarid == 'new'){ - url = OC.filePath('calendar', 'ajax/calendar', 'new.php'); - }else{ - url = OC.filePath('calendar', 'ajax/calendar', 'update.php'); - } - $.post(url, { id: calendarid, name: displayname, active: active, description: description, color: calendarcolor }, - function(data){ - if(data.status == 'success'){ - $(button).closest('tr').prev().html(data.page).show().next().remove(); - $('#fullcalendar').fullCalendar('removeEventSource', data.eventSource.url); - $('#fullcalendar').fullCalendar('addEventSource', data.eventSource); - if (calendarid == 'new'){ - $('#choosecalendar_dialog > table:first').append(''); - } - }else{ - $("#displayname_"+calendarid).css('background-color', '#FF2626'); - $("#displayname_"+calendarid).focus(function(){ - $("#displayname_"+calendarid).css('background-color', '#F8F8F8'); - }); - } - }, 'json'); - }, - cancel:function(button, calendarid){ - $(button).closest('tr').prev().show().next().remove(); - }, - colorPicker:function(container){ - // based on jquery-colorpicker at jquery.webspirited.com - var obj = $('.colorpicker', container); - var picker = $('
'); - //build an array of colors - var colors = {}; - $(obj).children('option').each(function(i, elm) { - colors[i] = {}; - colors[i].color = $(elm).val(); - colors[i].label = $(elm).text(); - }); - for (var i in colors) { - picker.append(''); - } - picker.delegate(".calendar-colorpicker-color", "click", function() { - $(obj).val($(this).attr('rel')); - $(obj).change(); - picker.children('.calendar-colorpicker-color.active').removeClass('active'); - $(this).addClass('active'); - }); - $(obj).after(picker); - $(obj).css({ - position: 'absolute', - left: -10000 - }); - } - }, - Share:{ - currentid: 'false', - idtype: '', - activation:function(object,owner,id){ - $.post(OC.filePath('calendar', 'ajax/share', 'activation.php'),{id:id, idtype:'calendar', activation:object.checked?1:0}); - $('#fullcalendar').fullCalendar('refetchEvents'); - }, - dropdown:function(userid, calid){ - $('.calendar_share_dropdown').remove(); - var element = document.getElementById(userid+'_'+calid); - $('
').appendTo(element); - $.post(OC.filePath('calendar', 'ajax/share', 'dropdown.php'), {calid: calid}, function(data){ - $('.calendar_share_dropdown').html(data); - $('.calendar_share_dropdown').show('blind'); - $('#share_user').chosen(); - $('#share_group').chosen(); - }); - Calendar.UI.Share.currentid = calid; - Calendar.UI.Share.idtype = 'calendar'; - }, - share:function(id, idtype, sharewith, sharetype){ - $.post(OC.filePath('calendar', 'ajax/share', 'share.php'),{id:id, idtype:idtype, sharewith:sharewith, sharetype:sharetype}, function(data){ - if(sharetype == 'public'){ - $('#public_token').val(parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=calendar&t='+data.message); - $('#public_token').css('display', 'block'); - } - }); - }, - unshare:function(id, idtype, sharewith, sharetype){ - $.post(OC.filePath('calendar', 'ajax/share', 'unshare.php'),{id:id, idtype:idtype, sharewith:sharewith, sharetype:sharetype}, function(){ - if(sharetype == 'public'){ - $('#public_token').val(''); - $('#public_token').css('display', 'none'); - } - }); - }, - changepermission:function(id, idtype, sharewith, sharetype, permission){ - $.post(OC.filePath('calendar', 'ajax/share', 'changepermission.php'),{id:id, idtype:idtype, sharewith: sharewith, sharetype:sharetype, permission: (permission?1:0)}); - }, - init:function(){ - $('.calendar_share_dropdown').live('mouseleave', function(){ - $('.calendar_share_dropdown').hide('blind', function(){ - $('.calendar_share_dropdown').remove(); - }); - }); - $('#share_user').live('change', function(){ - if($('#sharewithuser_' + $('#share_user option:selected').text()).length == 0){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_user option:selected').text(), 'user'); - var newitem = '
  • ' + $('#share_user option:selected').text() + '
  • '; - $('#sharewithuser_list').append(newitem); - $('#sharewithuser_' + $('#share_user option:selected').text() + ' > img').click(function(){ - $('#share_user option[value="' + $(this).parent().text() + '"]').removeAttr('disabled'); - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'user' ); - $("#share_user").trigger("liszt:updated"); - $(this).parent().remove(); - }); - $('#share_user option:selected').attr('disabled', 'disabled'); - $("#share_user").trigger("liszt:updated"); - } - }); - $('#share_group').live('change', function(){ - if($('#sharewithgroup_' + $('#share_group option:selected').text()).length == 0){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_group option:selected').text(), 'group'); - var newitem = '
  • ' + $('#share_group option:selected').text() + '
  • '; - $('#sharewithgroup_list').append(newitem); - $('#sharewithgroup_' + $('#share_group option:selected').text() + ' > img').click(function(){ - $('#share_group option[value="' + $(this).parent().text() + '"]').removeAttr('disabled'); - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'group'); - $("#share_group").trigger("liszt:updated"); - $(this).parent().remove(); - }); - $('#share_group option:selected').attr('disabled', 'disabled'); - $("#share_group").trigger("liszt:updated"); - } - }); - $('#sharewithuser_list > li > input:checkbox').live('change', function(){ - Calendar.UI.Share.changepermission(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'user', this.checked); - }); - $('#sharewithgroup_list > li > input:checkbox').live('change', function(){ - Calendar.UI.Share.changepermission(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'group', this.checked); - }); - $('#publish').live('change', function(){ - if(this.checked == 1){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, '', 'public'); - }else{ - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, '', 'public'); - } - }); - $('#sharewithuser_list').live('mouseenter', function(){ - $('#sharewithuser_list > li > img').css('display', 'block'); - $('#sharewithuser_list > li > input').css('visibility', 'visible'); - }); - $('#sharewithuser_list').live('mouseleave', function(){ - $('#sharewithuser_list > li > img').css('display', 'none'); - $('#sharewithuser_list > li > input').css('visibility', 'hidden'); - }); - $('#sharewithgroup_list').live('mouseenter', function(){ - $('#sharewithgroup_list > li > img').css('display', 'block'); - $('#sharewithgroup_list > li > input').css('visibility', 'visible'); - }); - $('#sharewithgroup_list').live('mouseleave', function(){ - $('#sharewithgroup_list > li > img').css('display', 'none'); - $('#sharewithgroup_list > li > input').css('visibility', 'hidden'); - }); - /*var permissions = (this.checked) ? 1 : 0;*/ - } - }, - Drop:{ - init:function(){ - if (typeof window.FileReader === 'undefined') { - console.log('The drop-import feature is not supported in your browser :('); - return false; - } - droparea = document.getElementById('fullcalendar'); - droparea.ondrop = function(e){ - e.preventDefault(); - Calendar.UI.Drop.drop(e); - } - console.log('Drop initialized successfully'); - }, - drop:function(e){ - var files = e.dataTransfer.files; - for(var i = 0;i < files.length;i++){ - var file = files[i]; - reader = new FileReader(); - reader.onload = function(event){ - Calendar.UI.Drop.import(event.target.result); - $('#fullcalendar').fullCalendar('refetchEvents'); - } - reader.readAsDataURL(file); - } - }, - import:function(data){ - $.post(OC.filePath('calendar', 'ajax/import', 'dropimport.php'), {'data':data},function(result) { - if(result.status == 'success'){ - $('#fullcalendar').fullCalendar('addEventSource', result.eventSource); - $('#notification').html(result.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - return true; - }else{ - $('#notification').html(result.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - } - }); - } - } - }, - Settings:{ - // - }, - -} -$.fullCalendar.views.list = ListView; -function ListView(element, calendar) { - var t = this; - - // imports - jQuery.fullCalendar.views.month.call(t, element, calendar); - var opt = t.opt; - var trigger = t.trigger; - var eventElementHandlers = t.eventElementHandlers; - var reportEventElement = t.reportEventElement; - var formatDate = calendar.formatDate; - var formatDates = calendar.formatDates; - var addDays = $.fullCalendar.addDays; - var cloneDate = $.fullCalendar.cloneDate; - function skipWeekend(date, inc, excl) { - inc = inc || 1; - while (!date.getDay() || (excl && date.getDay()==1 || !excl && date.getDay()==6)) { - addDays(date, inc); - } - return date; - } - - // overrides - t.name='list'; - t.render=render; - t.renderEvents=renderEvents; - t.setHeight=setHeight; - t.setWidth=setWidth; - t.clearEvents=clearEvents; - - function setHeight(height, dateChanged) { - } - - function setWidth(width) { - } - - function clearEvents() { - this.reportEventClear(); - } - - // main - function sortEvent(a, b) { - return a.start - b.start; - } - - function render(date, delta) { - if (!t.start){ - t.start = addDays(cloneDate(date, true), -7); - t.end = addDays(cloneDate(date, true), 7); - } - if (delta) { - if (delta < 0){ - addDays(t.start, -7); - addDays(t.end, -7); - if (!opt('weekends')) { - skipWeekend(t.start, delta < 0 ? -1 : 1); - } - }else{ - addDays(t.start, 7); - addDays(t.end, 7); - if (!opt('weekends')) { - skipWeekend(t.end, delta < 0 ? -1 : 1); - } - } - } - t.title = formatDates( - t.start, - t.end, - opt('titleFormat', 'week') - ); - t.visStart = cloneDate(t.start); - t.visEnd = cloneDate(t.end); - } - - function eventsOfThisDay(events, theDate) { - var start = cloneDate(theDate, true); - var end = addDays(cloneDate(start), 1); - var retArr = new Array(); - for (i in events) { - var event_end = t.eventEnd(events[i]); - if (events[i].start < end && event_end >= start) { - retArr.push(events[i]); - } - } - return retArr; - } - - function renderEvent(event) { - if (event.allDay) { //all day event - var time = opt('allDayText'); - } - else { - var time = formatDates(event.start, event.end, opt('timeFormat', 'agenda')); - } - var classes = ['fc-event', 'fc-list-event']; - classes = classes.concat(event.className); - if (event.source) { - classes = classes.concat(event.source.className || []); - } - var html = '' + - ' ' + - '' + - time + - '' + - ' ' + - '' + - '' + - '' + - event.title + - '' + - '' + - '' + - ''; - return html; - } - - function renderDay(date, events) { - var dayRows = $('' + - '' + - '' + - formatDate(date, opt('titleFormat', 'day')) + - '' + - '' + - ''); - for (i in events) { - var event = events[i]; - var eventElement = $(renderEvent(event)); - triggerRes = trigger('eventRender', event, event, eventElement); - if (triggerRes === false) { - eventElement.remove(); - }else{ - if (triggerRes && triggerRes !== true) { - eventElement.remove(); - eventElement = $(triggerRes); - } - $.merge(dayRows, eventElement); - eventElementHandlers(event, eventElement); - reportEventElement(event, eventElement); - } - } - return dayRows; - } - - function renderEvents(events, modifiedEventId) { - events = events.sort(sortEvent); - - var table = $('
    '); - var total = events.length; - if (total > 0) { - var date = cloneDate(t.visStart); - while (date <= t.visEnd) { - var dayEvents = eventsOfThisDay(events, date); - if (dayEvents.length > 0) { - table.append(renderDay(date, dayEvents)); - } - date=addDays(date, 1); - } - } - - this.element.html(table); - } -} -$(document).ready(function(){ - Calendar.UI.initScroll(); - $('#fullcalendar').fullCalendar({ - header: false, - firstDay: firstDay, - editable: true, - defaultView: defaultView, - timeFormat: { - agenda: agendatime, - '': defaulttime - }, - columnFormat: { - month: t('calendar', 'ddd'), // Mon - week: t('calendar', 'ddd M/d'), // Mon 9/7 - day: t('calendar', 'dddd M/d') // Monday 9/7 - }, - titleFormat: { - month: t('calendar', 'MMMM yyyy'), - // September 2009 - week: t('calendar', "MMM d[ yyyy]{ '—'[ MMM] d yyyy}"), - // Sep 7 - 13 2009 - day: t('calendar', 'dddd, MMM d, yyyy'), - // Tuesday, Sep 8, 2009 - }, - axisFormat: defaulttime, - monthNames: monthNames, - monthNamesShort: monthNamesShort, - dayNames: dayNames, - dayNamesShort: dayNamesShort, - allDayText: allDayText, - viewDisplay: function(view) { - $('#datecontrol_date').val($('

    ').html(view.title).text()); - if (view.name != defaultView) { - $.post(OC.filePath('calendar', 'ajax', 'changeview.php'), {v:view.name}); - defaultView = view.name; - } - Calendar.UI.setViewActive(view.name); - if (view.name == 'agendaWeek') { - $('#fullcalendar').fullCalendar('option', 'aspectRatio', 0.1); - } - else { - $('#fullcalendar').fullCalendar('option', 'aspectRatio', 1.35); - } - }, - columnFormat: { - week: 'ddd d. MMM' - }, - selectable: true, - selectHelper: true, - select: Calendar.UI.newEvent, - eventClick: Calendar.UI.editEvent, - eventDrop: Calendar.UI.moveEvent, - eventResize: Calendar.UI.resizeEvent, - eventRender: function(event, element) { - element.find('.fc-event-title').html(element.find('.fc-event-title').text()); - element.tipsy({ - className: 'tipsy-event', - opacity: 0.9, - gravity:$.fn.tipsy.autoBounds(150, 's'), - fade:true, - delayIn: 400, - html:true, - title:function() { - return Calendar.UI.getEventPopupText(event); - } - }); - }, - loading: Calendar.UI.loading, - eventSources: eventSources - }); - $('#datecontrol_date').datepicker({ - changeMonth: true, - changeYear: true, - showButtonPanel: true, - beforeShow: function(input, inst) { - var calendar_holder = $('#fullcalendar'); - var date = calendar_holder.fullCalendar('getDate'); - inst.input.datepicker('setDate', date); - inst.input.val(calendar_holder.fullCalendar('getView').title); - return inst; - }, - onSelect: function(value, inst) { - var date = inst.input.datepicker('getDate'); - $('#fullcalendar').fullCalendar('gotoDate', date); - } - }); - fillWindow($('#content')); - OCCategories.changed = Calendar.UI.categoriesChanged; - OCCategories.app = 'calendar'; - $('#oneweekview_radio').click(function(){ - $('#fullcalendar').fullCalendar('changeView', 'agendaWeek'); - }); - $('#onemonthview_radio').click(function(){ - $('#fullcalendar').fullCalendar('changeView', 'month'); - }); - $('#listview_radio').click(function(){ - $('#fullcalendar').fullCalendar('changeView', 'list'); - }); - $('#today_input').click(function(){ - $('#fullcalendar').fullCalendar('today'); - }); - $('#datecontrol_left').click(function(){ - $('#fullcalendar').fullCalendar('prev'); - }); - $('#datecontrol_right').click(function(){ - $('#fullcalendar').fullCalendar('next'); - }); - Calendar.UI.Share.init(); - Calendar.UI.Drop.init(); - $('#choosecalendar .generalsettings').on('click keydown', function() { - OC.appSettings({appid:'calendar', loadJS:true, cache:false}); - }); - $('#choosecalendar .calendarsettings').on('click keydown', function() { - OC.appSettings({appid:'calendar', loadJS:true, cache:false, scriptName:'calendar.php'}); - }); -}); diff --git a/apps/calendar/js/geo.js b/apps/calendar/js/geo.js deleted file mode 100644 index 99290d940e..0000000000 --- a/apps/calendar/js/geo.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2011 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(function(position) { - $.post(OC.filePath('calendar', 'ajax/settings', 'guesstimezone.php'), {lat: position.coords.latitude, lng: position.coords.longitude}, - function(data){ - if (data.status == 'success' && typeof(data.message) != 'undefined'){ - $('#notification').html(data.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - }else{ - console.log('Can\'t set new timezone.'); - } - }); - }); -} \ No newline at end of file diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js deleted file mode 100644 index 253abafc42..0000000000 --- a/apps/calendar/js/loader.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -Calendar_Import={ - Store:{ - file: '', - path: '', - id: 0, - method: '', - calname: '', - calcolor: '', - progresskey: '', - percentage: 0 - }, - Dialog:{ - open: function(filename){ - OC.addStyle('calendar', 'import'); - Calendar_Import.Store.file = filename; - Calendar_Import.Store.path = $('#dir').val(); - $('body').append('

    '); - $('#calendar_import').load(OC.filePath('calendar', 'ajax/import', 'dialog.php'), {filename:Calendar_Import.Store.file, path:Calendar_Import.Store.path},function(){ - Calendar_Import.Dialog.init(); - }); - }, - close: function(){ - Calendar_Import.reset(); - $(this).dialog('destroy').remove(); - $('#calendar_import_dialog').remove(); - }, - init: function(){ - //init dialog - $('#calendar_import_dialog').dialog({ - width : 500, - resizable: false, - close : function() { - Calendar_Import.Dialog.close(); - } - }); - //init buttons - $('#calendar_import_done').click(function(){ - Calendar_Import.Dialog.close(); - }); - $('#calendar_import_submit').click(function(){ - Calendar_Import.Core.process(); - }); - $('#calendar_import_mergewarning').click(function(){ - $('#calendar_import_newcalendar').attr('value', $('#calendar_import_availablename').val()); - Calendar_Import.Dialog.mergewarning($('#calendar_import_newcalendar').val()); - }); - $('#calendar_import_calendar').change(function(){ - if($('#calendar_import_calendar option:selected').val() == 'newcal'){ - $('#calendar_import_newcalform').slideDown('slow'); - Calendar_Import.Dialog.mergewarning($('#calendar_import_newcalendar').val()); - }else{ - $('#calendar_import_newcalform').slideUp('slow'); - $('#calendar_import_mergewarning').slideUp('slow'); - } - }); - $('#calendar_import_newcalendar').keyup(function(){ - Calendar_Import.Dialog.mergewarning($.trim($('#calendar_import_newcalendar').val())); - }); - $('#calendar_import_newcalendar_color').miniColors({ - letterCase: 'uppercase' - }); - $('.calendar-colorpicker-color').click(function(){ - var str = $(this).attr('rel'); - str = str.substr(1); - $('#calendar_import_newcalendar_color').attr('value', str); - $(".color-picker").miniColors('value', '#' + str); - }); - //init progressbar - $('#calendar_import_progressbar').progressbar({value: Calendar_Import.Store.percentage}); - Calendar_Import.Store.progresskey = $('#calendar_import_progresskey').val(); - }, - mergewarning: function(newcalname){ - $.post(OC.filePath('calendar', 'ajax/import', 'calendarcheck.php'), {calname: newcalname}, function(data){ - if(data.message == 'exists'){ - $('#calendar_import_mergewarning').slideDown('slow'); - }else{ - $('#calendar_import_mergewarning').slideUp('slow'); - } - }); - }, - update: function(){ - if(Calendar_Import.Store.percentage == 100){ - return false; - } - $.post(OC.filePath('calendar', 'ajax/import', 'import.php'), {progresskey: Calendar_Import.Store.progresskey, getprogress: true}, function(data){ - if(data.status == 'success'){ - if(data.percent == null){ - return false; - } - Calendar_Import.Store.percentage = parseInt(data.percent); - $('#calendar_import_progressbar').progressbar('option', 'value', parseInt(data.percent)); - if(data.percent < 100 ){ - window.setTimeout('Calendar_Import.Dialog.update()', 250); - }else{ - $('#calendar_import_done').css('display', 'block'); - } - }else{ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - $('#calendar_import_progressbar > div').css('background-color', '#FF2626'); - $('#calendar_import_status').html(data.message); - } - }); - return 0; - }, - warning: function(selector){ - $(selector).addClass('calendar_import_warning'); - $(selector).focus(function(){ - $(selector).removeClass('calendar_import_warning'); - }); - } - }, - Core:{ - process: function(){ - var validation = Calendar_Import.Core.prepare(); - if(validation){ - $('#calendar_import_form').css('display', 'none'); - $('#calendar_import_process').css('display', 'block'); - $('#calendar_import_newcalendar').attr('readonly', 'readonly'); - $('#calendar_import_calendar').attr('disabled', 'disabled'); - Calendar_Import.Core.send(); - window.setTimeout('Calendar_Import.Dialog.update()', 250); - } - }, - send: function(){ - $.post(OC.filePath('calendar', 'ajax/import', 'import.php'), - {progresskey: Calendar_Import.Store.progresskey, method: String (Calendar_Import.Store.method), calname: String (Calendar_Import.Store.calname), path: String (Calendar_Import.Store.path), file: String (Calendar_Import.Store.file), id: String (Calendar_Import.Store.id), calcolor: String (Calendar_Import.Store.calcolor)}, function(data){ - if(data.status == 'success'){ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - Calendar_Import.Store.percentage = 100; - $('#calendar_import_done').css('display', 'block'); - $('#calendar_import_status').html(data.message); - }else{ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - $('#calendar_import_progressbar > div').css('background-color', '#FF2626'); - $('#calendar_import_status').html(data.message); - } - }); - }, - prepare: function(){ - Calendar_Import.Store.id = $('#calendar_import_calendar option:selected').val(); - if($('#calendar_import_calendar option:selected').val() == 'newcal'){ - Calendar_Import.Store.method = 'new'; - Calendar_Import.Store.calname = $.trim($('#calendar_import_newcalendar').val()); - if(Calendar_Import.Store.calname == ''){ - Calendar_Import.Dialog.warning('#calendar_import_newcalendar'); - return false; - } - Calendar_Import.Store.calcolor = $.trim($('#calendar_import_newcalendar_color').val()); - if(Calendar_Import.Store.calcolor == ''){ - Calendar_Import.Store.calcolor = $('.calendar-colorpicker-color:first').attr('rel'); - } - }else{ - Calendar_Import.Store.method = 'old'; - } - return true; - } - }, - reset: function(){ - Calendar_Import.Store.file = ''; - Calendar_Import.Store.path = ''; - Calendar_Import.Store.id = 0; - Calendar_Import.Store.method = ''; - Calendar_Import.Store.calname = ''; - Calendar_Import.Store.progresskey = ''; - Calendar_Import.Store.percentage = 0; - } -} -$(document).ready(function(){ - if(typeof FileActions !== 'undefined'){ - FileActions.register('text/calendar','importCalendar', FileActions.PERMISSION_READ, '', Calendar_Import.Dialog.open); - FileActions.setDefault('text/calendar','importCalendar'); - }; -}); diff --git a/apps/calendar/js/settings.js b/apps/calendar/js/settings.js deleted file mode 100644 index 20753a7b8f..0000000000 --- a/apps/calendar/js/settings.js +++ /dev/null @@ -1,66 +0,0 @@ -$(document).ready(function(){ - $('#timezone').change( function(){ - var post = $( '#timezone' ).serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'settimezone.php'), post, function(data){return;}); - return false; - }); - $('#timezone').chosen(); - $('#timeformat').change( function(){ - var data = $('#timeformat').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'settimeformat.php'), data, function(data){ - if(data == 'error'){ - console.log('saving timeformat failed'); - } - }); - }); - $('#firstday').change( function(){ - var data = $('#firstday').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'setfirstday.php'), data, function(data){ - if(data == 'error'){ - console.log('saving firstday failed'); - } - }); - }); - $('#timezonedetection').change( function(){ - var post = $('#timezonedetection').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'timezonedetection.php'), post, function(data){ - - }); - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'timeformat.php'), function(jsondata, status) { - $('#' + jsondata.timeformat).attr('selected',true); - $('#timeformat').chosen(); - $('#timeformat_chzn').css('width', '100px'); - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'gettimezonedetection.php'), function(jsondata, status){ - if(jsondata.detection == 'true'){ - $('#timezonedetection').attr('checked', 'checked'); - } - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'getfirstday.php'), function(jsondata, status) { - $('#' + jsondata.firstday).attr('selected',true); - $('#firstday').chosen(); - $('#firstday_chzn').css('width', '100px'); - }); - $('#cleancalendarcache').click(function(){ - $.getJSON(OC.filePath('calendar', 'ajax/cache', 'rescan.php'), function(){ - calendarcachecheck(); - }); - }); - calendarcachecheck(); - -}); -function calendarcachecheck(){ - $.getJSON(OC.filePath('calendar', 'ajax/cache', 'status.php'), function(jsondata, status) { - $('#cleancalendarcache').attr('title', jsondata.l10n.text); - if(jsondata.status == 'success'){ - $('#cleancalendarcache').css('background', '#F8F8F8'); - $('#cleancalendarcache').css('color', '#333'); - $('#cleancalendarcache').css('text-shadow', '#fff 0 1px 0'); - }else{ - $('#cleancalendarcache').css('background', '#DC143C'); - $('#cleancalendarcache').css('color', '#FFFFFF'); - $('#cleancalendarcache').css('text-shadow', '0px 0px 0px #fff, 0px 0px #fff'); - } - }); -} \ No newline at end of file diff --git a/apps/calendar/l10n/ar.php b/apps/calendar/l10n/ar.php deleted file mode 100644 index 1ca5e0ead5..0000000000 --- a/apps/calendar/l10n/ar.php +++ /dev/null @@ -1,171 +0,0 @@ - "ليس جميع الجداول الزمنيه محفوضه مؤقة", -"Everything seems to be completely cached" => "كل شيء محفوض مؤقة", -"No calendars found." => "لم يتم العثور على جدول الزمني", -"No events found." => "لم يتم العثور على احداث", -"Wrong calendar" => "جدول زمني خاطئ", -"New Timezone:" => "التوقيت الجديد", -"Timezone changed" => "تم تغيير المنطقة الزمنية", -"Invalid request" => "طلب غير مفهوم", -"Calendar" => "الجدول الزمني", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "ddd M/d", -"MMMM yyyy" => "ddd M/d", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "عيد ميلاد", -"Business" => "عمل", -"Call" => "إتصال", -"Clients" => "الزبائن", -"Deliverer" => "المرسل", -"Holidays" => "عطلة", -"Ideas" => "أفكار", -"Journey" => "رحلة", -"Jubilee" => "يوبيل", -"Meeting" => "إجتماع", -"Other" => "شيء آخر", -"Personal" => "شخصي", -"Projects" => "مشاريع", -"Questions" => "اسئلة", -"Work" => "العمل", -"by" => "من قبل", -"unnamed" => "غير مسمى", -"New Calendar" => "جدول زمني جديد", -"Does not repeat" => "لا يعاد", -"Daily" => "يومي", -"Weekly" => "أسبوعي", -"Every Weekday" => "كل نهاية الأسبوع", -"Bi-Weekly" => "كل اسبوعين", -"Monthly" => "شهري", -"Yearly" => "سنوي", -"never" => "بتاتا", -"by occurrences" => "حسب تسلسل الحدوث", -"by date" => "حسب التاريخ", -"by monthday" => "حسب يوم الشهر", -"by weekday" => "حسب يوم الاسبوع", -"Monday" => "الأثنين", -"Tuesday" => "الثلاثاء", -"Wednesday" => "الاربعاء", -"Thursday" => "الخميس", -"Friday" => "الجمعه", -"Saturday" => "السبت", -"Sunday" => "الاحد", -"events week of month" => "الاحداث باسبوع الشهر", -"first" => "أول", -"second" => "ثاني", -"third" => "ثالث", -"fourth" => "رابع", -"fifth" => "خامس", -"last" => "أخير", -"January" => "كانون الثاني", -"February" => "شباط", -"March" => "آذار", -"April" => "نيسان", -"May" => "أيار", -"June" => "حزيران", -"July" => "تموز", -"August" => "آب", -"September" => "أيلول", -"October" => "تشرين الاول", -"November" => "تشرين الثاني", -"December" => "كانون الاول", -"by events date" => "حسب تاريخ الحدث", -"by yearday(s)" => "حسب يوم السنه", -"by weeknumber(s)" => "حسب رقم الاسبوع", -"by day and month" => "حسب اليوم و الشهر", -"Date" => "تاريخ", -"Cal." => "تقويم", -"Sun." => "أحد", -"Mon." => "أثن.", -"Tue." => "ثلا.", -"Wed." => "أرب.", -"Thu." => "خمي.", -"Fri." => "جمع.", -"Sat." => "سبت", -"Jan." => "ك2", -"Feb." => "شبا.", -"Mar." => "آذا.", -"Apr." => "نيس.", -"May." => "أيا.", -"All day" => "كل النهار", -"Missing fields" => "خانات خالية من المعلومات", -"Title" => "عنوان", -"From Date" => "من تاريخ", -"From Time" => "إلى تاريخ", -"To Date" => "إلى يوم", -"To Time" => "إلى وقت", -"The event ends before it starts" => "هذا الحدث ينتهي قبل أن يبدأ", -"There was a database fail" => "خطأ في قاعدة البيانات", -"Week" => "إسبوع", -"Month" => "شهر", -"List" => "قائمة", -"Today" => "اليوم", -"Your calendars" => "جداولك الزمنيه", -"CalDav Link" => "وصلة CalDav", -"Shared calendars" => "جداول زمنيه مشتركه", -"No shared calendars" => "لا يوجد جداول زمنيه مشتركه", -"Share Calendar" => "شارك الجدول الزمني", -"Download" => "تحميل", -"Edit" => "تعديل", -"Delete" => "حذف", -"shared with you by" => "مشاركه من قبل", -"New calendar" => "جدول زمني جديد", -"Edit calendar" => "عادل الجدول الزمني", -"Displayname" => "الاسم المرئي", -"Active" => "حالي", -"Calendar color" => "لون الجدول الزمني", -"Save" => "إحفظ", -"Submit" => "أرسل", -"Cancel" => "إلغاء", -"Edit an event" => "عادل حدث", -"Export" => "تصدير المعلومات", -"Eventinfo" => "تفاصيل الحدث", -"Repeating" => "يعاد", -"Alarm" => "تنبيه", -"Attendees" => "الحضور", -"Share" => "شارك", -"Title of the Event" => "عنوان الحدث", -"Category" => "فئة", -"Separate categories with commas" => "افصل الفئات بالفواصل", -"Edit categories" => "عدل الفئات", -"All Day Event" => "حدث في يوم كامل", -"From" => "من", -"To" => "إلى", -"Advanced options" => "خيارات متقدمة", -"Location" => "مكان", -"Location of the Event" => "مكان الحدث", -"Description" => "مواصفات", -"Description of the Event" => "وصف الحدث", -"Repeat" => "إعادة", -"Advanced" => "تعديلات متقدمه", -"Select weekdays" => "اختر ايام الاسبوع", -"Select days" => "اختر الايام", -"and the events day of year." => "و التواريخ حسب يوم السنه.", -"and the events day of month." => "و الاحداث حسب يوم الشهر.", -"Select months" => "اختر الاشهر", -"Select weeks" => "اختر الاسابيع", -"and the events week of year." => "و الاحداث حسب اسبوع السنه", -"Interval" => "المده الفاصله", -"End" => "نهايه", -"occurrences" => "الاحداث", -"create a new calendar" => "انشاء جدول زمني جديد", -"Import a calendar file" => "أدخل ملف التقويم", -"Name of new calendar" => "أسم الجدول الزمني الجديد", -"Import" => "إدخال", -"Close Dialog" => "أغلق الحوار", -"Create a new event" => "إضافة حدث جديد", -"View an event" => "شاهد الحدث", -"No categories selected" => "لم يتم اختيار الفئات", -"of" => "من", -"at" => "في", -"Timezone" => "المنطقة الزمنية", -"24h" => "24 ساعة", -"12h" => "12 ساعة", -"Users" => "المستخدمين", -"select users" => "اختر المستخدمين", -"Editable" => "يمكن تعديله", -"Groups" => "مجموعات", -"select groups" => "اختر المجموعات", -"make public" => "حدث عام" -); diff --git a/apps/calendar/l10n/bg_BG.php b/apps/calendar/l10n/bg_BG.php deleted file mode 100644 index fc353ebef9..0000000000 --- a/apps/calendar/l10n/bg_BG.php +++ /dev/null @@ -1,84 +0,0 @@ - "Не са открити календари.", -"No events found." => "Не са открити събития.", -"Import failed" => "Грешка при внасяне", -"New Timezone:" => "Нов часови пояс:", -"Timezone changed" => "Часовата зона е сменена", -"Invalid request" => "Невалидна заявка", -"Calendar" => "Календар", -"Birthday" => "Роджен ден", -"Clients" => "Клиенти", -"Holidays" => "Празници", -"Ideas" => "Идеи", -"Journey" => "Пътуване", -"Meeting" => "Среща", -"Other" => "Друго", -"Personal" => "Лично", -"Projects" => "Проекти", -"Questions" => "Въпроси", -"Work" => "Работа", -"New Calendar" => "Нов календар", -"Does not repeat" => "Не се повтаря", -"Daily" => "Дневно", -"Weekly" => "Седмично", -"Every Weekday" => "Всеки делничен ден", -"Bi-Weekly" => "Двуседмично", -"Monthly" => "Месечно", -"Yearly" => "Годишно", -"never" => "никога", -"Monday" => "Понеделник", -"Tuesday" => "Вторник", -"Wednesday" => "Сряда", -"Thursday" => "Четвъртък", -"Friday" => "Петък", -"Saturday" => "Събота", -"Sunday" => "Неделя", -"All day" => "Всички дни", -"Missing fields" => "Липсват полета", -"Title" => "Заглавие", -"Week" => "Седмица", -"Month" => "Месец", -"List" => "Списък", -"Today" => "Днес", -"Your calendars" => "Вашите календари", -"Shared calendars" => "Споделени календари", -"No shared calendars" => "Няма споделени календари", -"Share Calendar" => "Споделяне на календар", -"Download" => "Изтегляне", -"Edit" => "Промяна", -"Delete" => "Изтриване", -"New calendar" => "Нов календар", -"Edit calendar" => "Промени календар", -"Displayname" => "Екранно име", -"Active" => "Активен", -"Calendar color" => "Цвят на календара", -"Save" => "Запис", -"Submit" => "Продължи", -"Cancel" => "Отказ", -"Edit an event" => "Промяна на събитие", -"Export" => "Изнасяне", -"Share" => "Споделяне", -"Title of the Event" => "Наименование", -"Category" => "Категория", -"Separate categories with commas" => "Отделете категориите със запетаи", -"Edit categories" => "Редактиране на категориите", -"All Day Event" => "Целодневно събитие", -"From" => "От", -"To" => "До", -"Advanced options" => "Разширени настройки", -"Location" => "Локация", -"Location of the Event" => "Локация", -"Description" => "Описание", -"Description of the Event" => "Описание", -"Repeat" => "Повтори", -"create a new calendar" => "създаване на нов календар", -"Please choose a calendar" => "Изберете календар", -"Name of new calendar" => "Име на новия календар", -"Import" => "Внасяне", -"Close Dialog" => "Затваряне на прозореца", -"Create a new event" => "Ново събитие", -"View an event" => "Преглед на събитие", -"No categories selected" => "Няма избрани категории", -"Timezone" => "Часова зона", -"Groups" => "Групи" -); diff --git a/apps/calendar/l10n/ca.php b/apps/calendar/l10n/ca.php deleted file mode 100644 index 9e267604e6..0000000000 --- a/apps/calendar/l10n/ca.php +++ /dev/null @@ -1,198 +0,0 @@ - "No tots els calendaris estan en memòria", -"Everything seems to be completely cached" => "Sembla que tot està en memòria", -"No calendars found." => "No s'han trobat calendaris.", -"No events found." => "No s'han trobat events.", -"Wrong calendar" => "Calendari erroni", -"The file contained either no events or all events are already saved in your calendar." => "El fitxer no contenia esdeveniments o aquests ja estaven desats en el vostre caledari", -"events has been saved in the new calendar" => "els esdeveniments s'han desat en el calendari nou", -"Import failed" => "Ha fallat la importació", -"events has been saved in your calendar" => "els esdveniments s'han desat en el calendari", -"New Timezone:" => "Nova zona horària:", -"Timezone changed" => "La zona horària ha canviat", -"Invalid request" => "Sol.licitud no vàlida", -"Calendar" => "Calendari", -"ddd" => "ddd", -"ddd M/d" => "ddd d/M", -"dddd M/d" => "dddd d/M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d [MMM ][yyyy ]{'—' d MMM yyyy}", -"dddd, MMM d, yyyy" => "dddd, d MMM, yyyy", -"Birthday" => "Aniversari", -"Business" => "Feina", -"Call" => "Trucada", -"Clients" => "Clients", -"Deliverer" => "Remitent", -"Holidays" => "Vacances", -"Ideas" => "Idees", -"Journey" => "Viatge", -"Jubilee" => "Sant", -"Meeting" => "Reunió", -"Other" => "Altres", -"Personal" => "Personal", -"Projects" => "Projectes", -"Questions" => "Preguntes", -"Work" => "Feina", -"by" => "per", -"unnamed" => "sense nom", -"New Calendar" => "Calendari nou", -"Does not repeat" => "No es repeteix", -"Daily" => "Diari", -"Weekly" => "Mensual", -"Every Weekday" => "Cada setmana", -"Bi-Weekly" => "Bisetmanalment", -"Monthly" => "Mensualment", -"Yearly" => "Cada any", -"never" => "mai", -"by occurrences" => "per aparicions", -"by date" => "per data", -"by monthday" => "per dia del mes", -"by weekday" => "per dia de la setmana", -"Monday" => "Dilluns", -"Tuesday" => "Dimarts", -"Wednesday" => "Dimecres", -"Thursday" => "Dijous", -"Friday" => "Divendres", -"Saturday" => "Dissabte", -"Sunday" => "Diumenge", -"events week of month" => "esdeveniments la setmana del mes", -"first" => "primer", -"second" => "segon", -"third" => "tercer", -"fourth" => "quart", -"fifth" => "cinquè", -"last" => "últim", -"January" => "Gener", -"February" => "Febrer", -"March" => "Març", -"April" => "Abril", -"May" => "Maig", -"June" => "Juny", -"July" => "Juliol", -"August" => "Agost", -"September" => "Setembre", -"October" => "Octubre", -"November" => "Novembre", -"December" => "Desembre", -"by events date" => "per data d'esdeveniments", -"by yearday(s)" => "per ahir(s)", -"by weeknumber(s)" => "per número(s) de la setmana", -"by day and month" => "per dia del mes", -"Date" => "Data", -"Cal." => "Cal.", -"Sun." => "Dg.", -"Mon." => "Dl.", -"Tue." => "Dm.", -"Wed." => "Dc.", -"Thu." => "Dj.", -"Fri." => "Dv.", -"Sat." => "Ds.", -"Jan." => "Gen.", -"Feb." => "Febr.", -"Mar." => "Març", -"Apr." => "Abr.", -"May." => "Maig", -"Jun." => "Juny", -"Jul." => "Jul.", -"Aug." => "Ag.", -"Sep." => "Set.", -"Oct." => "Oct.", -"Nov." => "Nov.", -"Dec." => "Des.", -"All day" => "Tot el dia", -"Missing fields" => "Els camps que falten", -"Title" => "Títol", -"From Date" => "Des de la data", -"From Time" => "Des de l'hora", -"To Date" => "Fins a la data", -"To Time" => "Fins a l'hora", -"The event ends before it starts" => "L'esdeveniment acaba abans que comenci", -"There was a database fail" => "Hi ha un error de base de dades", -"Week" => "Setmana", -"Month" => "Mes", -"List" => "Llista", -"Today" => "Avui", -"Settings" => "Configuració", -"Your calendars" => "Els vostres calendaris", -"CalDav Link" => "Enllaç CalDav", -"Shared calendars" => "Calendaris compartits", -"No shared calendars" => "No hi ha calendaris compartits", -"Share Calendar" => "Comparteix el calendari", -"Download" => "Baixa", -"Edit" => "Edita", -"Delete" => "Suprimeix", -"shared with you by" => "compartit amb vós", -"New calendar" => "Calendari nou", -"Edit calendar" => "Edita el calendari", -"Displayname" => "Mostra el nom", -"Active" => "Actiu", -"Calendar color" => "Color del calendari", -"Save" => "Desa", -"Submit" => "Envia", -"Cancel" => "Cancel·la", -"Edit an event" => "Edició d'un esdeveniment", -"Export" => "Exporta", -"Eventinfo" => "Eventinfo", -"Repeating" => "Repetició", -"Alarm" => "Alarma", -"Attendees" => "Assistents", -"Share" => "Comparteix", -"Title of the Event" => "Títol de l'esdeveniment", -"Category" => "Categoria", -"Separate categories with commas" => "Separeu les categories amb comes", -"Edit categories" => "Edita categories", -"All Day Event" => "Esdeveniment de tot el dia", -"From" => "Des de", -"To" => "Fins a", -"Advanced options" => "Opcions avançades", -"Location" => "Ubicació", -"Location of the Event" => "Ubicació de l'esdeveniment", -"Description" => "Descripció", -"Description of the Event" => "Descripció de l'esdeveniment", -"Repeat" => "Repetició", -"Advanced" => "Avançat", -"Select weekdays" => "Dies de la setmana seleccionats", -"Select days" => "Seleccionar dies", -"and the events day of year." => "i dies d'esdeveniment de l'any.", -"and the events day of month." => "i dies d'esdeveniment del mes.", -"Select months" => "Seleccionar mesos", -"Select weeks" => "Seleccionar setmanes", -"and the events week of year." => "i setmanes d'esdeveniment de l'any.", -"Interval" => "Interval", -"End" => "Final", -"occurrences" => "aparicions", -"create a new calendar" => "crea un nou calendari", -"Import a calendar file" => "Importa un fitxer de calendari", -"Please choose a calendar" => "Escolliu un calendari", -"Name of new calendar" => "Nom del nou calendari", -"Take an available name!" => "Escolliu un nom disponible!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ja hi ha un calendari amb aquest nom. Si continueu, els calendaris es combinaran.", -"Import" => "Importa", -"Close Dialog" => "Tanca el diàleg", -"Create a new event" => "Crea un nou esdeveniment", -"View an event" => "Mostra un event", -"No categories selected" => "No hi ha categories seleccionades", -"of" => "de", -"at" => "a", -"General" => "General", -"Timezone" => "Zona horària", -"Update timezone automatically" => "Actualitza la zona horària automàticament", -"Time format" => "Format horari", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "Comença la setmana en ", -"Cache" => "Memòria de cau", -"Clear cache for repeating events" => "Neteja la memòria de cau pels esdeveniments amb repetició", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "Adreça de sincronització del calendari CalDAV", -"more info" => "més informació", -"Primary address (Kontact et al)" => "Adreça primària (Kontact et al)", -"iOS/OS X" => "IOS/OS X", -"Read only iCalendar link(s)" => "Enllaç(os) iCalendar només de lectura", -"Users" => "Usuaris", -"select users" => "seleccioneu usuaris", -"Editable" => "Editable", -"Groups" => "Grups", -"select groups" => "seleccioneu grups", -"make public" => "fes-ho public" -); diff --git a/apps/calendar/l10n/cs_CZ.php b/apps/calendar/l10n/cs_CZ.php deleted file mode 100644 index ab76cc49d1..0000000000 --- a/apps/calendar/l10n/cs_CZ.php +++ /dev/null @@ -1,198 +0,0 @@ - "V paměti nejsou uloženy kompletně všechny kalendáře", -"Everything seems to be completely cached" => "Zdá se, že vše je kompletně uloženo v paměti", -"No calendars found." => "Žádné kalendáře nenalezeny.", -"No events found." => "Žádné události nenalezeny.", -"Wrong calendar" => "Nesprávný kalendář", -"The file contained either no events or all events are already saved in your calendar." => "Soubor, obsahující všechny záznamy nebo je prázdný, je již uložen ve Vašem kalendáři.", -"events has been saved in the new calendar" => "Záznam byl uložen v novém kalendáři", -"Import failed" => "Import selhal", -"events has been saved in your calendar" => "záznamů bylo uloženo ve Vašem kalendáři", -"New Timezone:" => "Nová časová zóna:", -"Timezone changed" => "Časová zóna byla změněna", -"Invalid request" => "Chybný požadavek", -"Calendar" => "Kalendář", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM rrrr", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '—' d.[ MMM] yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, rrrr", -"Birthday" => "Narozeniny", -"Business" => "Obchodní", -"Call" => "Hovor", -"Clients" => "Klienti", -"Deliverer" => "Doručovatel", -"Holidays" => "Prázdniny", -"Ideas" => "Nápady", -"Journey" => "Cesta", -"Jubilee" => "Výročí", -"Meeting" => "Schůzka", -"Other" => "Další", -"Personal" => "Osobní", -"Projects" => "Projekty", -"Questions" => "Dotazy", -"Work" => "Pracovní", -"by" => "od", -"unnamed" => "nepojmenováno", -"New Calendar" => "Nový kalendář", -"Does not repeat" => "Neopakuje se", -"Daily" => "Denně", -"Weekly" => "Týdně", -"Every Weekday" => "Každý všední den", -"Bi-Weekly" => "Jednou za dva týdny", -"Monthly" => "Měsíčně", -"Yearly" => "Ročně", -"never" => "nikdy", -"by occurrences" => "podle výskytu", -"by date" => "podle data", -"by monthday" => "podle dne v měsíci", -"by weekday" => "podle dne v týdnu", -"Monday" => "Pondělí", -"Tuesday" => "Úterý", -"Wednesday" => "Středa", -"Thursday" => "Čtvrtek", -"Friday" => "Pátek", -"Saturday" => "Sobota", -"Sunday" => "Neděle", -"events week of month" => "týdenní události v měsíci", -"first" => "první", -"second" => "druhý", -"third" => "třetí", -"fourth" => "čtvrtý", -"fifth" => "pátý", -"last" => "poslední", -"January" => "Leden", -"February" => "Únor", -"March" => "Březen", -"April" => "Duben", -"May" => "Květen", -"June" => "Červen", -"July" => "Červenec", -"August" => "Srpen", -"September" => "Září", -"October" => "Říjen", -"November" => "Listopad", -"December" => "Prosinec", -"by events date" => "podle data události", -"by yearday(s)" => "po dni (dnech)", -"by weeknumber(s)" => "podle čísel týdnů", -"by day and month" => "podle dne a měsíce", -"Date" => "Datum", -"Cal." => "Kal.", -"Sun." => "Ne", -"Mon." => "Po", -"Tue." => "Út", -"Wed." => "St", -"Thu." => "Čt", -"Fri." => "Pá", -"Sat." => "So", -"Jan." => "Ne", -"Feb." => "únor", -"Mar." => "březen", -"Apr." => "duben", -"May." => "květen", -"Jun." => "červen", -"Jul." => "červenec", -"Aug." => "srpen", -"Sep." => "září", -"Oct." => "říjen", -"Nov." => "listopad", -"Dec." => "prosinec", -"All day" => "Celý den", -"Missing fields" => "Chybějící pole", -"Title" => "Název", -"From Date" => "Od data", -"From Time" => "Od", -"To Date" => "Do data", -"To Time" => "Do", -"The event ends before it starts" => "Akce končí před zahájením", -"There was a database fail" => "Chyba v databázi", -"Week" => "týden", -"Month" => "měsíc", -"List" => "Seznam", -"Today" => "dnes", -"Settings" => "Nastavení", -"Your calendars" => "Vaše kalendáře", -"CalDav Link" => "CalDav odkaz", -"Shared calendars" => "Sdílené kalendáře", -"No shared calendars" => "Žádné sdílené kalendáře", -"Share Calendar" => "Sdílet kalendář", -"Download" => "Stáhnout", -"Edit" => "Editovat", -"Delete" => "Odstranit", -"shared with you by" => "sdíleno s vámi uživatelem", -"New calendar" => "Nový kalendář", -"Edit calendar" => "Editovat kalendář", -"Displayname" => "Zobrazované jméno", -"Active" => "Aktivní", -"Calendar color" => "Barva kalendáře", -"Save" => "Uložit", -"Submit" => "Potvrdit", -"Cancel" => "Storno", -"Edit an event" => "Editovat událost", -"Export" => "Export", -"Eventinfo" => "Informace o události", -"Repeating" => "Opakující se", -"Alarm" => "Alarm", -"Attendees" => "Účastníci", -"Share" => "Sdílet", -"Title of the Event" => "Název události", -"Category" => "Kategorie", -"Separate categories with commas" => "Kategorie oddělené čárkami", -"Edit categories" => "Upravit kategorie", -"All Day Event" => "Celodenní událost", -"From" => "od", -"To" => "do", -"Advanced options" => "Pokročilé volby", -"Location" => "Umístění", -"Location of the Event" => "Místo konání události", -"Description" => "Popis", -"Description of the Event" => "Popis události", -"Repeat" => "Opakování", -"Advanced" => "Pokročilé", -"Select weekdays" => "Vybrat dny v týdnu", -"Select days" => "Vybrat dny", -"and the events day of year." => "a denní události v roce", -"and the events day of month." => "a denní události v měsíci", -"Select months" => "Vybrat měsíce", -"Select weeks" => "Vybrat týdny", -"and the events week of year." => "a týden s událostmi v roce", -"Interval" => "Interval", -"End" => "Konec", -"occurrences" => "výskyty", -"create a new calendar" => "vytvořit nový kalendář", -"Import a calendar file" => "Importovat soubor kalendáře", -"Please choose a calendar" => "Vyberte prosím kalendář", -"Name of new calendar" => "Název nového kalendáře", -"Take an available name!" => "Použijte volné jméno!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Kalendář s trímto názvem již existuje. Pokud název použijete, stejnojmenné kalendáře budou sloučeny.", -"Import" => "Import", -"Close Dialog" => "Zavřít dialog", -"Create a new event" => "Vytvořit novou událost", -"View an event" => "Zobrazit událost", -"No categories selected" => "Žádné kategorie nevybrány", -"of" => "z", -"at" => "v", -"General" => "Hlavní", -"Timezone" => "Časové pásmo", -"Update timezone automatically" => "Obnovit auronaricky časovou zónu.", -"Time format" => "Formát času", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "Týden začína v", -"Cache" => "Paměť", -"Clear cache for repeating events" => "Vymazat paměť pro opakuijísí se záznamy", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "Kalendář CalDAV synchronizuje adresy", -"more info" => "podrobnosti", -"Primary address (Kontact et al)" => "Primární adresa (veřejná)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Odkaz(y) kalendáře pouze pro čtení", -"Users" => "Uživatelé", -"select users" => "vybrat uživatele", -"Editable" => "Upravovatelné", -"Groups" => "Skupiny", -"select groups" => "vybrat skupiny", -"make public" => "zveřejnit" -); diff --git a/apps/calendar/l10n/da.php b/apps/calendar/l10n/da.php deleted file mode 100644 index ea07fadb73..0000000000 --- a/apps/calendar/l10n/da.php +++ /dev/null @@ -1,188 +0,0 @@ - "Ikke alle kalendere er fuldstændig cached", -"No calendars found." => "Der blev ikke fundet nogen kalendere.", -"No events found." => "Der blev ikke fundet nogen begivenheder.", -"Wrong calendar" => "Forkert kalender", -"The file contained either no events or all events are already saved in your calendar." => "Filen indeholdt enten ingen begivenheder eller alle begivenheder er allerede gemt i din kalender.", -"events has been saved in the new calendar" => "begivenheder er gemt i den nye kalender", -"Import failed" => "import mislykkedes", -"events has been saved in your calendar" => "begivenheder er gemt i din kalender", -"New Timezone:" => "Ny tidszone:", -"Timezone changed" => "Tidszone ændret", -"Invalid request" => "Ugyldig forespørgsel", -"Calendar" => "Kalender", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM åååå", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ åååå]{ '—'[ MMM] d åååå}", -"dddd, MMM d, yyyy" => "dddd, MMM d, åååå", -"Birthday" => "Fødselsdag", -"Business" => "Forretning", -"Call" => "Ring", -"Clients" => "Kunder", -"Deliverer" => "Leverance", -"Holidays" => "Helligdage", -"Ideas" => "Ideér", -"Journey" => "Rejse", -"Jubilee" => "Jubilæum", -"Meeting" => "Møde", -"Other" => "Andet", -"Personal" => "Privat", -"Projects" => "Projekter", -"Questions" => "Spørgsmål", -"Work" => "Arbejde", -"by" => "af", -"unnamed" => "unavngivet", -"New Calendar" => "Ny Kalender", -"Does not repeat" => "Gentages ikke", -"Daily" => "Daglig", -"Weekly" => "Ugentlig", -"Every Weekday" => "Alle hverdage", -"Bi-Weekly" => "Hver anden uge", -"Monthly" => "Månedlig", -"Yearly" => "Årlig", -"never" => "aldrig", -"by occurrences" => "efter forekomster", -"by date" => "efter dato", -"by monthday" => "efter dag i måneden", -"by weekday" => "efter ugedag", -"Monday" => "Mandag", -"Tuesday" => "Tirsdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lørdag", -"Sunday" => "øndag", -"events week of month" => "begivenhedens uge i måneden", -"first" => "første", -"second" => "anden", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "sidste", -"January" => "Januar", -"February" => "Februar", -"March" => "Marts", -"April" => "April", -"May" => "Maj", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "efter begivenheders dato", -"by yearday(s)" => "efter dag(e) i året", -"by weeknumber(s)" => "efter ugenummer/-numre", -"by day and month" => "efter dag og måned", -"Date" => "Dato", -"Cal." => "Kal.", -"Sun." => "Søn.", -"Mon." => "Man.", -"Tue." => "Tir.", -"Wed." => "Ons.", -"Thu." => "Tor.", -"Fri." => "Fre.", -"Sat." => "Lør.", -"Jan." => "Jan.", -"Feb." => "Feb.", -"Mar." => "Mar.", -"Apr." => "Apr.", -"May." => "Maj", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Aug.", -"Sep." => "Sep.", -"Oct." => "Okt.", -"Nov." => "Nov.", -"Dec." => "Dec.", -"All day" => "Hele dagen", -"Missing fields" => "Manglende felter", -"Title" => "Titel", -"From Date" => "Fra dato", -"From Time" => "Fra tidspunkt", -"To Date" => "Til dato", -"To Time" => "Til tidspunkt", -"The event ends before it starts" => "Begivenheden slutter, inden den begynder", -"There was a database fail" => "Der var en fejl i databasen", -"Week" => "Uge", -"Month" => "Måned", -"List" => "Liste", -"Today" => "I dag", -"Settings" => "Indstillinger", -"Your calendars" => "Dine kalendere", -"CalDav Link" => "CalDav-link", -"Shared calendars" => "Delte kalendere", -"No shared calendars" => "Ingen delte kalendere", -"Share Calendar" => "Del kalender", -"Download" => "Hent", -"Edit" => "Rediger", -"Delete" => "Slet", -"shared with you by" => "delt af dig", -"New calendar" => "Ny kalender", -"Edit calendar" => "Rediger kalender", -"Displayname" => "Vist navn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarve", -"Save" => "Gem", -"Submit" => "Send", -"Cancel" => "Annuller", -"Edit an event" => "Redigér en begivenhed", -"Export" => "Eksporter", -"Eventinfo" => "Begivenhedsinfo", -"Repeating" => "Gentagende", -"Alarm" => "Alarm", -"Attendees" => "Deltagere", -"Share" => "Del", -"Title of the Event" => "Titel på begivenheden", -"Category" => "Kategori", -"Separate categories with commas" => "Opdel kategorier med kommaer", -"Edit categories" => "Rediger kategorier", -"All Day Event" => "Heldagsarrangement", -"From" => "Fra", -"To" => "Til", -"Advanced options" => "Avancerede indstillinger", -"Location" => "Sted", -"Location of the Event" => "Placering af begivenheden", -"Description" => "Beskrivelse", -"Description of the Event" => "Beskrivelse af begivenheden", -"Repeat" => "Gentag", -"Advanced" => "Avanceret", -"Select weekdays" => "Vælg ugedage", -"Select days" => "Vælg dage", -"and the events day of year." => "og begivenhedens dag i året.", -"and the events day of month." => "og begivenhedens sag på måneden", -"Select months" => "Vælg måneder", -"Select weeks" => "Vælg uger", -"and the events week of year." => "og begivenhedens uge i året.", -"Interval" => "Interval", -"End" => "Afslutning", -"occurrences" => "forekomster", -"create a new calendar" => "opret en ny kalender", -"Import a calendar file" => "Importer en kalenderfil", -"Please choose a calendar" => "Vælg en kalender", -"Name of new calendar" => "Navn på ny kalender", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med dette navn findes allerede. Hvis du fortsætter alligevel, vil disse kalendere blive sammenlagt.", -"Import" => "Importer", -"Close Dialog" => "Luk dialog", -"Create a new event" => "Opret en ny begivenhed", -"View an event" => "Vis en begivenhed", -"No categories selected" => "Ingen categorier valgt", -"of" => "fra", -"at" => "kl.", -"General" => "Generel", -"Timezone" => "Tidszone", -"Update timezone automatically" => "Opdater tidszone automatisk", -"24h" => "24T", -"12h" => "12T", -"more info" => "flere oplysninger", -"iOS/OS X" => "iOS/OS X", -"Users" => "Brugere", -"select users" => "Vælg brugere", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "Vælg grupper", -"make public" => "Offentliggør" -); diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php deleted file mode 100644 index 223e80effb..0000000000 --- a/apps/calendar/l10n/de.php +++ /dev/null @@ -1,198 +0,0 @@ - "Noch sind nicht alle Kalender zwischengespeichert.", -"Everything seems to be completely cached" => "Es sieht so aus, als wäre alles vollständig zwischengespeichert.", -"No calendars found." => "Keine Kalender gefunden.", -"No events found." => "Keine Termine gefunden.", -"Wrong calendar" => "Falscher Kalender", -"The file contained either no events or all events are already saved in your calendar." => "Entweder enthielt die Datei keine Termine oder alle Termine waren bereits im Kalender gespeichert.", -"events has been saved in the new calendar" => "Der Termin wurde im neuen Kalender gespeichert.", -"Import failed" => "Import fehlgeschlagen", -"events has been saved in your calendar" => "Der Termin wurde im Kalender gespeichert.", -"New Timezone:" => "Neue Zeitzone:", -"Timezone changed" => "Zeitzone geändert", -"Invalid request" => "Fehlerhafte Anfrage", -"Calendar" => "Kalender", -"ddd" => "ddd", -"ddd M/d" => "ddd d.M", -"dddd M/d" => "dddd d.M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, d. MMM yyyy", -"Birthday" => "Geburtstag", -"Business" => "Geschäftlich", -"Call" => "Anruf", -"Clients" => "Kunden", -"Deliverer" => "Lieferant", -"Holidays" => "Urlaub", -"Ideas" => "Ideen", -"Journey" => "Reise", -"Jubilee" => "Jubiläum", -"Meeting" => "Treffen", -"Other" => "Anderes", -"Personal" => "Persönlich", -"Projects" => "Projekte", -"Questions" => "Fragen", -"Work" => "Arbeit", -"by" => "von", -"unnamed" => "unbenannt", -"New Calendar" => "Neuer Kalender", -"Does not repeat" => "einmalig", -"Daily" => "täglich", -"Weekly" => "wöchentlich", -"Every Weekday" => "jeden Wochentag", -"Bi-Weekly" => "jede zweite Woche", -"Monthly" => "monatlich", -"Yearly" => "jährlich", -"never" => "niemals", -"by occurrences" => "nach Terminen", -"by date" => "nach Datum", -"by monthday" => "an einem Monatstag", -"by weekday" => "an einem Wochentag", -"Monday" => "Montag", -"Tuesday" => "Dienstag", -"Wednesday" => "Mittwoch", -"Thursday" => "Donnerstag", -"Friday" => "Freitag", -"Saturday" => "Samstag", -"Sunday" => "Sonntag", -"events week of month" => "Woche des Monats vom Termin", -"first" => "erste", -"second" => "zweite", -"third" => "dritte", -"fourth" => "vierte", -"fifth" => "fünfte", -"last" => "letzte", -"January" => "Januar", -"February" => "Februar", -"March" => "März", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Dezember", -"by events date" => "nach Tag des Termins", -"by yearday(s)" => "nach Tag des Jahres", -"by weeknumber(s)" => "nach Wochennummer", -"by day and month" => "nach Tag und Monat", -"Date" => "Datum", -"Cal." => "Kal.", -"Sun." => "So", -"Mon." => "Mo", -"Tue." => "Di", -"Wed." => "Mi", -"Thu." => "Do", -"Fri." => "Fr", -"Sat." => "Sa", -"Jan." => "Jan.", -"Feb." => "Feb.", -"Mar." => "Mär.", -"Apr." => "Apr.", -"May." => "Mai", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Aug.", -"Sep." => "Sep.", -"Oct." => "Okt.", -"Nov." => "Nov.", -"Dec." => "Dez.", -"All day" => "Ganztags", -"Missing fields" => "fehlende Felder", -"Title" => "Titel", -"From Date" => "Startdatum", -"From Time" => "Startzeit", -"To Date" => "Enddatum", -"To Time" => "Endzeit", -"The event ends before it starts" => "Der Termin hört auf, bevor er angefangen hat.", -"There was a database fail" => "Datenbankfehler", -"Week" => "Woche", -"Month" => "Monat", -"List" => "Liste", -"Today" => "Heute", -"Settings" => "Einstellungen", -"Your calendars" => "Deine Kalender", -"CalDav Link" => "CalDAV-Link", -"Shared calendars" => "Geteilte Kalender", -"No shared calendars" => "Keine geteilten Kalender", -"Share Calendar" => "Kalender teilen", -"Download" => "Herunterladen", -"Edit" => "Bearbeiten", -"Delete" => "Löschen", -"shared with you by" => "Geteilt mit dir von", -"New calendar" => "Neuer Kalender", -"Edit calendar" => "Kalender bearbeiten", -"Displayname" => "Anzeigename", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarbe", -"Save" => "Speichern", -"Submit" => "Bestätigen", -"Cancel" => "Abbrechen", -"Edit an event" => "Ereignis bearbeiten", -"Export" => "Exportieren", -"Eventinfo" => "Termininfo", -"Repeating" => "Wiederholen", -"Alarm" => "Alarm", -"Attendees" => "Teilnehmer", -"Share" => "Teilen", -"Title of the Event" => "Name", -"Category" => "Kategorie", -"Separate categories with commas" => "Kategorien mit Kommas trennen", -"Edit categories" => "Kategorien ändern", -"All Day Event" => "Ganztägiges Ereignis", -"From" => "von", -"To" => "bis", -"Advanced options" => "Erweiterte Optionen", -"Location" => "Ort", -"Location of the Event" => "Ort", -"Description" => "Beschreibung", -"Description of the Event" => "Beschreibung", -"Repeat" => "wiederholen", -"Advanced" => "Erweitert", -"Select weekdays" => "Wochentage auswählen", -"Select days" => "Tage auswählen", -"and the events day of year." => "und den Tag des Jahres vom Termin", -"and the events day of month." => "und den Tag des Monats vom Termin", -"Select months" => "Monate auswählen", -"Select weeks" => "Wochen auswählen", -"and the events week of year." => "und den Tag des Jahres vom Termin", -"Interval" => "Intervall", -"End" => "Ende", -"occurrences" => "Termine", -"create a new calendar" => "Neuen Kalender anlegen", -"Import a calendar file" => "Kalenderdatei importieren", -"Please choose a calendar" => "Wählen Sie bitte einen Kalender.", -"Name of new calendar" => "Kalendername", -"Take an available name!" => "Wählen Sie einen verfügbaren Namen.", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ein Kalender mit diesem Namen existiert bereits. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt.", -"Import" => "Importieren", -"Close Dialog" => "Dialog schließen", -"Create a new event" => "Neues Ereignis", -"View an event" => "Termin öffnen", -"No categories selected" => "Keine Kategorie ausgewählt", -"of" => "von", -"at" => "um", -"General" => "Allgemein", -"Timezone" => "Zeitzone", -"Update timezone automatically" => "Zeitzone automatisch aktualisieren", -"Time format" => "Zeitformat", -"24h" => "24 Stunden", -"12h" => "12 Stunden", -"Start week on" => "Erster Wochentag", -"Cache" => "Zwischenspeicher", -"Clear cache for repeating events" => "Lösche den Zwischenspeicher für wiederholende Veranstaltungen", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "CalDAV-Kalender gleicht Adressen ab", -"more info" => "weitere Informationen", -"Primary address (Kontact et al)" => "Primäre Adresse (Kontakt u.a.)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Nur lesende(r) iCalender-Link(s)", -"Users" => "Benutzer", -"select users" => "Benutzer auswählen", -"Editable" => "editierbar", -"Groups" => "Gruppen", -"select groups" => "Gruppen auswählen", -"make public" => "Veröffentlichen" -); diff --git a/apps/calendar/l10n/el.php b/apps/calendar/l10n/el.php deleted file mode 100644 index ad07d7b585..0000000000 --- a/apps/calendar/l10n/el.php +++ /dev/null @@ -1,192 +0,0 @@ - "Δεν έχει δημιουργηθεί λανθάνουσα μνήμη για όλα τα ημερολόγια", -"Everything seems to be completely cached" => "Όλα έχουν αποθηκευτεί στη cache", -"No calendars found." => "Δε βρέθηκαν ημερολόγια.", -"No events found." => "Δε βρέθηκαν γεγονότα.", -"Wrong calendar" => "Λάθος ημερολόγιο", -"The file contained either no events or all events are already saved in your calendar." => "Το αρχείο που περιέχει είτε κανένα γεγονός είτε όλα τα γεγονότα έχουν ήδη αποθηκευτεί στο ημερολόγιό σας.", -"events has been saved in the new calendar" => "τα συμβάντα αποθηκεύτηκαν σε ένα νέο ημερολόγιο", -"Import failed" => "Η εισαγωγή απέτυχε", -"events has been saved in your calendar" => "το συμβάν αποθηκεύτηκε στο ημερολογιό σου", -"New Timezone:" => "Νέα ζώνη ώρας:", -"Timezone changed" => "Η ζώνη ώρας άλλαξε", -"Invalid request" => "Μη έγκυρο αίτημα", -"Calendar" => "Ημερολόγιο", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Γενέθλια", -"Business" => "Επιχείρηση", -"Call" => "Κλήση", -"Clients" => "Πελάτες", -"Deliverer" => "Προμηθευτής", -"Holidays" => "Διακοπές", -"Ideas" => "Ιδέες", -"Journey" => "Ταξίδι", -"Jubilee" => "Γιορτή", -"Meeting" => "Συνάντηση", -"Other" => "Άλλο", -"Personal" => "Προσωπικό", -"Projects" => "Έργα", -"Questions" => "Ερωτήσεις", -"Work" => "Εργασία", -"by" => "από", -"unnamed" => "ανώνυμο", -"New Calendar" => "Νέα Ημερολόγιο", -"Does not repeat" => "Μη επαναλαμβανόμενο", -"Daily" => "Καθημερινά", -"Weekly" => "Εβδομαδιαία", -"Every Weekday" => "Κάθε μέρα", -"Bi-Weekly" => "Δύο φορές την εβδομάδα", -"Monthly" => "Μηνιαία", -"Yearly" => "Ετήσια", -"never" => "ποτέ", -"by occurrences" => "κατά συχνότητα πρόσβασης", -"by date" => "κατά ημερομηνία", -"by monthday" => "κατά ημέρα", -"by weekday" => "κατά εβδομάδα", -"Monday" => "Δευτέρα", -"Tuesday" => "Τρίτη", -"Wednesday" => "Τετάρτη", -"Thursday" => "Πέμπτη", -"Friday" => "Παρασκευή", -"Saturday" => "Σάββατο", -"Sunday" => "Κυριακή", -"events week of month" => "συμβάντα της εβδομάδας του μήνα", -"first" => "πρώτο", -"second" => "δεύτερο", -"third" => "τρίτο", -"fourth" => "τέταρτο", -"fifth" => "πέμπτο", -"last" => "τελευταίο", -"January" => "Ιανουάριος", -"February" => "Φεβρουάριος", -"March" => "Μάρτιος", -"April" => "Απρίλιος", -"May" => "Μάϊος", -"June" => "Ιούνιος", -"July" => "Ιούλιος", -"August" => "Αύγουστος", -"September" => "Σεπτέμβριος", -"October" => "Οκτώβριος", -"November" => "Νοέμβριος", -"December" => "Δεκέμβριος", -"by events date" => "κατά ημερομηνία συμβάντων", -"by yearday(s)" => "κατά ημέρα(ες) του έτους", -"by weeknumber(s)" => "κατά εβδομάδα(ες)", -"by day and month" => "κατά ημέρα και μήνα", -"Date" => "Ημερομηνία", -"Cal." => "Ημερ.", -"Sun." => "Κυρ.", -"Mon." => "Δευ.", -"Tue." => "Τρί.", -"Wed." => "Τετ.", -"Thu." => "Πέμ.", -"Fri." => "Παρ.", -"Sat." => "Σάβ.", -"Jan." => "Ιαν.", -"Feb." => "Φεβ.", -"Mar." => "Μάρ.", -"Apr." => "Απρ.", -"May." => "Μαΐ.", -"Jun." => "Ιούν.", -"Jul." => "Ιούλ.", -"Aug." => "Αύγ.", -"Sep." => "Σεπ.", -"Oct." => "Οκτ.", -"Nov." => "Νοέ.", -"Dec." => "Δεκ.", -"All day" => "Ολοήμερο", -"Missing fields" => "Πεδία που λείπουν", -"Title" => "Τίτλος", -"From Date" => "Από Ημερομηνία", -"From Time" => "Από Ώρα", -"To Date" => "Έως Ημερομηνία", -"To Time" => "Έως Ώρα", -"The event ends before it starts" => "Το συμβάν ολοκληρώνεται πριν από την έναρξή του", -"There was a database fail" => "Υπήρξε σφάλμα στη βάση δεδομένων", -"Week" => "Εβδομάδα", -"Month" => "Μήνας", -"List" => "Λίστα", -"Today" => "Σήμερα", -"Your calendars" => "Τα ημερολόγια σου", -"CalDav Link" => "Σύνδεση CalDAV", -"Shared calendars" => "Κοινόχρηστα ημερολόγια", -"No shared calendars" => "Δεν υπάρχουν κοινόχρηστα ημερολόγια", -"Share Calendar" => "Διαμοίρασε ένα ημερολόγιο", -"Download" => "Λήψη", -"Edit" => "Επεξεργασία", -"Delete" => "Διαγραφή", -"shared with you by" => "μοιράστηκε μαζί σας από ", -"New calendar" => "Νέο ημερολόγιο", -"Edit calendar" => "Επεξεργασία ημερολογίου", -"Displayname" => "Προβολή ονόματος", -"Active" => "Ενεργό", -"Calendar color" => "Χρώμα ημερολογίου", -"Save" => "Αποθήκευση", -"Submit" => "Υποβολή", -"Cancel" => "Ακύρωση", -"Edit an event" => "Επεξεργασία ενός γεγονότος", -"Export" => "Εξαγωγή", -"Eventinfo" => "Πληροφορίες γεγονότος", -"Repeating" => "Επαναλαμβανόμενο", -"Alarm" => "Ειδοποίηση", -"Attendees" => "Συμμετέχοντες", -"Share" => "Διαμοίρασε", -"Title of the Event" => "Τίτλος συμβάντος", -"Category" => "Κατηγορία", -"Separate categories with commas" => "Διαχώρισε τις κατηγορίες με κόμμα", -"Edit categories" => "Επεξεργασία κατηγοριών", -"All Day Event" => "Ολοήμερο συμβάν", -"From" => "Από", -"To" => "Έως", -"Advanced options" => "Επιλογές για προχωρημένους", -"Location" => "Τοποθεσία", -"Location of the Event" => "Τοποθεσία συμβάντος", -"Description" => "Περιγραφή", -"Description of the Event" => "Περιγραφή του συμβάντος", -"Repeat" => "Επαναλαμβανόμενο", -"Advanced" => "Για προχωρημένους", -"Select weekdays" => "Επιλογή ημερών εβδομάδας", -"Select days" => "Επιλογή ημερών", -"and the events day of year." => "και των ημερών του χρόνου που υπάρχουν συμβάντα.", -"and the events day of month." => "και των ημερών του μήνα που υπάρχουν συμβάντα.", -"Select months" => "Επιλογή μηνών", -"Select weeks" => "Επιλογή εβδομάδων", -"and the events week of year." => "και των εβδομάδων του χρόνου που υπάρουν συμβάντα.", -"Interval" => "Διάστημα", -"End" => "Τέλος", -"occurrences" => "περιστατικά", -"create a new calendar" => "δημιουργία νέου ημερολογίου", -"Import a calendar file" => "Εισαγωγή αρχείου ημερολογίου", -"Please choose a calendar" => "Παρακαλώ επέλεξε ένα ημερολόγιο", -"Name of new calendar" => "Όνομα νέου ημερολογίου", -"Take an available name!" => "Επέλεξε ένα διαθέσιμο όνομα!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ένα ημερολόγιο με αυτό το όνομα υπάρχει ήδη. Εάν θέλετε να συνεχίσετε, αυτά τα 2 ημερολόγια θα συγχωνευθούν.", -"Import" => "Εισαγωγή", -"Close Dialog" => "Κλείσιμο Διαλόγου", -"Create a new event" => "Δημιουργήστε ένα νέο συμβάν", -"View an event" => "Εμφάνισε ένα γεγονός", -"No categories selected" => "Δεν επελέγησαν κατηγορίες", -"of" => "του", -"at" => "στο", -"Timezone" => "Ζώνη ώρας", -"24h" => "24ω", -"12h" => "12ω", -"Cache" => "Cache", -"Clear cache for repeating events" => "Εκκαθάριση λανθάνουσας μνήμης για επανάληψη γεγονότων", -"Calendar CalDAV syncing addresses" => "Διευθύνσεις συγχρονισμού ημερολογίου CalDAV", -"more info" => "περισσότερες πλροφορίες", -"Primary address (Kontact et al)" => "Κύρια Διεύθυνση(Επαφή και άλλα)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => " iCalendar link(s) μόνο για ανάγνωση", -"Users" => "Χρήστες", -"select users" => "επέλεξε χρήστες", -"Editable" => "Επεξεργάσιμο", -"Groups" => "Ομάδες", -"select groups" => "Επέλεξε ομάδες", -"make public" => "κάνε το δημόσιο" -); diff --git a/apps/calendar/l10n/eo.php b/apps/calendar/l10n/eo.php deleted file mode 100644 index be3db9bfae..0000000000 --- a/apps/calendar/l10n/eo.php +++ /dev/null @@ -1,198 +0,0 @@ - "Ne ĉiuj kalendaroj estas tute kaŝmemorigitaj", -"Everything seems to be completely cached" => "Ĉio ŝajnas tute kaŝmemorigita", -"No calendars found." => "Neniu kalendaro troviĝis.", -"No events found." => "Neniu okazaĵo troviĝis.", -"Wrong calendar" => "Malĝusta kalendaro", -"The file contained either no events or all events are already saved in your calendar." => "Aŭ la dosiero enhavas neniun okazaĵon aŭ ĉiuj okazaĵoj jam estas konservitaj en via kalendaro.", -"events has been saved in the new calendar" => "okazaĵoj estas konservitaj en la nova kalendaro", -"Import failed" => "Enporto malsukcesis", -"events has been saved in your calendar" => "okazaĵoj estas konservitaj en via kalendaro", -"New Timezone:" => "Nova horozono:", -"Timezone changed" => "La horozono estas ŝanĝita", -"Invalid request" => "Nevalida peto", -"Calendar" => "Kalendaro", -"ddd" => "ddd", -"ddd M/d" => "ddd d/M", -"dddd M/d" => "dddd d/M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—'d[ MMM] yyyy}", -"dddd, MMM d, yyyy" => "dddd, d-a de MMM yyyy", -"Birthday" => "Naskiĝotago", -"Business" => "Negoco", -"Call" => "Voko", -"Clients" => "Klientoj", -"Deliverer" => "Livero", -"Holidays" => "Ferioj", -"Ideas" => "Ideoj", -"Journey" => "Vojaĝo", -"Jubilee" => "Jubileo", -"Meeting" => "Rendevuo", -"Other" => "Alia", -"Personal" => "Persona", -"Projects" => "Projektoj", -"Questions" => "Demandoj", -"Work" => "Laboro", -"by" => "de", -"unnamed" => "nenomita", -"New Calendar" => "Nova kalendaro", -"Does not repeat" => "Ĉi tio ne ripetiĝas", -"Daily" => "Tage", -"Weekly" => "Semajne", -"Every Weekday" => "Labortage", -"Bi-Weekly" => "Semajnduope", -"Monthly" => "Monate", -"Yearly" => "Jare", -"never" => "neniam", -"by occurrences" => "laŭ aperoj", -"by date" => "laŭ dato", -"by monthday" => "laŭ monattago", -"by weekday" => "laŭ semajntago", -"Monday" => "lundo", -"Tuesday" => "mardo", -"Wednesday" => "merkredo", -"Thursday" => "ĵaŭdo", -"Friday" => "vendredo", -"Saturday" => "sabato", -"Sunday" => "dimanĉo", -"events week of month" => "la monatsemajno de la okazaĵo", -"first" => "unua", -"second" => "dua", -"third" => "tria", -"fourth" => "kvara", -"fifth" => "kvina", -"last" => "lasta", -"January" => "Januaro", -"February" => "Februaro", -"March" => "Marto", -"April" => "Aprilo", -"May" => "Majo", -"June" => "Junio", -"July" => "Julio", -"August" => "Aŭgusto", -"September" => "Septembro", -"October" => "Oktobro", -"November" => "Novembro", -"December" => "Decembro", -"by events date" => "laŭ okazaĵdato", -"by yearday(s)" => "laŭ jartago(j)", -"by weeknumber(s)" => "laŭ semajnnumero(j)", -"by day and month" => "laŭ tago kaj monato", -"Date" => "Dato", -"Cal." => "Kal.", -"Sun." => "dim.", -"Mon." => "lun.", -"Tue." => "mar.", -"Wed." => "mer.", -"Thu." => "ĵaŭ.", -"Fri." => "ven.", -"Sat." => "sab.", -"Jan." => "Jan.", -"Feb." => "Feb.", -"Mar." => "Mar.", -"Apr." => "Apr.", -"May." => "Maj.", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Aŭg.", -"Sep." => "Sep.", -"Oct." => "Okt.", -"Nov." => "Nov.", -"Dec." => "Dec.", -"All day" => "La tuta tago", -"Missing fields" => "Mankas iuj kampoj", -"Title" => "Titolo", -"From Date" => "ekde la dato", -"From Time" => "ekde la horo", -"To Date" => "ĝis la dato", -"To Time" => "ĝis la horo", -"The event ends before it starts" => "La okazaĵo finas antaŭ komenci", -"There was a database fail" => "Datumbaza malsukceso okazis", -"Week" => "Semajno", -"Month" => "Monato", -"List" => "Listo", -"Today" => "Hodiaŭ", -"Settings" => "Agordo", -"Your calendars" => "Viaj kalendaroj", -"CalDav Link" => "CalDav-a ligilo", -"Shared calendars" => "Kunhavigitaj kalendaroj", -"No shared calendars" => "Neniu kunhavigita kalendaro", -"Share Calendar" => "Kunhavigi kalendaron", -"Download" => "Elŝuti", -"Edit" => "Redakti", -"Delete" => "Forigi", -"shared with you by" => "kunhavigita kun vi fare de", -"New calendar" => "Nova kalendaro", -"Edit calendar" => "Redakti la kalendaron", -"Displayname" => "Montrota nomo", -"Active" => "Aktiva", -"Calendar color" => "Kalendarokoloro", -"Save" => "Konservi", -"Submit" => "Sendi", -"Cancel" => "Nuligi", -"Edit an event" => "Redakti okazaĵon", -"Export" => "Elporti", -"Eventinfo" => "Informo de okazaĵo", -"Repeating" => "Ripetata", -"Alarm" => "Alarmo", -"Attendees" => "Ĉeestontoj", -"Share" => "Kunhavigi", -"Title of the Event" => "Okazaĵotitolo", -"Category" => "Kategorio", -"Separate categories with commas" => "Disigi kategoriojn per komoj", -"Edit categories" => "Redakti kategoriojn", -"All Day Event" => "La tuta tago", -"From" => "Ekde", -"To" => "Ĝis", -"Advanced options" => "Altnivela agordo", -"Location" => "Loko", -"Location of the Event" => "Loko de okazaĵo", -"Description" => "Priskribo", -"Description of the Event" => "Okazaĵopriskribo", -"Repeat" => "Ripeti", -"Advanced" => "Altnivelo", -"Select weekdays" => "Elekti semajntagojn", -"Select days" => "Elekti tagojn", -"and the events day of year." => "kaj la jartago de la okazaĵo.", -"and the events day of month." => "kaj la monattago de la okazaĵo.", -"Select months" => "Elekti monatojn", -"Select weeks" => "Elekti semajnojn", -"and the events week of year." => "kaj la jarsemajno de la okazaĵo.", -"Interval" => "Intervalo", -"End" => "Fino", -"occurrences" => "aperoj", -"create a new calendar" => "Krei novan kalendaron", -"Import a calendar file" => "Enporti kalendarodosieron", -"Please choose a calendar" => "Bonvolu elekti kalendaron", -"Name of new calendar" => "Nomo de la nova kalendaro", -"Take an available name!" => "Prenu haveblan nomon!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Kalendaro kun ĉi tiu nomo jam ekzastas. Se vi malgraŭe daŭros, ĉi tiuj kalendaroj kunfandiĝos.", -"Import" => "Enporti", -"Close Dialog" => "Fermi la dialogon", -"Create a new event" => "Krei okazaĵon", -"View an event" => "Vidi okazaĵon", -"No categories selected" => "Neniu kategorio elektita", -"of" => "de", -"at" => "ĉe", -"General" => "Ĝenerala", -"Timezone" => "Horozono", -"Update timezone automatically" => "Aŭtomate ĝisdatigi la horozonon", -"Time format" => "Horoformo", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "Komenci semajnon je", -"Cache" => "Kaŝmemoro", -"Clear cache for repeating events" => "Forviŝi kaŝmemoron por ripeto de okazaĵoj", -"URLs" => "URL-oj", -"Calendar CalDAV syncing addresses" => "sinkronigaj adresoj por CalDAV-kalendaroj", -"more info" => "pli da informo", -"Primary address (Kontact et al)" => "Ĉefa adreso (Kontact kaj aliaj)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Nurlegebla(j) iCalendar-ligilo(j)", -"Users" => "Uzantoj", -"select users" => "elekti uzantojn", -"Editable" => "Redaktebla", -"Groups" => "Grupoj", -"select groups" => "elekti grupojn", -"make public" => "publikigi" -); diff --git a/apps/calendar/l10n/es.php b/apps/calendar/l10n/es.php deleted file mode 100644 index 3ebcd2e943..0000000000 --- a/apps/calendar/l10n/es.php +++ /dev/null @@ -1,192 +0,0 @@ - "Aún no se han guardado en caché todos los calendarios", -"Everything seems to be completely cached" => "Parece que se ha guardado todo en caché", -"No calendars found." => "No se encontraron calendarios.", -"No events found." => "No se encontraron eventos.", -"Wrong calendar" => "Calendario incorrecto", -"The file contained either no events or all events are already saved in your calendar." => "El archivo no contiene eventos o ya existen en tu calendario.", -"events has been saved in the new calendar" => "Los eventos han sido guardados en el nuevo calendario", -"Import failed" => "Fallo en la importación", -"events has been saved in your calendar" => "eventos se han guardado en tu calendario", -"New Timezone:" => "Nueva zona horaria:", -"Timezone changed" => "Zona horaria cambiada", -"Invalid request" => "Petición no válida", -"Calendar" => "Calendario", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Cumpleaños", -"Business" => "Negocios", -"Call" => "Llamada", -"Clients" => "Clientes", -"Deliverer" => "Entrega", -"Holidays" => "Festivos", -"Ideas" => "Ideas", -"Journey" => "Viaje", -"Jubilee" => "Aniversario", -"Meeting" => "Reunión", -"Other" => "Otro", -"Personal" => "Personal", -"Projects" => "Proyectos", -"Questions" => "Preguntas", -"Work" => "Trabajo", -"by" => "por", -"unnamed" => "Sin nombre", -"New Calendar" => "Nuevo calendario", -"Does not repeat" => "No se repite", -"Daily" => "Diariamente", -"Weekly" => "Semanalmente", -"Every Weekday" => "Días de semana laboral", -"Bi-Weekly" => "Cada 2 semanas", -"Monthly" => "Mensualmente", -"Yearly" => "Anualmente", -"never" => "nunca", -"by occurrences" => "por ocurrencias", -"by date" => "por fecha", -"by monthday" => "por día del mes", -"by weekday" => "por día de la semana", -"Monday" => "Lunes", -"Tuesday" => "Martes", -"Wednesday" => "Miércoles", -"Thursday" => "Jueves", -"Friday" => "Viernes", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "eventos de la semana del mes", -"first" => "primer", -"second" => "segundo", -"third" => "tercer", -"fourth" => "cuarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Enero", -"February" => "Febrero", -"March" => "Marzo", -"April" => "Abril", -"May" => "Mayo", -"June" => "Junio", -"July" => "Julio", -"August" => "Agosto", -"September" => "Septiembre", -"October" => "Octubre", -"November" => "Noviembre", -"December" => "Diciembre", -"by events date" => "por fecha de los eventos", -"by yearday(s)" => "por día(s) del año", -"by weeknumber(s)" => "por número(s) de semana", -"by day and month" => "por día y mes", -"Date" => "Fecha", -"Cal." => "Cal.", -"Sun." => "Dom.", -"Mon." => "Lun.", -"Tue." => "Mar.", -"Wed." => "Mier.", -"Thu." => "Jue.", -"Fri." => "Vie.", -"Sat." => "Sab.", -"Jan." => "Ene.", -"Feb." => "Feb.", -"Mar." => "Mar.", -"Apr." => "Abr.", -"May." => "May.", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Ago.", -"Sep." => "Sep.", -"Oct." => "Oct.", -"Nov." => "Nov.", -"Dec." => "Dic.", -"All day" => "Todo el día", -"Missing fields" => "Los campos que faltan", -"Title" => "Título", -"From Date" => "Desde la fecha", -"From Time" => "Desde la hora", -"To Date" => "Hasta la fecha", -"To Time" => "Hasta la hora", -"The event ends before it starts" => "El evento termina antes de que comience", -"There was a database fail" => "Se ha producido un error en la base de datos", -"Week" => "Semana", -"Month" => "Mes", -"List" => "Lista", -"Today" => "Hoy", -"Your calendars" => "Tus calendarios", -"CalDav Link" => "Enlace a CalDav", -"Shared calendars" => "Calendarios compartidos", -"No shared calendars" => "Calendarios no compartidos", -"Share Calendar" => "Compartir calendario", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Eliminar", -"shared with you by" => "compartido contigo por", -"New calendar" => "Nuevo calendario", -"Edit calendar" => "Editar calendario", -"Displayname" => "Nombre", -"Active" => "Activo", -"Calendar color" => "Color del calendario", -"Save" => "Guardar", -"Submit" => "Guardar", -"Cancel" => "Cancelar", -"Edit an event" => "Editar un evento", -"Export" => "Exportar", -"Eventinfo" => "Información del evento", -"Repeating" => "Repetición", -"Alarm" => "Alarma", -"Attendees" => "Asistentes", -"Share" => "Compartir", -"Title of the Event" => "Título del evento", -"Category" => "Categoría", -"Separate categories with commas" => "Separar categorías con comas", -"Edit categories" => "Editar categorías", -"All Day Event" => "Todo el día", -"From" => "Desde", -"To" => "Hasta", -"Advanced options" => "Opciones avanzadas", -"Location" => "Lugar", -"Location of the Event" => "Lugar del evento", -"Description" => "Descripción", -"Description of the Event" => "Descripción del evento", -"Repeat" => "Repetir", -"Advanced" => "Avanzado", -"Select weekdays" => "Seleccionar días de la semana", -"Select days" => "Seleccionar días", -"and the events day of year." => "y el día del año de los eventos.", -"and the events day of month." => "y el día del mes de los eventos.", -"Select months" => "Seleccionar meses", -"Select weeks" => "Seleccionar semanas", -"and the events week of year." => "y la semana del año de los eventos.", -"Interval" => "Intervalo", -"End" => "Fin", -"occurrences" => "ocurrencias", -"create a new calendar" => "Crear un nuevo calendario", -"Import a calendar file" => "Importar un archivo de calendario", -"Please choose a calendar" => "Por favor, escoge un calendario", -"Name of new calendar" => "Nombre del nuevo calendario", -"Take an available name!" => "¡Elige un nombre disponible!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ya existe un calendario con este nombre. Si continúas, se combinarán los calendarios.", -"Import" => "Importar", -"Close Dialog" => "Cerrar diálogo", -"Create a new event" => "Crear un nuevo evento", -"View an event" => "Ver un evento", -"No categories selected" => "Ninguna categoría seleccionada", -"of" => "de", -"at" => "a las", -"Timezone" => "Zona horaria", -"24h" => "24h", -"12h" => "12h", -"Cache" => "Caché", -"Clear cache for repeating events" => "Limpiar caché de eventos recurrentes", -"Calendar CalDAV syncing addresses" => "Direcciones de sincronización de calendario CalDAV:", -"more info" => "Más información", -"Primary address (Kontact et al)" => "Dirección principal (Kontact y otros)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Enlace(s) iCalendar de sólo lectura", -"Users" => "Usuarios", -"select users" => "seleccionar usuarios", -"Editable" => "Editable", -"Groups" => "Grupos", -"select groups" => "seleccionar grupos", -"make public" => "hacerlo público" -); diff --git a/apps/calendar/l10n/et_EE.php b/apps/calendar/l10n/et_EE.php deleted file mode 100644 index 59f494f8ab..0000000000 --- a/apps/calendar/l10n/et_EE.php +++ /dev/null @@ -1,156 +0,0 @@ - "Kalendreid ei leitud.", -"No events found." => "Üritusi ei leitud.", -"Wrong calendar" => "Vale kalender", -"New Timezone:" => "Uus ajavöönd:", -"Timezone changed" => "Ajavöönd on muudetud", -"Invalid request" => "Vigane päring", -"Calendar" => "Kalender", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Sünnipäev", -"Business" => "Äri", -"Call" => "Helista", -"Clients" => "Kliendid", -"Deliverer" => "Kohaletoimetaja", -"Holidays" => "Pühad", -"Ideas" => "Ideed", -"Journey" => "Reis", -"Jubilee" => "Juubel", -"Meeting" => "Kohtumine", -"Other" => "Muu", -"Personal" => "Isiklik", -"Projects" => "Projektid", -"Questions" => "Küsimused", -"Work" => "Töö", -"unnamed" => "nimetu", -"New Calendar" => "Uus kalender", -"Does not repeat" => "Ei kordu", -"Daily" => "Iga päev", -"Weekly" => "Iga nädal", -"Every Weekday" => "Igal nädalapäeval", -"Bi-Weekly" => "Üle nädala", -"Monthly" => "Igal kuul", -"Yearly" => "Igal aastal", -"never" => "mitte kunagi", -"by occurrences" => "toimumiskordade järgi", -"by date" => "kuupäeva järgi", -"by monthday" => "kuu päeva järgi", -"by weekday" => "nädalapäeva järgi", -"Monday" => "Esmaspäev", -"Tuesday" => "Teisipäev", -"Wednesday" => "Kolmapäev", -"Thursday" => "Neljapäev", -"Friday" => "Reede", -"Saturday" => "Laupäev", -"Sunday" => "Pühapäev", -"events week of month" => "ürituse kuu nädal", -"first" => "esimene", -"second" => "teine", -"third" => "kolmas", -"fourth" => "neljas", -"fifth" => "viies", -"last" => "viimane", -"January" => "Jaanuar", -"February" => "Veebruar", -"March" => "Märts", -"April" => "Aprill", -"May" => "Mai", -"June" => "Juuni", -"July" => "Juuli", -"August" => "August", -"September" => "September", -"October" => "Oktoober", -"November" => "November", -"December" => "Detsember", -"by events date" => "ürituste kuupäeva järgi", -"by yearday(s)" => "aasta päeva(de) järgi", -"by weeknumber(s)" => "nädala numbri(te) järgi", -"by day and month" => "kuu ja päeva järgi", -"Date" => "Kuupäev", -"Cal." => "Kal.", -"All day" => "Kogu päev", -"Missing fields" => "Puuduvad väljad", -"Title" => "Pealkiri", -"From Date" => "Alates kuupäevast", -"From Time" => "Alates kellaajast", -"To Date" => "Kuni kuupäevani", -"To Time" => "Kuni kellaajani", -"The event ends before it starts" => "Üritus lõpeb enne, kui see algab", -"There was a database fail" => "Tekkis andmebaasi viga", -"Week" => "Nädal", -"Month" => "Kuu", -"List" => "Nimekiri", -"Today" => "Täna", -"Your calendars" => "Sinu kalendrid", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Jagatud kalendrid", -"No shared calendars" => "Jagatud kalendreid pole", -"Share Calendar" => "Jaga kalendrit", -"Download" => "Lae alla", -"Edit" => "Muuda", -"Delete" => "Kustuta", -"shared with you by" => "jagas sinuga", -"New calendar" => "Uus kalender", -"Edit calendar" => "Muuda kalendrit", -"Displayname" => "Näidatav nimi", -"Active" => "Aktiivne", -"Calendar color" => "Kalendri värv", -"Save" => "Salvesta", -"Submit" => "OK", -"Cancel" => "Loobu", -"Edit an event" => "Muuda sündmust", -"Export" => "Ekspordi", -"Eventinfo" => "Ürituse info", -"Repeating" => "Kordamine", -"Alarm" => "Alarm", -"Attendees" => "Osalejad", -"Share" => "Jaga", -"Title of the Event" => "Sündmuse pealkiri", -"Category" => "Kategooria", -"Separate categories with commas" => "Eralda kategooriad komadega", -"Edit categories" => "Muuda kategooriaid", -"All Day Event" => "Kogu päeva sündmus", -"From" => "Alates", -"To" => "Kuni", -"Advanced options" => "Lisavalikud", -"Location" => "Asukoht", -"Location of the Event" => "Sündmuse toimumiskoht", -"Description" => "Kirjeldus", -"Description of the Event" => "Sündmuse kirjeldus", -"Repeat" => "Korda", -"Advanced" => "Täpsem", -"Select weekdays" => "Vali nädalapäevad", -"Select days" => "Vali päevad", -"and the events day of year." => "ja ürituse päev aastas.", -"and the events day of month." => "ja ürituse päev kuus.", -"Select months" => "Vali kuud", -"Select weeks" => "Vali nädalad", -"and the events week of year." => "ja ürituse nädal aastas.", -"Interval" => "Intervall", -"End" => "Lõpp", -"occurrences" => "toimumiskordi", -"create a new calendar" => "loo uus kalender", -"Import a calendar file" => "Impordi kalendrifail", -"Name of new calendar" => "Uue kalendri nimi", -"Import" => "Impordi", -"Close Dialog" => "Sulge dialoogiaken", -"Create a new event" => "Loo sündmus", -"View an event" => "Vaata üritust", -"No categories selected" => "Ühtegi kategooriat pole valitud", -"of" => "/", -"at" => "kell", -"Timezone" => "Ajavöönd", -"24h" => "24h", -"12h" => "12h", -"Users" => "Kasutajad", -"select users" => "valitud kasutajad", -"Editable" => "Muudetav", -"Groups" => "Grupid", -"select groups" => "valitud grupid", -"make public" => "tee avalikuks" -); diff --git a/apps/calendar/l10n/eu.php b/apps/calendar/l10n/eu.php deleted file mode 100644 index 5ebce09c58..0000000000 --- a/apps/calendar/l10n/eu.php +++ /dev/null @@ -1,183 +0,0 @@ - "Egutegi guztiak ez daude guztiz cacheatuta", -"Everything seems to be completely cached" => "Dena guztiz cacheatuta dagoela dirudi", -"No calendars found." => "Ez da egutegirik aurkitu.", -"No events found." => "Ez da gertaerarik aurkitu.", -"Wrong calendar" => "Egutegi okerra", -"The file contained either no events or all events are already saved in your calendar." => "Fitxategiak ez zuen gertaerarik edo gertaera guztiak dagoeneko egutegian gordeta zeuden.", -"events has been saved in the new calendar" => "gertaerak egutegi berrian gorde dira", -"Import failed" => "Inportazioak huts egin du", -"events has been saved in your calendar" => "gertaerak zure egutegian gorde dira", -"New Timezone:" => "Ordu-zonalde berria", -"Timezone changed" => "Ordu-zonaldea aldatuta", -"Invalid request" => "Baliogabeko eskaera", -"Calendar" => "Egutegia", -"MMMM yyyy" => "yyyy MMMM", -"Birthday" => "Jaioteguna", -"Business" => "Negozioa", -"Call" => "Deia", -"Clients" => "Bezeroak", -"Deliverer" => "Banatzailea", -"Holidays" => "Oporrak", -"Ideas" => "Ideiak", -"Journey" => "Bidaia", -"Jubilee" => "Urteurrena", -"Meeting" => "Bilera", -"Other" => "Bestelakoa", -"Personal" => "Pertsonala", -"Projects" => "Proiektuak", -"Questions" => "Galderak", -"Work" => "Lana", -"unnamed" => "izengabea", -"New Calendar" => "Egutegi berria", -"Does not repeat" => "Ez da errepikatzen", -"Daily" => "Egunero", -"Weekly" => "Astero", -"Every Weekday" => "Asteko egun guztietan", -"Bi-Weekly" => "Bi-Astero", -"Monthly" => "Hilabetero", -"Yearly" => "Urtero", -"never" => "inoiz", -"by occurrences" => "errepikapen kopuruagatik", -"by date" => "dataren arabera", -"by monthday" => "hileko egunaren arabera", -"by weekday" => "asteko egunaren arabera", -"Monday" => "Astelehena", -"Tuesday" => "Asteartea", -"Wednesday" => "Asteazkena", -"Thursday" => "Osteguna", -"Friday" => "Ostirala", -"Saturday" => "Larunbata", -"Sunday" => "Igandea", -"events week of month" => "gertaeraren hilabeteko astea", -"first" => "lehenengoa", -"second" => "bigarrean", -"third" => "hirugarrena", -"fourth" => "laugarrena", -"fifth" => "bostgarrena", -"last" => "azkena", -"January" => "Urtarrila", -"February" => "Otsaila", -"March" => "Martxoa", -"April" => "Apirila", -"May" => "Maiatza", -"June" => "Ekaina", -"July" => "Uztaila", -"August" => "Abuztua", -"September" => "Iraila", -"October" => "Urria", -"November" => "Azaroa", -"December" => "Abendua", -"by events date" => "gertaeren dataren arabera", -"by yearday(s)" => "urteko egunaren arabera", -"by weeknumber(s)" => "aste zenbaki(ar)en arabera", -"by day and month" => "eguna eta hilabetearen arabera", -"Date" => "Data", -"Cal." => "Eg.", -"Sun." => "ig.", -"Mon." => "al.", -"Tue." => "ar.", -"Wed." => "az.", -"Thu." => "og.", -"Fri." => "ol.", -"Sat." => "lr.", -"Jan." => "urt.", -"Feb." => "ots.", -"Mar." => "mar.", -"Apr." => "api.", -"May." => "mai.", -"Jun." => "eka.", -"Jul." => "uzt.", -"Aug." => "abu.", -"Sep." => "ira.", -"Oct." => "urr.", -"Nov." => "aza.", -"Dec." => "abe.", -"All day" => "Egun guztia", -"Missing fields" => "Eremuak faltan", -"Title" => "Izenburua", -"From Date" => "Hasierako Data", -"From Time" => "Hasierako Ordua", -"To Date" => "Bukaerako Data", -"To Time" => "Bukaerako Ordua", -"The event ends before it starts" => "Gertaera hasi baino lehen bukatzen da", -"There was a database fail" => "Datu-baseak huts egin du", -"Week" => "Astea", -"Month" => "Hilabetea", -"List" => "Zerrenda", -"Today" => "Gaur", -"Your calendars" => "Zure egutegiak", -"CalDav Link" => "CalDav lotura", -"Shared calendars" => "Elkarbanatutako egutegiak", -"No shared calendars" => "Ez dago elkarbanatutako egutegirik", -"Share Calendar" => "Elkarbanatu egutegia", -"Download" => "Deskargatu", -"Edit" => "Editatu", -"Delete" => "Ezabatu", -"shared with you by" => "honek zurekin elkarbanatu du", -"New calendar" => "Egutegi berria", -"Edit calendar" => "Editatu egutegia", -"Displayname" => "Bistaratzeko izena", -"Active" => "Aktiboa", -"Calendar color" => "Egutegiaren kolorea", -"Save" => "Gorde", -"Submit" => "Bidali", -"Cancel" => "Ezeztatu", -"Edit an event" => "Editatu gertaera", -"Export" => "Exportatu", -"Eventinfo" => "Gertaeraren informazioa", -"Repeating" => "Errepikapena", -"Alarm" => "Alarma", -"Attendees" => "Partaideak", -"Share" => "Elkarbanatu", -"Title of the Event" => "Gertaeraren izenburua", -"Category" => "Kategoria", -"Separate categories with commas" => "Banatu kategoriak komekin", -"Edit categories" => "Editatu kategoriak", -"All Day Event" => "Egun osoko gertaera", -"From" => "Hasiera", -"To" => "Bukaera", -"Advanced options" => "Aukera aurreratuak", -"Location" => "Kokalekua", -"Location of the Event" => "Gertaeraren kokalekua", -"Description" => "Deskribapena", -"Description of the Event" => "Gertaeraren deskribapena", -"Repeat" => "Errepikatu", -"Advanced" => "Aurreratua", -"Select weekdays" => "Hautatu asteko egunak", -"Select days" => "Hautatu egunak", -"and the events day of year." => "eta gertaeraren urteko eguna.", -"and the events day of month." => "eta gertaeraren hilabeteko eguna.", -"Select months" => "Hautatu hilabeteak", -"Select weeks" => "Hautatu asteak", -"and the events week of year." => "eta gertaeraren urteko astea.", -"Interval" => "Tartea", -"End" => "Amaiera", -"occurrences" => "errepikapenak", -"create a new calendar" => "sortu egutegi berria", -"Import a calendar file" => "Inportatu egutegi fitxategi bat", -"Please choose a calendar" => "Mesedez aukeratu egutegi bat.", -"Name of new calendar" => "Egutegi berriaren izena", -"Take an available name!" => "Hartu eskuragarri dagoen izen bat!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Izen hau duen egutegi bat dagoeneko existitzen da. Hala ere jarraitzen baduzu, egutegi hauek elkartuko dira.", -"Import" => "Importatu", -"Close Dialog" => "Itxi lehioa", -"Create a new event" => "Sortu gertaera berria", -"View an event" => "Ikusi gertaera bat", -"No categories selected" => "Ez da kategoriarik hautatu", -"Timezone" => "Ordu-zonaldea", -"24h" => "24h", -"12h" => "12h", -"Cache" => "Cache", -"Clear cache for repeating events" => "Ezabatu gertaera errepikakorren cachea", -"Calendar CalDAV syncing addresses" => "Egutegiaren CalDAV sinkronizazio helbideak", -"more info" => "informazio gehiago", -"Primary address (Kontact et al)" => "Helbide nagusia", -"iOS/OS X" => "iOS/OS X", -"Users" => "Erabiltzaileak", -"select users" => "hautatutako erabiltzaileak", -"Editable" => "Editagarria", -"Groups" => "Taldeak", -"select groups" => "hautatutako taldeak", -"make public" => "publikoa egin" -); diff --git a/apps/calendar/l10n/fa.php b/apps/calendar/l10n/fa.php deleted file mode 100644 index 9235460834..0000000000 --- a/apps/calendar/l10n/fa.php +++ /dev/null @@ -1,156 +0,0 @@ - "هیچ تقویمی پیدا نشد", -"No events found." => "هیچ رویدادی پیدا نشد", -"Wrong calendar" => "تقویم اشتباه", -"New Timezone:" => "زمان محلی جدید", -"Timezone changed" => "زمان محلی تغییر یافت", -"Invalid request" => "درخواست نامعتبر", -"Calendar" => "تقویم", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "DDD m[ yyyy]{ '—'[ DDD] m yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "روزتولد", -"Business" => "تجارت", -"Call" => "تماس گرفتن", -"Clients" => "مشتریان", -"Deliverer" => "نجات", -"Holidays" => "روزهای تعطیل", -"Ideas" => "ایده ها", -"Journey" => "سفر", -"Jubilee" => "سالگرد", -"Meeting" => "ملاقات", -"Other" => "دیگر", -"Personal" => "شخصی", -"Projects" => "پروژه ها", -"Questions" => "سوالات", -"Work" => "کار", -"unnamed" => "نام گذاری نشده", -"New Calendar" => "تقویم جدید", -"Does not repeat" => "تکرار نکنید", -"Daily" => "روزانه", -"Weekly" => "هفتهگی", -"Every Weekday" => "هرروز هفته", -"Bi-Weekly" => "دوهفته", -"Monthly" => "ماهانه", -"Yearly" => "سالانه", -"never" => "هرگز", -"by occurrences" => "به وسیله ظهور", -"by date" => "به وسیله تاریخ", -"by monthday" => "به وسیله روزهای ماه", -"by weekday" => "به وسیله روز های هفته", -"Monday" => "دوشنبه", -"Tuesday" => "سه شنبه", -"Wednesday" => "چهارشنبه", -"Thursday" => "پنجشنبه", -"Friday" => "جمعه", -"Saturday" => "شنبه", -"Sunday" => "یکشنبه", -"events week of month" => "رویداد های هفته هایی از ماه", -"first" => "اولین", -"second" => "دومین", -"third" => "سومین", -"fourth" => "چهارمین", -"fifth" => "پنجمین", -"last" => "آخرین", -"January" => "ژانویه", -"February" => "فبریه", -"March" => "مارس", -"April" => "آوریل", -"May" => "می", -"June" => "ژوءن", -"July" => "جولای", -"August" => "آگوست", -"September" => "سپتامبر", -"October" => "اکتبر", -"November" => "نوامبر", -"December" => "دسامبر", -"by events date" => "به وسیله رویداد های روزانه", -"by yearday(s)" => "به وسیله روز های سال(ها)", -"by weeknumber(s)" => "به وسیله شماره هفته(ها)", -"by day and month" => "به وسیله روز و ماه", -"Date" => "تاریخ", -"Cal." => "تقویم.", -"All day" => "هرروز", -"Missing fields" => "فیلد های گم شده", -"Title" => "عنوان", -"From Date" => "از تاریخ", -"From Time" => "از ساعت", -"To Date" => "به تاریخ", -"To Time" => "به ساعت", -"The event ends before it starts" => "رویداد قبل از شروع شدن تمام شده!", -"There was a database fail" => "یک پایگاه داده فرو مانده است", -"Week" => "هفته", -"Month" => "ماه", -"List" => "فهرست", -"Today" => "امروز", -"Your calendars" => "تقویم های شما", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "تقویمهای به اشترک گذاری شده", -"No shared calendars" => "هیچ تقویمی به اشتراک گذارده نشده", -"Share Calendar" => "تقویم را به اشتراک بگذارید", -"Download" => "بارگیری", -"Edit" => "ویرایش", -"Delete" => "پاک کردن", -"shared with you by" => "به اشتراک گذارده شده به وسیله", -"New calendar" => "تقویم جدید", -"Edit calendar" => "ویرایش تقویم", -"Displayname" => "نام برای نمایش", -"Active" => "فعال", -"Calendar color" => "رنگ تقویم", -"Save" => "ذخیره سازی", -"Submit" => "ارسال", -"Cancel" => "انصراف", -"Edit an event" => "ویرایش رویداد", -"Export" => "خروجی گرفتن", -"Eventinfo" => "اطلاعات رویداد", -"Repeating" => "در حال تکرار کردن", -"Alarm" => "هشدار", -"Attendees" => "شرکت کنندگان", -"Share" => "به اشتراک گذاردن", -"Title of the Event" => "عنوان رویداد", -"Category" => "نوع", -"Separate categories with commas" => "گروه ها را به وسیله درنگ نما از هم جدا کنید", -"Edit categories" => "ویرایش گروه", -"All Day Event" => "رویداد های روزانه", -"From" => "از", -"To" => "به", -"Advanced options" => "تنظیمات حرفه ای", -"Location" => "منطقه", -"Location of the Event" => "منطقه رویداد", -"Description" => "توضیحات", -"Description of the Event" => "توضیحات درباره رویداد", -"Repeat" => "تکرار", -"Advanced" => "پیشرفته", -"Select weekdays" => "انتخاب روز های هفته ", -"Select days" => "انتخاب روز ها", -"and the events day of year." => "و رویداد های روز از سال", -"and the events day of month." => "و رویداد های روز از ماه", -"Select months" => "انتخاب ماه ها", -"Select weeks" => "انتخاب هفته ها", -"and the events week of year." => "و رویداد هفته ها از سال", -"Interval" => "فاصله", -"End" => "پایان", -"occurrences" => "ظهور", -"create a new calendar" => "یک تقویم جدید ایجاد کنید", -"Import a calendar file" => "یک پرونده حاوی تقویم وارد کنید", -"Name of new calendar" => "نام تقویم جدید", -"Import" => "ورودی دادن", -"Close Dialog" => "بستن دیالوگ", -"Create a new event" => "یک رویداد ایجاد کنید", -"View an event" => "دیدن یک رویداد", -"No categories selected" => "هیچ گروهی انتخاب نشده", -"of" => "از", -"at" => "در", -"Timezone" => "زمان محلی", -"24h" => "24 ساعت", -"12h" => "12 ساعت", -"Users" => "کاربرها", -"select users" => "انتخاب شناسه ها", -"Editable" => "قابل ویرایش", -"Groups" => "گروه ها", -"select groups" => "انتخاب گروه ها", -"make public" => "عمومی سازی" -); diff --git a/apps/calendar/l10n/fi_FI.php b/apps/calendar/l10n/fi_FI.php deleted file mode 100644 index c4c9df3588..0000000000 --- a/apps/calendar/l10n/fi_FI.php +++ /dev/null @@ -1,159 +0,0 @@ - "Kalentereita ei löytynyt", -"No events found." => "Tapahtumia ei löytynyt.", -"Wrong calendar" => "Väärä kalenteri", -"The file contained either no events or all events are already saved in your calendar." => "Tiedosto ei joko sisältänyt tapahtumia tai vaihtoehtoisesti kaikki tapahtumat on jo tallennettu kalenteriisi.", -"Import failed" => "Tuonti epäonnistui", -"events has been saved in your calendar" => "tapahtumaa on tallennettu kalenteriisi", -"New Timezone:" => "Uusi aikavyöhyke:", -"Timezone changed" => "Aikavyöhyke vaihdettu", -"Invalid request" => "Virheellinen pyyntö", -"Calendar" => "Kalenteri", -"Birthday" => "Syntymäpäivä", -"Call" => "Ota yhteyttä", -"Clients" => "Asiakkaat", -"Deliverer" => "Toimittaja", -"Holidays" => "Vapaapäivät", -"Ideas" => "Ideat", -"Journey" => "Matkustus", -"Jubilee" => "Vuosipäivät", -"Meeting" => "Tapaamiset", -"Other" => "Muut", -"Personal" => "Henkilökohtainen", -"Projects" => "Projektit", -"Questions" => "Kysymykset", -"Work" => "Työ", -"unnamed" => "nimetön", -"New Calendar" => "Uusi kalenteri", -"Does not repeat" => "Ei toistoa", -"Daily" => "Päivittäin", -"Weekly" => "Viikottain", -"Every Weekday" => "Arkipäivisin", -"Bi-Weekly" => "Joka toinen viikko", -"Monthly" => "Kuukausittain", -"Yearly" => "Vuosittain", -"never" => "Ei koskaan", -"Monday" => "Maanantai", -"Tuesday" => "Tiistai", -"Wednesday" => "Keskiviikko", -"Thursday" => "Torstai", -"Friday" => "Perjantai", -"Saturday" => "Lauantai", -"Sunday" => "Sunnuntai", -"first" => "ensimmäinen", -"second" => "toinen", -"third" => "kolmas", -"fourth" => "neljäs", -"fifth" => "viides", -"last" => "viimeinen", -"January" => "Tammikuu", -"February" => "Helmikuu", -"March" => "Maaliskuu", -"April" => "Huhtikuu", -"May" => "Toukokuu", -"June" => "Kesäkuu", -"July" => "Heinäkuu", -"August" => "Elokuu", -"September" => "Syyskuu", -"October" => "Lokakuu", -"November" => "Marraskuu", -"December" => "Joulukuu", -"Date" => "Päivämäärä", -"Sun." => "Su", -"Mon." => "Ma", -"Tue." => "Ti", -"Wed." => "Ke", -"Thu." => "To", -"Fri." => "Pe", -"Sat." => "La", -"Jan." => "Tammi", -"Feb." => "Helmi", -"Mar." => "Maalis", -"Apr." => "Huhti", -"May." => "Touko", -"Jun." => "Kesä", -"Jul." => "Heinä", -"Aug." => "Elo", -"Sep." => "Syys", -"Oct." => "Loka", -"Nov." => "Marras", -"Dec." => "Joulu", -"All day" => "Koko päivä", -"Missing fields" => "Puuttuvat kentät", -"Title" => "Otsikko", -"The event ends before it starts" => "Tapahtuma päättyy ennen alkamistaan", -"There was a database fail" => "Tapahtui tietokantavirhe", -"Week" => "Viikko", -"Month" => "Kuukausi", -"List" => "Lista", -"Today" => "Tänään", -"Settings" => "Asetukset", -"Your calendars" => "Omat kalenterisi", -"CalDav Link" => "CalDav-linkki", -"Shared calendars" => "Jaetut kalenterit", -"No shared calendars" => "Ei jaettuja kalentereita", -"Share Calendar" => "Jaa kalenteri", -"Download" => "Lataa", -"Edit" => "Muokkaa", -"Delete" => "Poista", -"shared with you by" => "kanssasi jaettu", -"New calendar" => "Uusi kalenteri", -"Edit calendar" => "Muokkaa kalenteria", -"Displayname" => "Kalenterin nimi", -"Active" => "Aktiivinen", -"Calendar color" => "Kalenterin väri", -"Save" => "Tallenna", -"Submit" => "Talleta", -"Cancel" => "Peru", -"Edit an event" => "Muokkaa tapahtumaa", -"Export" => "Vie", -"Eventinfo" => "Tapahtumatiedot", -"Repeating" => "Toisto", -"Alarm" => "Hälytys", -"Attendees" => "Osallistujat", -"Share" => "Jaa", -"Title of the Event" => "Tapahtuman otsikko", -"Category" => "Luokka", -"Separate categories with commas" => "Erota luokat pilkuilla", -"Edit categories" => "Muokkaa luokkia", -"All Day Event" => "Koko päivän tapahtuma", -"From" => "Alkaa", -"To" => "Päättyy", -"Advanced options" => "Tarkemmat asetukset", -"Location" => "Sijainti", -"Location of the Event" => "Tapahtuman sijainti", -"Description" => "Kuvaus", -"Description of the Event" => "Tapahtuman kuvaus", -"Repeat" => "Toisto", -"Select weekdays" => "Valitse viikonpäivät", -"Select days" => "Valitse päivät", -"Select months" => "Valitse kuukaudet", -"Select weeks" => "Valitse viikot", -"Interval" => "Intervalli", -"create a new calendar" => "luo uusi kalenteri", -"Import a calendar file" => "Tuo kalenteritiedosto", -"Please choose a calendar" => "Valitse kalenteri", -"Name of new calendar" => "Uuden kalenterin nimi", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Samalla nimellä on jo olemassa kalenteri. Jos jatkat kaikesta huolimatta, kalenterit yhdistetään.", -"Import" => "Tuo", -"Close Dialog" => "Sulje ikkuna", -"Create a new event" => "Luo uusi tapahtuma", -"View an event" => "Avaa tapahtuma", -"No categories selected" => "Luokkia ei ole valittu", -"General" => "Yleiset", -"Timezone" => "Aikavyöhyke", -"Update timezone automatically" => "Päivitä aikavyöhykkeet automaattisesti", -"Time format" => "Ajan näyttömuoto", -"24h" => "24 tuntia", -"12h" => "12 tuntia", -"Start week on" => "Viikon alkamispäivä", -"Calendar CalDAV syncing addresses" => "Kalenterin CalDAV-synkronointiosoitteet", -"Primary address (Kontact et al)" => "Ensisijainen osoite (Kontact ja muut vastaavat)", -"iOS/OS X" => "iOS/OS X", -"Users" => "Käyttäjät", -"select users" => "valitse käyttäjät", -"Editable" => "Muoktattava", -"Groups" => "Ryhmät", -"select groups" => "valitse ryhmät", -"make public" => "aseta julkiseksi" -); diff --git a/apps/calendar/l10n/fr.php b/apps/calendar/l10n/fr.php deleted file mode 100644 index 90ba903b87..0000000000 --- a/apps/calendar/l10n/fr.php +++ /dev/null @@ -1,192 +0,0 @@ - "Tous les calendriers ne sont pas mis en cache", -"Everything seems to be completely cached" => "Tout semble être en cache", -"No calendars found." => "Aucun calendrier n'a été trouvé.", -"No events found." => "Aucun événement n'a été trouvé.", -"Wrong calendar" => "Mauvais calendrier", -"The file contained either no events or all events are already saved in your calendar." => "Soit le fichier ne contient aucun événement soit tous les événements sont déjà enregistrés dans votre calendrier.", -"events has been saved in the new calendar" => "Les événements ont été enregistrés dans le nouveau calendrier", -"Import failed" => "Échec de l'import", -"events has been saved in your calendar" => "Les événements ont été enregistrés dans votre calendrier", -"New Timezone:" => "Nouveau fuseau horaire :", -"Timezone changed" => "Fuseau horaire modifié", -"Invalid request" => "Requête invalide", -"Calendar" => "Calendrier", -"ddd" => "ddd", -"ddd M/d" => "ddd d/M", -"dddd M/d" => "dddd d/M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, d MMM, yyyy", -"Birthday" => "Anniversaire", -"Business" => "Professionnel", -"Call" => "Appel", -"Clients" => "Clientèle", -"Deliverer" => "Livraison", -"Holidays" => "Vacances", -"Ideas" => "Idées", -"Journey" => "Déplacement", -"Jubilee" => "Jubilé", -"Meeting" => "Meeting", -"Other" => "Autre", -"Personal" => "Personnel", -"Projects" => "Projets", -"Questions" => "Questions", -"Work" => "Travail", -"by" => "par", -"unnamed" => "sans-nom", -"New Calendar" => "Nouveau Calendrier", -"Does not repeat" => "Pas de répétition", -"Daily" => "Tous les jours", -"Weekly" => "Hebdomadaire", -"Every Weekday" => "Quotidien", -"Bi-Weekly" => "Bi-hebdomadaire", -"Monthly" => "Mensuel", -"Yearly" => "Annuel", -"never" => "jamais", -"by occurrences" => "par occurrences", -"by date" => "par date", -"by monthday" => "par jour du mois", -"by weekday" => "par jour de la semaine", -"Monday" => "Lundi", -"Tuesday" => "Mardi", -"Wednesday" => "Mercredi", -"Thursday" => "Jeudi", -"Friday" => "Vendredi", -"Saturday" => "Samedi", -"Sunday" => "Dimanche", -"events week of month" => "événements du mois par semaine", -"first" => "premier", -"second" => "deuxième", -"third" => "troisième", -"fourth" => "quatrième", -"fifth" => "cinquième", -"last" => "dernier", -"January" => "Janvier", -"February" => "Février", -"March" => "Mars", -"April" => "Avril", -"May" => "Mai", -"June" => "Juin", -"July" => "Juillet", -"August" => "Août", -"September" => "Septembre", -"October" => "Octobre", -"November" => "Novembre", -"December" => "Décembre", -"by events date" => "par date d’événements", -"by yearday(s)" => "par jour(s) de l'année", -"by weeknumber(s)" => "par numéro de semaine(s)", -"by day and month" => "par jour et mois", -"Date" => "Date", -"Cal." => "Cal.", -"Sun." => "Dim.", -"Mon." => "Lun.", -"Tue." => "Mar.", -"Wed." => "Mer.", -"Thu." => "Jeu", -"Fri." => "Ven.", -"Sat." => "Sam.", -"Jan." => "Jan.", -"Feb." => "Fév.", -"Mar." => "Mars", -"Apr." => "Avr.", -"May." => "Mai", -"Jun." => "Juin", -"Jul." => "Juil.", -"Aug." => "Août", -"Sep." => "Sep.", -"Oct." => "Oct.", -"Nov." => "Nov.", -"Dec." => "Déc.", -"All day" => "Journée entière", -"Missing fields" => "Champs manquants", -"Title" => "Titre", -"From Date" => "De la date", -"From Time" => "De l'heure", -"To Date" => "A la date", -"To Time" => "A l'heure", -"The event ends before it starts" => "L'évènement s'est terminé avant qu'il ne commence", -"There was a database fail" => "Il y a eu un échec dans la base de donnée", -"Week" => "Semaine", -"Month" => "Mois", -"List" => "Liste", -"Today" => "Aujourd'hui", -"Your calendars" => "Vos calendriers", -"CalDav Link" => "Lien CalDav", -"Shared calendars" => "Calendriers partagés", -"No shared calendars" => "Aucun calendrier partagé", -"Share Calendar" => "Partager le calendrier", -"Download" => "Télécharger", -"Edit" => "Éditer", -"Delete" => "Supprimer", -"shared with you by" => "partagé avec vous par", -"New calendar" => "Nouveau calendrier", -"Edit calendar" => "Éditer le calendrier", -"Displayname" => "Nom d'affichage", -"Active" => "Actif", -"Calendar color" => "Couleur du calendrier", -"Save" => "Sauvegarder", -"Submit" => "Soumettre", -"Cancel" => "Annuler", -"Edit an event" => "Éditer un événement", -"Export" => "Exporter", -"Eventinfo" => "Événement", -"Repeating" => "Occurences", -"Alarm" => "Alarmes", -"Attendees" => "Participants", -"Share" => "Partage", -"Title of the Event" => "Titre de l'événement", -"Category" => "Catégorie", -"Separate categories with commas" => "Séparer les catégories par des virgules", -"Edit categories" => "Modifier les catégories", -"All Day Event" => "Journée entière", -"From" => "De", -"To" => "À", -"Advanced options" => "Options avancées", -"Location" => "Emplacement", -"Location of the Event" => "Emplacement de l'événement", -"Description" => "Description", -"Description of the Event" => "Description de l'événement", -"Repeat" => "Répétition", -"Advanced" => "Avancé", -"Select weekdays" => "Sélection des jours de la semaine", -"Select days" => "Sélection des jours", -"and the events day of year." => "et les événements de l'année par jour.", -"and the events day of month." => "et les événements du mois par jour.", -"Select months" => "Sélection des mois", -"Select weeks" => "Sélection des semaines", -"and the events week of year." => "et les événements de l'année par semaine.", -"Interval" => "Intervalle", -"End" => "Fin", -"occurrences" => "occurrences", -"create a new calendar" => "Créer un nouveau calendrier", -"Import a calendar file" => "Importer un fichier de calendriers", -"Please choose a calendar" => "Veuillez sélectionner un calendrier", -"Name of new calendar" => "Nom pour le nouveau calendrier", -"Take an available name!" => "Choisissez un nom disponible !", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Un calendrier de ce nom existe déjà. Si vous choisissez de continuer les calendriers seront fusionnés.", -"Import" => "Importer", -"Close Dialog" => "Fermer la fenêtre", -"Create a new event" => "Créer un nouvel événement", -"View an event" => "Voir un événement", -"No categories selected" => "Aucune catégorie sélectionnée", -"of" => "de", -"at" => "à", -"Timezone" => "Fuseau horaire", -"24h" => "24h", -"12h" => "12h", -"Cache" => "Cache", -"Clear cache for repeating events" => "Nettoyer le cache des événements répétitifs", -"Calendar CalDAV syncing addresses" => "Adresses de synchronisation des calendriers CalDAV", -"more info" => "plus d'infos", -"Primary address (Kontact et al)" => "Adresses principales (Kontact et assimilés)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "lien(s) iCalendar en lecture seule", -"Users" => "Utilisateurs", -"select users" => "sélectionner les utilisateurs", -"Editable" => "Modifiable", -"Groups" => "Groupes", -"select groups" => "sélectionner les groupes", -"make public" => "rendre public" -); diff --git a/apps/calendar/l10n/gl.php b/apps/calendar/l10n/gl.php deleted file mode 100644 index ff7e4833ad..0000000000 --- a/apps/calendar/l10n/gl.php +++ /dev/null @@ -1,156 +0,0 @@ - "Non se atoparon calendarios.", -"No events found." => "Non se atoparon eventos.", -"Wrong calendar" => "Calendario equivocado", -"New Timezone:" => "Novo fuso horario:", -"Timezone changed" => "Fuso horario trocado", -"Invalid request" => "Petición non válida", -"Calendar" => "Calendario", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—'d [ MMM] yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d,yyyy", -"Birthday" => "Aniversario", -"Business" => "Traballo", -"Call" => "Chamada", -"Clients" => "Clientes", -"Deliverer" => "Remitente", -"Holidays" => "Vacacións", -"Ideas" => "Ideas", -"Journey" => "Viaxe", -"Jubilee" => "Aniversario especial", -"Meeting" => "Reunión", -"Other" => "Outro", -"Personal" => "Persoal", -"Projects" => "Proxectos", -"Questions" => "Preguntas", -"Work" => "Traballo", -"unnamed" => "sen nome", -"New Calendar" => "Novo calendario", -"Does not repeat" => "Non se repite", -"Daily" => "A diario", -"Weekly" => "Semanalmente", -"Every Weekday" => "Todas as semanas", -"Bi-Weekly" => "Cada dúas semanas", -"Monthly" => "Mensual", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por acontecementos", -"by date" => "por data", -"by monthday" => "por día do mes", -"by weekday" => "por día da semana", -"Monday" => "Luns", -"Tuesday" => "Martes", -"Wednesday" => "Mércores", -"Thursday" => "Xoves", -"Friday" => "Venres", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "semana dos eventos no mes", -"first" => "primeiro", -"second" => "segundo", -"third" => "terceiro", -"fourth" => "cuarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Xaneiro", -"February" => "Febreiro", -"March" => "Marzo", -"April" => "Abril", -"May" => "Maio", -"June" => "Xuño", -"July" => "Xullo", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Decembro", -"by events date" => "por data dos eventos", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) de semana", -"by day and month" => "por día e mes", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Todo o dia", -"Missing fields" => "Faltan campos", -"Title" => "Título", -"From Date" => "Desde a data", -"From Time" => "Desde a hora", -"To Date" => "á data", -"To Time" => "á hora", -"The event ends before it starts" => "O evento remata antes de iniciarse", -"There was a database fail" => "Produciuse un erro na base de datos", -"Week" => "Semana", -"Month" => "Mes", -"List" => "Lista", -"Today" => "Hoxe", -"Your calendars" => "Os seus calendarios", -"CalDav Link" => "Ligazón CalDav", -"Shared calendars" => "Calendarios compartidos", -"No shared calendars" => "Sen calendarios compartidos", -"Share Calendar" => "Compartir calendario", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Borrar", -"shared with you by" => "compartido con vostede por", -"New calendar" => "Novo calendario", -"Edit calendar" => "Editar calendario", -"Displayname" => "Mostrar nome", -"Active" => "Activo", -"Calendar color" => "Cor do calendario", -"Save" => "Gardar", -"Submit" => "Enviar", -"Cancel" => "Cancelar", -"Edit an event" => "Editar un evento", -"Export" => "Exportar", -"Eventinfo" => "Info do evento", -"Repeating" => "Repetido", -"Alarm" => "Alarma", -"Attendees" => "Participantes", -"Share" => "Compartir", -"Title of the Event" => "Título do evento", -"Category" => "Categoría", -"Separate categories with commas" => "Separe as categorías con comas", -"Edit categories" => "Editar categorías", -"All Day Event" => "Eventos do día", -"From" => "Desde", -"To" => "a", -"Advanced options" => "Opcións avanzadas", -"Location" => "Localización", -"Location of the Event" => "Localización do evento", -"Description" => "Descrición", -"Description of the Event" => "Descrición do evento", -"Repeat" => "Repetir", -"Advanced" => "Avanzado", -"Select weekdays" => "Seleccionar días da semana", -"Select days" => "Seleccionar días", -"and the events day of year." => "e día dos eventos no ano.", -"and the events day of month." => "e día dos eventos no mes.", -"Select months" => "Seleccione meses", -"Select weeks" => "Seleccionar semanas", -"and the events week of year." => "e semana dos eventos no ano.", -"Interval" => "Intervalo", -"End" => "Fin", -"occurrences" => "acontecementos", -"create a new calendar" => "crear un novo calendario", -"Import a calendar file" => "Importar un ficheiro de calendario", -"Name of new calendar" => "Nome do novo calendario", -"Import" => "Importar", -"Close Dialog" => "Pechar diálogo", -"Create a new event" => "Crear un novo evento", -"View an event" => "Ver un evento", -"No categories selected" => "Non seleccionou as categorías", -"of" => "de", -"at" => "a", -"Timezone" => "Fuso horario", -"24h" => "24h", -"12h" => "12h", -"Users" => "Usuarios", -"select users" => "escoller usuarios", -"Editable" => "Editable", -"Groups" => "Grupos", -"select groups" => "escoller grupos", -"make public" => "facer público" -); diff --git a/apps/calendar/l10n/he.php b/apps/calendar/l10n/he.php deleted file mode 100644 index d5c0b2b2e5..0000000000 --- a/apps/calendar/l10n/he.php +++ /dev/null @@ -1,156 +0,0 @@ - "לא נמצאו לוחות שנה.", -"No events found." => "לא נמצאו אירועים.", -"Wrong calendar" => "לוח שנה לא נכון", -"New Timezone:" => "אזור זמן חדש:", -"Timezone changed" => "אזור זמן השתנה", -"Invalid request" => "בקשה לא חוקית", -"Calendar" => "ח שנה", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM [ yyyy]{ '—'d[ MMM] yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "יום הולדת", -"Business" => "עסקים", -"Call" => "שיחה", -"Clients" => "לקוחות", -"Deliverer" => "משלוח", -"Holidays" => "חגים", -"Ideas" => "רעיונות", -"Journey" => "מסע", -"Jubilee" => "יובל", -"Meeting" => "פגישה", -"Other" => "אחר", -"Personal" => "אישי", -"Projects" => "פרוייקטים", -"Questions" => "שאלות", -"Work" => "עבודה", -"unnamed" => "ללא שם", -"New Calendar" => "לוח שנה חדש", -"Does not repeat" => "ללא חזרה", -"Daily" => "יומי", -"Weekly" => "שבועי", -"Every Weekday" => "כל יום עבודה", -"Bi-Weekly" => "דו שבועי", -"Monthly" => "חודשי", -"Yearly" => "שנתי", -"never" => "לעולם לא", -"by occurrences" => "לפי מופעים", -"by date" => "לפי תאריך", -"by monthday" => "לפי היום בחודש", -"by weekday" => "לפי היום בשבוע", -"Monday" => "יום שני", -"Tuesday" => "יום שלישי", -"Wednesday" => "יום רביעי", -"Thursday" => "יום חמישי", -"Friday" => "יום שישי", -"Saturday" => "שבת", -"Sunday" => "יום ראשון", -"events week of month" => "שבוע בחודש לציון הפעילות", -"first" => "ראשון", -"second" => "שני", -"third" => "שלישי", -"fourth" => "רביעי", -"fifth" => "חמישי", -"last" => "אחרון", -"January" => "ינואר", -"February" => "פברואר", -"March" => "מרץ", -"April" => "אפריל", -"May" => "מאי", -"June" => "יוני", -"July" => "יולי", -"August" => "אוגוסט", -"September" => "ספטמבר", -"October" => "אוקטובר", -"November" => "נובמבר", -"December" => "דצמבר", -"by events date" => "לפי תאריכי האירועים", -"by yearday(s)" => "לפי ימים בשנה", -"by weeknumber(s)" => "לפי מספרי השבועות", -"by day and month" => "לפי יום וחודש", -"Date" => "תאריך", -"Cal." => "לוח שנה", -"All day" => "היום", -"Missing fields" => "שדות חסרים", -"Title" => "כותרת", -"From Date" => "מתאריך", -"From Time" => "משעה", -"To Date" => "עד תאריך", -"To Time" => "עד שעה", -"The event ends before it starts" => "האירוע מסתיים עוד לפני שהתחיל", -"There was a database fail" => "אירע כשל במסד הנתונים", -"Week" => "שבוע", -"Month" => "חודש", -"List" => "רשימה", -"Today" => "היום", -"Your calendars" => "לוחות השנה שלך", -"CalDav Link" => "קישור CalDav", -"Shared calendars" => "לוחות שנה מושתפים", -"No shared calendars" => "אין לוחות שנה משותפים", -"Share Calendar" => "שיתוף לוח שנה", -"Download" => "הורדה", -"Edit" => "עריכה", -"Delete" => "מחיקה", -"shared with you by" => "שותף אתך על ידי", -"New calendar" => "לוח שנה חדש", -"Edit calendar" => "עריכת לוח שנה", -"Displayname" => "שם תצוגה", -"Active" => "פעיל", -"Calendar color" => "צבע לוח שנה", -"Save" => "שמירה", -"Submit" => "שליחה", -"Cancel" => "ביטול", -"Edit an event" => "עריכת אירוע", -"Export" => "יצוא", -"Eventinfo" => "פרטי האירוע", -"Repeating" => "חוזר", -"Alarm" => "תזכורת", -"Attendees" => "משתתפים", -"Share" => "שיתוף", -"Title of the Event" => "כותרת האירוע", -"Category" => "קטגוריה", -"Separate categories with commas" => "הפרדת קטגוריות בפסיק", -"Edit categories" => "עריכת קטגוריות", -"All Day Event" => "אירוע של כל היום", -"From" => "מאת", -"To" => "עבור", -"Advanced options" => "אפשרויות מתקדמות", -"Location" => "מיקום", -"Location of the Event" => "מיקום האירוע", -"Description" => "תיאור", -"Description of the Event" => "תיאור האירוע", -"Repeat" => "חזרה", -"Advanced" => "מתקדם", -"Select weekdays" => "יש לבחור ימים בשבוע", -"Select days" => "יש לבחור בימים", -"and the events day of year." => "ויום האירוע בשנה.", -"and the events day of month." => "ויום האירוע בחודש.", -"Select months" => "יש לבחור בחודשים", -"Select weeks" => "יש לבחור בשבועות", -"and the events week of year." => "ומספור השבוע הפעיל בשנה.", -"Interval" => "משך", -"End" => "סיום", -"occurrences" => "מופעים", -"create a new calendar" => "יצירת לוח שנה חדש", -"Import a calendar file" => "יבוא קובץ לוח שנה", -"Name of new calendar" => "שם לוח השנה החדש", -"Import" => "יבוא", -"Close Dialog" => "סגירת הדו־שיח", -"Create a new event" => "יצירת אירוע חדש", -"View an event" => "צפייה באירוע", -"No categories selected" => "לא נבחרו קטגוריות", -"of" => "מתוך", -"at" => "בשנה", -"Timezone" => "אזור זמן", -"24h" => "24 שעות", -"12h" => "12 שעות", -"Users" => "משתמשים", -"select users" => "נא לבחור במשתמשים", -"Editable" => "ניתן לעריכה", -"Groups" => "קבוצות", -"select groups" => "בחירת קבוצות", -"make public" => "הפיכה לציבורי" -); diff --git a/apps/calendar/l10n/hr.php b/apps/calendar/l10n/hr.php deleted file mode 100644 index 4ab5b95518..0000000000 --- a/apps/calendar/l10n/hr.php +++ /dev/null @@ -1,147 +0,0 @@ - "Nisu pronađeni kalendari", -"No events found." => "Događaj nije pronađen.", -"Wrong calendar" => "Pogrešan kalendar", -"New Timezone:" => "Nova vremenska zona:", -"Timezone changed" => "Vremenska zona promijenjena", -"Invalid request" => "Neispravan zahtjev", -"Calendar" => "Kalendar", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Rođendan", -"Business" => "Poslovno", -"Call" => "Poziv", -"Clients" => "Klijenti", -"Deliverer" => "Dostavljač", -"Holidays" => "Praznici", -"Ideas" => "Ideje", -"Journey" => "Putovanje", -"Jubilee" => "Obljetnica", -"Meeting" => "Sastanak", -"Other" => "Ostalo", -"Personal" => "Osobno", -"Projects" => "Projekti", -"Questions" => "Pitanja", -"Work" => "Posao", -"unnamed" => "bezimeno", -"New Calendar" => "Novi kalendar", -"Does not repeat" => "Ne ponavlja se", -"Daily" => "Dnevno", -"Weekly" => "Tjedno", -"Every Weekday" => "Svakog radnog dana", -"Bi-Weekly" => "Dvotjedno", -"Monthly" => "Mjesečno", -"Yearly" => "Godišnje", -"never" => "nikad", -"by occurrences" => "po pojavama", -"by date" => "po datum", -"by monthday" => "po dana mjeseca", -"by weekday" => "po tjednu", -"Monday" => "ponedeljak", -"Tuesday" => "utorak", -"Wednesday" => "srijeda", -"Thursday" => "četvrtak", -"Friday" => "petak", -"Saturday" => "subota", -"Sunday" => "nedelja", -"first" => "prvi", -"second" => "drugi", -"third" => "treći", -"fourth" => "četvrti", -"fifth" => "peti", -"last" => "zadnji", -"January" => "siječanj", -"February" => "veljača", -"March" => "ožujak", -"April" => "travanj", -"May" => "svibanj", -"June" => "lipanj", -"July" => "srpanj", -"August" => "kolovoz", -"September" => "rujan", -"October" => "listopad", -"November" => "studeni", -"December" => "prosinac", -"by events date" => "po datumu događaja", -"by yearday(s)" => "po godini(-nama)", -"by weeknumber(s)" => "po broju tjedna(-ana)", -"by day and month" => "po danu i mjeseca", -"Date" => "datum", -"Cal." => "Kal.", -"All day" => "Cijeli dan", -"Missing fields" => "Nedostaju polja", -"Title" => "Naslov", -"From Date" => "Datum od", -"From Time" => "Vrijeme od", -"To Date" => "Datum do", -"To Time" => "Vrijeme do", -"The event ends before it starts" => "Događaj završava prije nego počinje", -"There was a database fail" => "Pogreška u bazi podataka", -"Week" => "Tjedan", -"Month" => "Mjesec", -"List" => "Lista", -"Today" => "Danas", -"Your calendars" => "Vaši kalendari", -"CalDav Link" => "CalDav poveznica", -"Shared calendars" => "Podijeljeni kalendari", -"No shared calendars" => "Nema zajedničkih kalendara", -"Share Calendar" => "Podjeli kalendar", -"Download" => "Spremi lokalno", -"Edit" => "Uredi", -"Delete" => "Briši", -"shared with you by" => "podijeljeno s vama od ", -"New calendar" => "Novi kalendar", -"Edit calendar" => "Uredi kalendar", -"Displayname" => "Naziv", -"Active" => "Aktivan", -"Calendar color" => "Boja kalendara", -"Save" => "Spremi", -"Submit" => "Potvrdi", -"Cancel" => "Odustani", -"Edit an event" => "Uredi događaj", -"Export" => "Izvoz", -"Eventinfo" => "Informacije o događaju", -"Repeating" => "Ponavljanje", -"Alarm" => "Alarm", -"Attendees" => "Polaznici", -"Share" => "Podijeli", -"Title of the Event" => "Naslov događaja", -"Category" => "Kategorija", -"Separate categories with commas" => "Odvoji kategorije zarezima", -"Edit categories" => "Uredi kategorije", -"All Day Event" => "Cjelodnevni događaj", -"From" => "Od", -"To" => "Za", -"Advanced options" => "Napredne mogućnosti", -"Location" => "Lokacija", -"Location of the Event" => "Lokacija događaja", -"Description" => "Opis", -"Description of the Event" => "Opis događaja", -"Repeat" => "Ponavljanje", -"Advanced" => "Napredno", -"Select weekdays" => "Odaberi dane u tjednu", -"Select days" => "Odaberi dane", -"Select months" => "Odaberi mjesece", -"Select weeks" => "Odaberi tjedne", -"Interval" => "Interval", -"End" => "Kraj", -"occurrences" => "pojave", -"create a new calendar" => "stvori novi kalendar", -"Import a calendar file" => "Uvozite datoteku kalendara", -"Name of new calendar" => "Ime novog kalendara", -"Import" => "Uvoz", -"Close Dialog" => "Zatvori dijalog", -"Create a new event" => "Unesi novi događaj", -"View an event" => "Vidjeti događaj", -"No categories selected" => "Nema odabranih kategorija", -"of" => "od", -"at" => "na", -"Timezone" => "Vremenska zona", -"24h" => "24h", -"12h" => "12h", -"Users" => "Korisnici", -"select users" => "odaberi korisnike", -"Editable" => "Može se uređivati", -"Groups" => "Grupe", -"select groups" => "izaberite grupe", -"make public" => "podjeli s javnošću" -); diff --git a/apps/calendar/l10n/hu_HU.php b/apps/calendar/l10n/hu_HU.php deleted file mode 100644 index 3ef4b9675b..0000000000 --- a/apps/calendar/l10n/hu_HU.php +++ /dev/null @@ -1,156 +0,0 @@ - "Nem található naptár", -"No events found." => "Nem található esemény", -"Wrong calendar" => "Hibás naptár", -"New Timezone:" => "Új időzóna", -"Timezone changed" => "Időzóna megváltozott", -"Invalid request" => "Érvénytelen kérés", -"Calendar" => "Naptár", -"ddd" => "nnn", -"ddd M/d" => "nnn H/n", -"dddd M/d" => "nnnn H/n", -"MMMM yyyy" => "HHHH éééé", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "nnnn, HHH n, éééé", -"Birthday" => "Születésap", -"Business" => "Üzlet", -"Call" => "Hívás", -"Clients" => "Kliensek", -"Deliverer" => "Szállító", -"Holidays" => "Ünnepek", -"Ideas" => "Ötletek", -"Journey" => "Utazás", -"Jubilee" => "Évforduló", -"Meeting" => "Találkozó", -"Other" => "Egyéb", -"Personal" => "Személyes", -"Projects" => "Projektek", -"Questions" => "Kérdések", -"Work" => "Munka", -"unnamed" => "névtelen", -"New Calendar" => "Új naptár", -"Does not repeat" => "Nem ismétlődik", -"Daily" => "Napi", -"Weekly" => "Heti", -"Every Weekday" => "Minden hétköznap", -"Bi-Weekly" => "Kéthetente", -"Monthly" => "Havi", -"Yearly" => "Évi", -"never" => "soha", -"by occurrences" => "előfordulás szerint", -"by date" => "dátum szerint", -"by monthday" => "hónap napja szerint", -"by weekday" => "hét napja szerint", -"Monday" => "Hétfő", -"Tuesday" => "Kedd", -"Wednesday" => "Szerda", -"Thursday" => "Csütörtök", -"Friday" => "Péntek", -"Saturday" => "Szombat", -"Sunday" => "Vasárnap", -"events week of month" => "hónap heteinek sorszáma", -"first" => "első", -"second" => "második", -"third" => "harmadik", -"fourth" => "negyedik", -"fifth" => "ötödik", -"last" => "utolsó", -"January" => "Január", -"February" => "Február", -"March" => "Március", -"April" => "Április", -"May" => "Május", -"June" => "Június", -"July" => "Július", -"August" => "Augusztus", -"September" => "Szeptember", -"October" => "Október", -"November" => "November", -"December" => "December", -"by events date" => "az esemény napja szerint", -"by yearday(s)" => "az év napja(i) szerint", -"by weeknumber(s)" => "a hét sorszáma szerint", -"by day and month" => "nap és hónap szerint", -"Date" => "Dátum", -"Cal." => "Naptár", -"All day" => "Egész nap", -"Missing fields" => "Hiányzó mezők", -"Title" => "Cím", -"From Date" => "Napjától", -"From Time" => "Időtől", -"To Date" => "Napig", -"To Time" => "Ideig", -"The event ends before it starts" => "Az esemény véget ér a kezdés előtt.", -"There was a database fail" => "Adatbázis hiba történt", -"Week" => "Hét", -"Month" => "Hónap", -"List" => "Lista", -"Today" => "Ma", -"Your calendars" => "Naptárjaid", -"CalDav Link" => "CalDAV link", -"Shared calendars" => "Megosztott naptárak", -"No shared calendars" => "Nincs megosztott naptár", -"Share Calendar" => "Naptármegosztás", -"Download" => "Letöltés", -"Edit" => "Szerkesztés", -"Delete" => "Törlés", -"shared with you by" => "megosztotta veled: ", -"New calendar" => "Új naptár", -"Edit calendar" => "Naptár szerkesztése", -"Displayname" => "Megjelenítési név", -"Active" => "Aktív", -"Calendar color" => "Naptár szín", -"Save" => "Mentés", -"Submit" => "Beküldés", -"Cancel" => "Mégse", -"Edit an event" => "Esemény szerkesztése", -"Export" => "Export", -"Eventinfo" => "Eseményinfó", -"Repeating" => "Ismétlődő", -"Alarm" => "Riasztás", -"Attendees" => "Résztvevők", -"Share" => "Megosztás", -"Title of the Event" => "Az esemény címe", -"Category" => "Kategória", -"Separate categories with commas" => "Vesszővel válaszd el a kategóriákat", -"Edit categories" => "Kategóriák szerkesztése", -"All Day Event" => "Egész napos esemény", -"From" => "Ettől", -"To" => "Eddig", -"Advanced options" => "Haladó beállítások", -"Location" => "Hely", -"Location of the Event" => "Az esemény helyszíne", -"Description" => "Leírás", -"Description of the Event" => "Az esemény leírása", -"Repeat" => "Ismétlés", -"Advanced" => "Haladó", -"Select weekdays" => "Hétköznapok kiválasztása", -"Select days" => "Napok kiválasztása", -"and the events day of year." => "és az éves esemény napja.", -"and the events day of month." => "és a havi esemény napja.", -"Select months" => "Hónapok kiválasztása", -"Select weeks" => "Hetek kiválasztása", -"and the events week of year." => "és az heti esemény napja.", -"Interval" => "Időköz", -"End" => "Vége", -"occurrences" => "előfordulások", -"create a new calendar" => "új naptár létrehozása", -"Import a calendar file" => "Naptár-fájl importálása", -"Name of new calendar" => "Új naptár neve", -"Import" => "Importálás", -"Close Dialog" => "Párbeszédablak bezárása", -"Create a new event" => "Új esemény létrehozása", -"View an event" => "Esemény megtekintése", -"No categories selected" => "Nincs kiválasztott kategória", -"of" => ", tulaj ", -"at" => ", ", -"Timezone" => "Időzóna", -"24h" => "24h", -"12h" => "12h", -"Users" => "Felhasználók", -"select users" => "válassz felhasználókat", -"Editable" => "Szerkeszthető", -"Groups" => "Csoportok", -"select groups" => "válassz csoportokat", -"make public" => "nyilvánossá tétel" -); diff --git a/apps/calendar/l10n/hy.php b/apps/calendar/l10n/hy.php deleted file mode 100644 index 3b675693b0..0000000000 --- a/apps/calendar/l10n/hy.php +++ /dev/null @@ -1,11 +0,0 @@ - "Օրացույց", -"Other" => "Այլ", -"Month" => "Ամիս", -"Today" => "Այսօր", -"Download" => "Բեռնել", -"Delete" => "Ջնջել", -"Save" => "Պահպանել", -"Submit" => "Հաստատել", -"Description" => "Նկարագրություն" -); diff --git a/apps/calendar/l10n/ia.php b/apps/calendar/l10n/ia.php deleted file mode 100644 index 84c36536b9..0000000000 --- a/apps/calendar/l10n/ia.php +++ /dev/null @@ -1,110 +0,0 @@ - "Necun calendarios trovate.", -"No events found." => "Nulle eventos trovate.", -"New Timezone:" => "Nove fuso horari", -"Invalid request" => "Requesta invalide.", -"Calendar" => "Calendario", -"Birthday" => "Anniversario de nativitate", -"Business" => "Affaires", -"Call" => "Appello", -"Clients" => "Clientes", -"Holidays" => "Dies feriate", -"Meeting" => "Incontro", -"Other" => "Altere", -"Personal" => "Personal", -"Projects" => "Projectos", -"Questions" => "Demandas", -"Work" => "Travalio", -"unnamed" => "sin nomine", -"New Calendar" => "Nove calendario", -"Does not repeat" => "Non repite", -"Daily" => "Quotidian", -"Weekly" => "Septimanal", -"Every Weekday" => "Cata die", -"Monthly" => "Mensual", -"Yearly" => "Cata anno", -"never" => "nunquam", -"by date" => "per data", -"Monday" => "Lunedi", -"Tuesday" => "Martedi", -"Wednesday" => "Mercuridi", -"Thursday" => "Jovedi", -"Friday" => "Venerdi", -"Saturday" => "Sabbato", -"Sunday" => "Dominica", -"first" => "prime", -"second" => "secunde", -"third" => "tertie", -"last" => "ultime", -"January" => "januario", -"February" => "Februario", -"March" => "Martio", -"April" => "April", -"May" => "Mai", -"June" => "Junio", -"July" => "Julio", -"August" => "Augusto", -"September" => "Septembre", -"October" => "Octobre", -"November" => "Novembre", -"December" => "Decembre", -"by events date" => "per data de eventos", -"by day and month" => "per dia e mense", -"Date" => "Data", -"All day" => "Omne die", -"Missing fields" => "Campos incomplete", -"Title" => "Titulo", -"From Date" => "Data de initio", -"From Time" => "Hora de initio", -"To Date" => "Data de fin", -"To Time" => "Hora de fin", -"Week" => "Septimana", -"Month" => "Mense", -"List" => "Lista", -"Today" => "Hodie", -"Your calendars" => "Tu calendarios", -"Download" => "Discarga", -"Edit" => "Modificar", -"Delete" => "Deler", -"New calendar" => "Nove calendario", -"Edit calendar" => "Modificar calendario", -"Active" => "Active", -"Calendar color" => "Color de calendario", -"Save" => "Salveguardar", -"Submit" => "Inviar", -"Cancel" => "Cancellar", -"Edit an event" => "Modificar evento", -"Export" => "Exportar", -"Share" => "Compartir", -"Title of the Event" => "Titulo del evento.", -"Category" => "Categoria", -"Edit categories" => "Modificar categorias", -"From" => "Ab", -"To" => "A", -"Advanced options" => "Optiones avantiate", -"Location" => "Loco", -"Location of the Event" => "Loco del evento.", -"Description" => "Description", -"Description of the Event" => "Description del evento", -"Repeat" => "Repeter", -"Advanced" => "Avantiate", -"Select weekdays" => "Seliger dies del septimana", -"Select days" => "Seliger dies", -"Select months" => "Seliger menses", -"Select weeks" => "Seliger septimanas", -"Interval" => "Intervallo", -"End" => "Fin", -"create a new calendar" => "crear un nove calendario", -"Import a calendar file" => "Importar un file de calendario", -"Name of new calendar" => "Nomine del calendario", -"Import" => "Importar", -"Close Dialog" => "Clauder dialogo", -"Create a new event" => "Crear un nove evento", -"View an event" => "Vide un evento", -"No categories selected" => "Nulle categorias seligite", -"of" => "de", -"at" => "in", -"Timezone" => "Fuso horari", -"Users" => "Usatores", -"Groups" => "Gruppos" -); diff --git a/apps/calendar/l10n/id.php b/apps/calendar/l10n/id.php deleted file mode 100644 index 865c2118fa..0000000000 --- a/apps/calendar/l10n/id.php +++ /dev/null @@ -1,37 +0,0 @@ - "Zona waktu telah diubah", -"Invalid request" => "Permintaan tidak sah", -"Calendar" => "Kalender", -"Does not repeat" => "Tidak akan mengulangi", -"Daily" => "Harian", -"Weekly" => "Mingguan", -"Every Weekday" => "Setiap Hari Minggu", -"Bi-Weekly" => "Dwi-mingguan", -"Monthly" => "Bulanan", -"Yearly" => "Tahunan", -"All day" => "Semua Hari", -"Title" => "Judul", -"Week" => "Minggu", -"Month" => "Bulan", -"Today" => "Hari ini", -"Download" => "Unduh", -"Edit" => "Sunting", -"Edit calendar" => "Sunting kalender", -"Displayname" => "Namatampilan", -"Active" => "Aktif", -"Calendar color" => "Warna kalender", -"Submit" => "Sampaikan", -"Edit an event" => "Sunting agenda", -"Title of the Event" => "Judul Agenda", -"Category" => "Kategori", -"All Day Event" => "Agenda di Semua Hari", -"From" => "Dari", -"To" => "Ke", -"Location" => "Lokasi", -"Location of the Event" => "Lokasi Agenda", -"Description" => "Deskripsi", -"Description of the Event" => "Deskripsi dari Agenda", -"Repeat" => "Ulangi", -"Create a new event" => "Buat agenda baru", -"Timezone" => "Zonawaktu" -); diff --git a/apps/calendar/l10n/it.php b/apps/calendar/l10n/it.php deleted file mode 100644 index 04e10b582b..0000000000 --- a/apps/calendar/l10n/it.php +++ /dev/null @@ -1,198 +0,0 @@ - "Non tutti i calendari sono mantenuti completamente in cache", -"Everything seems to be completely cached" => "Tutto sembra essere mantenuto completamente in cache", -"No calendars found." => "Nessun calendario trovato.", -"No events found." => "Nessun evento trovato.", -"Wrong calendar" => "Calendario sbagliato", -"The file contained either no events or all events are already saved in your calendar." => "Il file non conteneva alcun evento o tutti gli eventi erano già salvati nel tuo calendario.", -"events has been saved in the new calendar" => "gli eventi sono stati salvati nel nuovo calendario", -"Import failed" => "Importazione non riuscita", -"events has been saved in your calendar" => "gli eventi sono stati salvati nel tuo calendario", -"New Timezone:" => "Nuovo fuso orario:", -"Timezone changed" => "Fuso orario cambiato", -"Invalid request" => "Richiesta non valida", -"Calendar" => "Calendario", -"ddd" => "ddd", -"ddd M/d" => "ddd d/M", -"dddd M/d" => "dddd d/M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, d MMM yyyy", -"Birthday" => "Compleanno", -"Business" => "Azienda", -"Call" => "Chiama", -"Clients" => "Clienti", -"Deliverer" => "Consegna", -"Holidays" => "Vacanze", -"Ideas" => "Idee", -"Journey" => "Viaggio", -"Jubilee" => "Anniversario", -"Meeting" => "Riunione", -"Other" => "Altro", -"Personal" => "Personale", -"Projects" => "Progetti", -"Questions" => "Domande", -"Work" => "Lavoro", -"by" => "da", -"unnamed" => "senza nome", -"New Calendar" => "Nuovo calendario", -"Does not repeat" => "Non ripetere", -"Daily" => "Giornaliero", -"Weekly" => "Settimanale", -"Every Weekday" => "Ogni giorno della settimana", -"Bi-Weekly" => "Ogni due settimane", -"Monthly" => "Mensile", -"Yearly" => "Annuale", -"never" => "mai", -"by occurrences" => "per occorrenze", -"by date" => "per data", -"by monthday" => "per giorno del mese", -"by weekday" => "per giorno della settimana", -"Monday" => "Lunedì", -"Tuesday" => "Martedì", -"Wednesday" => "Mercoledì", -"Thursday" => "Giovedì", -"Friday" => "Venerdì", -"Saturday" => "Sabato", -"Sunday" => "Domenica", -"events week of month" => "settimana del mese degli eventi", -"first" => "primo", -"second" => "secondo", -"third" => "terzo", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "ultimo", -"January" => "Gennaio", -"February" => "Febbraio", -"March" => "Marzo", -"April" => "Aprile", -"May" => "Maggio", -"June" => "Giugno", -"July" => "Luglio", -"August" => "Agosto", -"September" => "Settembre", -"October" => "Ottobre", -"November" => "Novembre", -"December" => "Dicembre", -"by events date" => "per data evento", -"by yearday(s)" => "per giorno/i dell'anno", -"by weeknumber(s)" => "per numero/i settimana", -"by day and month" => "per giorno e mese", -"Date" => "Data", -"Cal." => "Cal.", -"Sun." => "Dom.", -"Mon." => "Lun.", -"Tue." => "Mar.", -"Wed." => "Mer.", -"Thu." => "Gio.", -"Fri." => "Ven.", -"Sat." => "Sab.", -"Jan." => "Gen.", -"Feb." => "Feb.", -"Mar." => "Mar.", -"Apr." => "Apr.", -"May." => "Mag.", -"Jun." => "Giu.", -"Jul." => "Lug.", -"Aug." => "Ago.", -"Sep." => "Set.", -"Oct." => "Ott.", -"Nov." => "Nov.", -"Dec." => "Dic.", -"All day" => "Tutti il giorno", -"Missing fields" => "Campi mancanti", -"Title" => "Titolo", -"From Date" => "Dal giorno", -"From Time" => "Ora iniziale", -"To Date" => "Al giorno", -"To Time" => "Ora finale", -"The event ends before it starts" => "L'evento finisce prima d'iniziare", -"There was a database fail" => "Si è verificato un errore del database", -"Week" => "Settimana", -"Month" => "Mese", -"List" => "Elenco", -"Today" => "Oggi", -"Settings" => "Impostazioni", -"Your calendars" => "I tuoi calendari", -"CalDav Link" => "Collegamento CalDav", -"Shared calendars" => "Calendari condivisi", -"No shared calendars" => "Nessun calendario condiviso", -"Share Calendar" => "Condividi calendario", -"Download" => "Scarica", -"Edit" => "Modifica", -"Delete" => "Elimina", -"shared with you by" => "condiviso con te da", -"New calendar" => "Nuovo calendario", -"Edit calendar" => "Modifica calendario", -"Displayname" => "Nome visualizzato", -"Active" => "Attivo", -"Calendar color" => "Colore calendario", -"Save" => "Salva", -"Submit" => "Invia", -"Cancel" => "Annulla", -"Edit an event" => "Modifica un evento", -"Export" => "Esporta", -"Eventinfo" => "Informazioni evento", -"Repeating" => "Ripetizione", -"Alarm" => "Avviso", -"Attendees" => "Partecipanti", -"Share" => "Condividi", -"Title of the Event" => "Titolo dell'evento", -"Category" => "Categoria", -"Separate categories with commas" => "Categorie separate da virgole", -"Edit categories" => "Modifica le categorie", -"All Day Event" => "Evento che occupa tutta la giornata", -"From" => "Da", -"To" => "A", -"Advanced options" => "Opzioni avanzate", -"Location" => "Luogo", -"Location of the Event" => "Luogo dell'evento", -"Description" => "Descrizione", -"Description of the Event" => "Descrizione dell'evento", -"Repeat" => "Ripeti", -"Advanced" => "Avanzato", -"Select weekdays" => "Seleziona i giorni della settimana", -"Select days" => "Seleziona i giorni", -"and the events day of year." => "e il giorno dell'anno degli eventi.", -"and the events day of month." => "e il giorno del mese degli eventi.", -"Select months" => "Seleziona i mesi", -"Select weeks" => "Seleziona le settimane", -"and the events week of year." => "e la settimana dell'anno degli eventi.", -"Interval" => "Intervallo", -"End" => "Fine", -"occurrences" => "occorrenze", -"create a new calendar" => "Crea un nuovo calendario", -"Import a calendar file" => "Importa un file di calendario", -"Please choose a calendar" => "Scegli un calendario", -"Name of new calendar" => "Nome del nuovo calendario", -"Take an available name!" => "Usa un nome disponibile!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Un calendario con questo nome esiste già. Se continui, i due calendari saranno uniti.", -"Import" => "Importa", -"Close Dialog" => "Chiudi la finestra di dialogo", -"Create a new event" => "Crea un nuovo evento", -"View an event" => "Visualizza un evento", -"No categories selected" => "Nessuna categoria selezionata", -"of" => "di", -"at" => "alle", -"General" => "Generale", -"Timezone" => "Fuso orario", -"Update timezone automatically" => "Aggiorna automaticamente il fuso orario", -"Time format" => "Formato orario", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "La settimana inizia il", -"Cache" => "Cache", -"Clear cache for repeating events" => "Cancella gli eventi che si ripetono dalla cache", -"URLs" => "URL", -"Calendar CalDAV syncing addresses" => "Indirizzi di sincronizzazione calendari CalDAV", -"more info" => "ulteriori informazioni", -"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Collegamento(i) iCalendar sola lettura", -"Users" => "Utenti", -"select users" => "seleziona utenti", -"Editable" => "Modificabile", -"Groups" => "Gruppi", -"select groups" => "seleziona gruppi", -"make public" => "rendi pubblico" -); diff --git a/apps/calendar/l10n/ja_JP.php b/apps/calendar/l10n/ja_JP.php deleted file mode 100644 index 3c7793a850..0000000000 --- a/apps/calendar/l10n/ja_JP.php +++ /dev/null @@ -1,198 +0,0 @@ - "すべてのカレンダーは完全にキャッシュされていません", -"Everything seems to be completely cached" => "すべて完全にキャッシュされていると思われます", -"No calendars found." => "カレンダーが見つかりませんでした。", -"No events found." => "イベントが見つかりませんでした。", -"Wrong calendar" => "誤ったカレンダーです", -"The file contained either no events or all events are already saved in your calendar." => "イベントの無いもしくはすべてのイベントを含むファイルは既にあなたのカレンダーに保存されています。", -"events has been saved in the new calendar" => "イベントは新しいカレンダーに保存されました", -"Import failed" => "インポートに失敗", -"events has been saved in your calendar" => "イベントはあなたのカレンダーに保存されました", -"New Timezone:" => "新しいタイムゾーン:", -"Timezone changed" => "タイムゾーンが変更されました", -"Invalid request" => "無効なリクエストです", -"Calendar" => "カレンダー", -"ddd" => "dddd", -"ddd M/d" => "M月d日 (dddd)", -"dddd M/d" => "M月d日 (dddd)", -"MMMM yyyy" => "yyyy年M月", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "yyyy年M月d日{ '~' [yyyy年][M月]d日}", -"dddd, MMM d, yyyy" => "yyyy年M月d日 (dddd)", -"Birthday" => "誕生日", -"Business" => "ビジネス", -"Call" => "電話をかける", -"Clients" => "顧客", -"Deliverer" => "運送会社", -"Holidays" => "休日", -"Ideas" => "アイデア", -"Journey" => "旅行", -"Jubilee" => "記念祭", -"Meeting" => "ミーティング", -"Other" => "その他", -"Personal" => "個人", -"Projects" => "プロジェクト", -"Questions" => "質問事項", -"Work" => "週の始まり", -"by" => "による", -"unnamed" => "無名", -"New Calendar" => "新しくカレンダーを作成", -"Does not repeat" => "繰り返さない", -"Daily" => "毎日", -"Weekly" => "毎週", -"Every Weekday" => "毎平日", -"Bi-Weekly" => "2週間ごと", -"Monthly" => "毎月", -"Yearly" => "毎年", -"never" => "無し", -"by occurrences" => "回数で指定", -"by date" => "日付で指定", -"by monthday" => "日にちで指定", -"by weekday" => "曜日で指定", -"Monday" => "月", -"Tuesday" => "火", -"Wednesday" => "水", -"Thursday" => "木", -"Friday" => "金", -"Saturday" => "土", -"Sunday" => "日", -"events week of month" => "予定のある週を指定", -"first" => "1週目", -"second" => "2週目", -"third" => "3週目", -"fourth" => "4週目", -"fifth" => "5週目", -"last" => "最終週", -"January" => "1月", -"February" => "2月", -"March" => "3月", -"April" => "4月", -"May" => "5月", -"June" => "6月", -"July" => "7月", -"August" => "8月", -"September" => "9月", -"October" => "10月", -"November" => "11月", -"December" => "12月", -"by events date" => "日付で指定", -"by yearday(s)" => "日番号で指定", -"by weeknumber(s)" => "週番号で指定", -"by day and month" => "月と日で指定", -"Date" => "日付", -"Cal." => "カレンダー", -"Sun." => "日", -"Mon." => "月", -"Tue." => "火", -"Wed." => "水", -"Thu." => "木", -"Fri." => "金", -"Sat." => "土", -"Jan." => "1月", -"Feb." => "2月", -"Mar." => "3月", -"Apr." => "4月", -"May." => "5月", -"Jun." => "6月", -"Jul." => "7月", -"Aug." => "8月", -"Sep." => "9月", -"Oct." => "10月", -"Nov." => "11月", -"Dec." => "12月", -"All day" => "終日", -"Missing fields" => "項目がありません", -"Title" => "タイトル", -"From Date" => "開始日", -"From Time" => "開始時間", -"To Date" => "終了日", -"To Time" => "終了時間", -"The event ends before it starts" => "イベント終了時間が開始時間より先です", -"There was a database fail" => "データベースのエラーがありました", -"Week" => "週", -"Month" => "月", -"List" => "予定リスト", -"Today" => "今日", -"Settings" => "設定", -"Your calendars" => "あなたのカレンダー", -"CalDav Link" => "CalDavへのリンク", -"Shared calendars" => "共有カレンダー", -"No shared calendars" => "共有カレンダーはありません", -"Share Calendar" => "カレンダーを共有する", -"Download" => "ダウンロード", -"Edit" => "編集", -"Delete" => "削除", -"shared with you by" => "共有者", -"New calendar" => "新しいカレンダー", -"Edit calendar" => "カレンダーを編集", -"Displayname" => "表示名", -"Active" => "アクティブ", -"Calendar color" => "カレンダーの色", -"Save" => "保存", -"Submit" => "完了", -"Cancel" => "キャンセル", -"Edit an event" => "イベントを編集", -"Export" => "エクスポート", -"Eventinfo" => "イベント情報", -"Repeating" => "繰り返し", -"Alarm" => "アラーム", -"Attendees" => "参加者", -"Share" => "共有", -"Title of the Event" => "イベントのタイトル", -"Category" => "カテゴリー", -"Separate categories with commas" => "カテゴリをコンマで区切る", -"Edit categories" => "カテゴリを編集", -"All Day Event" => "終日イベント", -"From" => "開始", -"To" => "終了", -"Advanced options" => "詳細設定", -"Location" => "場所", -"Location of the Event" => "イベントの場所", -"Description" => "メモ", -"Description of the Event" => "イベントの説明", -"Repeat" => "繰り返し", -"Advanced" => "詳細設定", -"Select weekdays" => "曜日を指定", -"Select days" => "日付を指定", -"and the events day of year." => "対象の年を選択する。", -"and the events day of month." => "対象の月を選択する。", -"Select months" => "月を指定する", -"Select weeks" => "週を指定する", -"and the events week of year." => "対象の週を選択する。", -"Interval" => "間隔", -"End" => "繰り返す期間", -"occurrences" => "回繰り返す", -"create a new calendar" => "新規カレンダーの作成", -"Import a calendar file" => "カレンダーファイルをインポート", -"Please choose a calendar" => "カレンダーを選択してください", -"Name of new calendar" => "新規カレンダーの名称", -"Take an available name!" => "利用可能な名前を指定してください!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "このカレンダー名はすでに使われています。もし続行する場合は、これらのカレンダーはマージされます。", -"Import" => "インポート", -"Close Dialog" => "ダイアログを閉じる", -"Create a new event" => "新しいイベントを作成", -"View an event" => "イベントを閲覧", -"No categories selected" => "カテゴリが選択されていません", -"of" => "of", -"at" => "at", -"General" => "一般", -"Timezone" => "タイムゾーン", -"Update timezone automatically" => "自動的にタイムゾーンを更新", -"Time format" => "時刻の表示形式", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "1週間の初めの曜日", -"Cache" => "キャッシュ", -"Clear cache for repeating events" => "繰り返しイベントのキャッシュをクリア", -"URLs" => "URL", -"Calendar CalDAV syncing addresses" => "CalDAVカレンダーの同期用アドレス", -"more info" => "さらに", -"Primary address (Kontact et al)" => "プライマリアドレス(コンタクト等)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "読み取り専用のiCalendarリンク", -"Users" => "ユーザ", -"select users" => "ユーザを選択", -"Editable" => "編集可能", -"Groups" => "グループ", -"select groups" => "グループを選択", -"make public" => "公開する" -); diff --git a/apps/calendar/l10n/ko.php b/apps/calendar/l10n/ko.php deleted file mode 100644 index 77e421d4aa..0000000000 --- a/apps/calendar/l10n/ko.php +++ /dev/null @@ -1,156 +0,0 @@ - "달력이 없습니다", -"No events found." => "일정이 없습니다", -"Wrong calendar" => "잘못된 달력", -"New Timezone:" => "새로운 시간대 설정", -"Timezone changed" => "시간대 변경됨", -"Invalid request" => "잘못된 요청", -"Calendar" => "달력", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "생일", -"Business" => "사업", -"Call" => "통화", -"Clients" => "클라이언트", -"Deliverer" => "배송", -"Holidays" => "공휴일", -"Ideas" => "생각", -"Journey" => "여행", -"Jubilee" => "기념일", -"Meeting" => "미팅", -"Other" => "기타", -"Personal" => "개인", -"Projects" => "프로젝트", -"Questions" => "질문", -"Work" => "작업", -"unnamed" => "익명의", -"New Calendar" => "새로운 달력", -"Does not repeat" => "반복 없음", -"Daily" => "매일", -"Weekly" => "매주", -"Every Weekday" => "매주 특정 요일", -"Bi-Weekly" => "2주마다", -"Monthly" => "매월", -"Yearly" => "매년", -"never" => "전혀", -"by occurrences" => "번 이후", -"by date" => "날짜", -"by monthday" => "월", -"by weekday" => "주", -"Monday" => "월요일", -"Tuesday" => "화요일", -"Wednesday" => "수요일", -"Thursday" => "목요일", -"Friday" => "금요일", -"Saturday" => "토요일", -"Sunday" => "일요일", -"events week of month" => "이달의 한 주 일정", -"first" => "첫번째", -"second" => "두번째", -"third" => "세번째", -"fourth" => "네번째", -"fifth" => "다섯번째", -"last" => "마지막", -"January" => "1월", -"February" => "2월", -"March" => "3월", -"April" => "4월", -"May" => "5월", -"June" => "6월", -"July" => "7월", -"August" => "8월", -"September" => "9월", -"October" => "10월", -"November" => "11월", -"December" => "12월", -"by events date" => "이벤트 날짜 순", -"by yearday(s)" => "날짜 번호 순", -"by weeknumber(s)" => "주 번호 순", -"by day and month" => "날짜 순", -"Date" => "날짜", -"Cal." => "달력", -"All day" => "매일", -"Missing fields" => "기입란이 비어있습니다", -"Title" => "제목", -"From Date" => "시작날짜", -"From Time" => "시작시간", -"To Date" => "마침 날짜", -"To Time" => "마침 시간", -"The event ends before it starts" => "마침일정이 시작일정 보다 빠릅니다. ", -"There was a database fail" => "데이터베이스 에러입니다.", -"Week" => "주", -"Month" => "달", -"List" => "목록", -"Today" => "오늘", -"Your calendars" => "내 달력", -"CalDav Link" => "CalDav 링크", -"Shared calendars" => "공유 달력", -"No shared calendars" => "달력 공유하지 않음", -"Share Calendar" => "달력 공유", -"Download" => "다운로드", -"Edit" => "편집", -"Delete" => "삭제", -"shared with you by" => "로 인해 당신과 함께 공유", -"New calendar" => "새로운 달력", -"Edit calendar" => "달력 편집", -"Displayname" => "표시 이름", -"Active" => "활성", -"Calendar color" => "달력 색상", -"Save" => "저장", -"Submit" => "보내기", -"Cancel" => "취소", -"Edit an event" => "이벤트 편집", -"Export" => "출력", -"Eventinfo" => "일정 정보", -"Repeating" => "반복", -"Alarm" => "알람", -"Attendees" => "참석자", -"Share" => "공유", -"Title of the Event" => "이벤트 제목", -"Category" => "분류", -"Separate categories with commas" => "쉼표로 카테고리 구분", -"Edit categories" => "카테고리 수정", -"All Day Event" => "종일 이벤트", -"From" => "시작", -"To" => "끝", -"Advanced options" => "고급 설정", -"Location" => "위치", -"Location of the Event" => "이벤트 위치", -"Description" => "설명", -"Description of the Event" => "이벤트 설명", -"Repeat" => "반복", -"Advanced" => "고급", -"Select weekdays" => "요일 선택", -"Select days" => "날짜 선택", -"and the events day of year." => "그리고 이 해의 일정", -"and the events day of month." => "그리고 이 달의 일정", -"Select months" => "달 선택", -"Select weeks" => "주 선택", -"and the events week of year." => "그리고 이 해의 주간 일정", -"Interval" => "간격", -"End" => "끝", -"occurrences" => "번 이후", -"create a new calendar" => "새 달력 만들기", -"Import a calendar file" => "달력 파일 가져오기", -"Name of new calendar" => "새 달력 이름", -"Import" => "입력", -"Close Dialog" => "대화 마침", -"Create a new event" => "새 이벤트 만들기", -"View an event" => "일정 보기", -"No categories selected" => "선택된 카테고리 없음", -"of" => "의", -"at" => "에서", -"Timezone" => "시간대", -"24h" => "24시간", -"12h" => "12시간", -"Users" => "사용자", -"select users" => "사용자 선택", -"Editable" => "편집 가능", -"Groups" => "그룹", -"select groups" => "선택 그룹", -"make public" => "공개" -); diff --git a/apps/calendar/l10n/lb.php b/apps/calendar/l10n/lb.php deleted file mode 100644 index 1ef05b048c..0000000000 --- a/apps/calendar/l10n/lb.php +++ /dev/null @@ -1,123 +0,0 @@ - "Keng Kalenner fonnt.", -"No events found." => "Keng Evenementer fonnt.", -"Wrong calendar" => "Falschen Kalenner", -"New Timezone:" => "Nei Zäitzone:", -"Timezone changed" => "Zäitzon geännert", -"Invalid request" => "Ongülteg Requête", -"Calendar" => "Kalenner", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Gebuertsdag", -"Business" => "Geschäftlech", -"Call" => "Uruff", -"Clients" => "Clienten", -"Deliverer" => "Liwwerant", -"Holidays" => "Vakanzen", -"Ideas" => "Ideeën", -"Journey" => "Dag", -"Jubilee" => "Jubiläum", -"Meeting" => "Meeting", -"Other" => "Aner", -"Personal" => "Perséinlech", -"Projects" => "Projeten", -"Questions" => "Froen", -"Work" => "Aarbecht", -"New Calendar" => "Neien Kalenner", -"Does not repeat" => "Widderhëlt sech net", -"Daily" => "Deeglech", -"Weekly" => "All Woch", -"Every Weekday" => "All Wochendag", -"Bi-Weekly" => "All zweet Woch", -"Monthly" => "All Mount", -"Yearly" => "All Joer", -"never" => "ni", -"by occurrences" => "no Virkommes", -"by date" => "no Datum", -"by monthday" => "no Mount-Dag", -"by weekday" => "no Wochendag", -"Monday" => "Méindes", -"Tuesday" => "Dënschdes", -"Wednesday" => "Mëttwoch", -"Thursday" => "Donneschdes", -"Friday" => "Freides", -"Saturday" => "Samschdes", -"Sunday" => "Sonndes", -"first" => "éischt", -"second" => "Sekonn", -"third" => "Drëtt", -"fourth" => "Féiert", -"fifth" => "Fënneft", -"last" => "Läscht", -"January" => "Januar", -"February" => "Februar", -"March" => "Mäerz", -"April" => "Abrëll", -"May" => "Mee", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Dezember", -"Date" => "Datum", -"Cal." => "Cal.", -"All day" => "All Dag", -"Missing fields" => "Felder déi feelen", -"Title" => "Titel", -"From Date" => "Vun Datum", -"From Time" => "Vun Zäit", -"To Date" => "Bis Datum", -"To Time" => "Bis Zäit", -"The event ends before it starts" => "D'Evenement hält op ier et ufänkt", -"There was a database fail" => "En Datebank Feeler ass opgetrueden", -"Week" => "Woch", -"Month" => "Mount", -"List" => "Lescht", -"Today" => "Haut", -"Your calendars" => "Deng Kalenneren", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Gedeelte Kalenneren", -"No shared calendars" => "Keng gedeelten Kalenneren", -"Download" => "Eroflueden", -"Edit" => "Editéieren", -"Delete" => "Läschen", -"New calendar" => "Neien Kalenner", -"Edit calendar" => "Kalenner editéieren", -"Displayname" => "Numm", -"Active" => "Aktiv", -"Calendar color" => "Fuerf vum Kalenner", -"Save" => "Späicheren", -"Submit" => "Fortschécken", -"Cancel" => "Ofbriechen", -"Edit an event" => "Evenement editéieren", -"Export" => "Export", -"Title of the Event" => "Titel vum Evenement", -"Category" => "Kategorie", -"All Day Event" => "Ganz-Dag Evenement", -"From" => "Vun", -"To" => "Fir", -"Advanced options" => "Avancéiert Optiounen", -"Location" => "Uert", -"Location of the Event" => "Uert vum Evenement", -"Description" => "Beschreiwung", -"Description of the Event" => "Beschreiwung vum Evenement", -"Repeat" => "Widderhuelen", -"Advanced" => "Erweidert", -"Select weekdays" => "Wochendeeg auswielen", -"Select days" => "Deeg auswielen", -"Select months" => "Méint auswielen", -"Select weeks" => "Wochen auswielen", -"Interval" => "Intervall", -"End" => "Enn", -"occurrences" => "Virkommes", -"create a new calendar" => "E neie Kalenner uleeën", -"Import a calendar file" => "E Kalenner Fichier importéieren", -"Name of new calendar" => "Numm vum neie Kalenner", -"Import" => "Import", -"Close Dialog" => "Dialog zoumaachen", -"Create a new event" => "En Evenement maachen", -"Timezone" => "Zäitzon", -"24h" => "24h", -"12h" => "12h" -); diff --git a/apps/calendar/l10n/lt_LT.php b/apps/calendar/l10n/lt_LT.php deleted file mode 100644 index feb8618897..0000000000 --- a/apps/calendar/l10n/lt_LT.php +++ /dev/null @@ -1,131 +0,0 @@ - "Kalendorių nerasta.", -"No events found." => "Įvykių nerasta.", -"Wrong calendar" => "Ne tas kalendorius", -"New Timezone:" => "Nauja laiko juosta:", -"Timezone changed" => "Laiko zona pakeista", -"Invalid request" => "Klaidinga užklausa", -"Calendar" => "Kalendorius", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Gimtadienis", -"Business" => "Verslas", -"Call" => "Skambučiai", -"Clients" => "Klientai", -"Deliverer" => "Vykdytojas", -"Holidays" => "Išeiginės", -"Ideas" => "Idėjos", -"Journey" => "Kelionė", -"Jubilee" => "Jubiliejus", -"Meeting" => "Susitikimas", -"Other" => "Kiti", -"Personal" => "Asmeniniai", -"Projects" => "Projektai", -"Questions" => "Klausimai", -"Work" => "Darbas", -"unnamed" => "be pavadinimo", -"New Calendar" => "Naujas kalendorius", -"Does not repeat" => "Nekartoti", -"Daily" => "Kasdien", -"Weekly" => "Kiekvieną savaitę", -"Every Weekday" => "Kiekvieną savaitės dieną", -"Bi-Weekly" => "Kas dvi savaites", -"Monthly" => "Kiekvieną mėnesį", -"Yearly" => "Kiekvienais metais", -"never" => "niekada", -"by date" => "pagal datą", -"by monthday" => "pagal mėnesio dieną", -"by weekday" => "pagal savaitės dieną", -"Monday" => "Pirmadienis", -"Tuesday" => "Antradienis", -"Wednesday" => "Trečiadienis", -"Thursday" => "Ketvirtadienis", -"Friday" => "Penktadienis", -"Saturday" => "Šeštadienis", -"Sunday" => "Sekmadienis", -"January" => "Sausis", -"February" => "Vasaris", -"March" => "Kovas", -"April" => "Balandis", -"May" => "Gegužė", -"June" => "Birželis", -"July" => "Liepa", -"August" => "Rugpjūtis", -"September" => "Rugsėjis", -"October" => "Spalis", -"November" => "Lapkritis", -"December" => "Gruodis", -"Date" => "Data", -"Cal." => "Kal.", -"All day" => "Visa diena", -"Missing fields" => "Trūkstami laukai", -"Title" => "Pavadinimas", -"From Date" => "Nuo datos", -"From Time" => "Nuo laiko", -"To Date" => "Iki datos", -"To Time" => "Iki laiko", -"The event ends before it starts" => "Įvykis baigiasi anksčiau nei jis prasideda", -"There was a database fail" => "Įvyko duomenų bazės klaida", -"Week" => "Savaitė", -"Month" => "Mėnuo", -"List" => "Sąrašas", -"Today" => "Šiandien", -"Your calendars" => "Jūsų kalendoriai", -"CalDav Link" => "CalDav adresas", -"Shared calendars" => "Bendri kalendoriai", -"No shared calendars" => "Bendrų kalendorių nėra", -"Share Calendar" => "Dalintis kalendoriumi", -"Download" => "Atsisiųsti", -"Edit" => "Keisti", -"Delete" => "Trinti", -"New calendar" => "Naujas kalendorius", -"Edit calendar" => "Taisyti kalendorių", -"Displayname" => "Pavadinimas", -"Active" => "Naudojamas", -"Calendar color" => "Kalendoriaus spalva", -"Save" => "Išsaugoti", -"Submit" => "Išsaugoti", -"Cancel" => "Atšaukti", -"Edit an event" => "Taisyti įvykį", -"Export" => "Eksportuoti", -"Eventinfo" => "Informacija", -"Repeating" => "Pasikartojantis", -"Alarm" => "Priminimas", -"Attendees" => "Dalyviai", -"Share" => "Dalintis", -"Title of the Event" => "Įvykio pavadinimas", -"Category" => "Kategorija", -"Separate categories with commas" => "Atskirkite kategorijas kableliais", -"Edit categories" => "Redaguoti kategorijas", -"All Day Event" => "Visos dienos įvykis", -"From" => "Nuo", -"To" => "Iki", -"Advanced options" => "Papildomi nustatymai", -"Location" => "Vieta", -"Location of the Event" => "Įvykio vieta", -"Description" => "Aprašymas", -"Description of the Event" => "Įvykio aprašymas", -"Repeat" => "Kartoti", -"Select weekdays" => "Pasirinkite savaitės dienas", -"Select days" => "Pasirinkite dienas", -"Select months" => "Pasirinkite mėnesius", -"Select weeks" => "Pasirinkite savaites", -"Interval" => "Intervalas", -"End" => "Pabaiga", -"create a new calendar" => "sukurti naują kalendorių", -"Import a calendar file" => "Importuoti kalendoriaus failą", -"Name of new calendar" => "Naujo kalendoriaus pavadinimas", -"Import" => "Importuoti", -"Close Dialog" => "Uždaryti", -"Create a new event" => "Sukurti naują įvykį", -"View an event" => "Peržiūrėti įvykį", -"No categories selected" => "Nepasirinktos jokios katagorijos", -"Timezone" => "Laiko juosta", -"24h" => "24val", -"12h" => "12val", -"Users" => "Vartotojai", -"select users" => "pasirinkti vartotojus", -"Editable" => "Redaguojamas", -"Groups" => "Grupės", -"select groups" => "pasirinkti grupes", -"make public" => "viešinti" -); diff --git a/apps/calendar/l10n/mk.php b/apps/calendar/l10n/mk.php deleted file mode 100644 index 1a03101fe5..0000000000 --- a/apps/calendar/l10n/mk.php +++ /dev/null @@ -1,156 +0,0 @@ - "Не се најдени календари.", -"No events found." => "Не се најдени настани.", -"Wrong calendar" => "Погрешен календар", -"New Timezone:" => "Нова временска зона:", -"Timezone changed" => "Временската зона е променета", -"Invalid request" => "Неправилно барање", -"Calendar" => "Календар", -"ddd" => "ддд", -"ddd M/d" => "ддд М/д", -"dddd M/d" => "дддд М/д", -"MMMM yyyy" => "ММММ гггг", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "дддд, МММ д, гггг", -"Birthday" => "Роденден", -"Business" => "Деловно", -"Call" => "Повикај", -"Clients" => "Клиенти", -"Deliverer" => "Доставувач", -"Holidays" => "Празници", -"Ideas" => "Идеи", -"Journey" => "Патување", -"Jubilee" => "Јубилеј", -"Meeting" => "Состанок", -"Other" => "Останато", -"Personal" => "Лично", -"Projects" => "Проекти", -"Questions" => "Прашања", -"Work" => "Работа", -"unnamed" => "неименувано", -"New Calendar" => "Нов календар", -"Does not repeat" => "Не се повторува", -"Daily" => "Дневно", -"Weekly" => "Седмично", -"Every Weekday" => "Секој работен ден", -"Bi-Weekly" => "Дво-седмично", -"Monthly" => "Месечно", -"Yearly" => "Годишно", -"never" => "никогаш", -"by occurrences" => "по настан", -"by date" => "по датум", -"by monthday" => "по ден во месецот", -"by weekday" => "по работен ден", -"Monday" => "Понеделник", -"Tuesday" => "Вторник", -"Wednesday" => "Среда", -"Thursday" => "Четврток", -"Friday" => "Петок", -"Saturday" => "Сабота", -"Sunday" => "Недела", -"events week of month" => "седмични настани од месец", -"first" => "прв", -"second" => "втор", -"third" => "трет", -"fourth" => "четврт", -"fifth" => "пет", -"last" => "последен", -"January" => "Јануари", -"February" => "Февруари", -"March" => "Март", -"April" => "Април", -"May" => "Мај", -"June" => "Јуни", -"July" => "Јули", -"August" => "Август", -"September" => "Септември", -"October" => "Октомври", -"November" => "Ноември", -"December" => "Декември", -"by events date" => "по датумот на настанот", -"by yearday(s)" => "по вчерашните", -"by weeknumber(s)" => "по број на седмицата", -"by day and month" => "по ден и месец", -"Date" => "Датум", -"Cal." => "Кал.", -"All day" => "Цел ден", -"Missing fields" => "Полиња кои недостасуваат", -"Title" => "Наслов", -"From Date" => "Од датум", -"From Time" => "Од време", -"To Date" => "До датум", -"To Time" => "До време", -"The event ends before it starts" => "Овој настан завршува пред за почне", -"There was a database fail" => "Имаше проблем со базата", -"Week" => "Седмица", -"Month" => "Месец", -"List" => "Листа", -"Today" => "Денеска", -"Your calendars" => "Ваши календари", -"CalDav Link" => "Врска за CalDav", -"Shared calendars" => "Споделени календари", -"No shared calendars" => "Нема споделени календари", -"Share Calendar" => "Сподели календар", -"Download" => "Преземи", -"Edit" => "Уреди", -"Delete" => "Избриши", -"shared with you by" => "Споделен со вас од", -"New calendar" => "Нов календар", -"Edit calendar" => "Уреди календар", -"Displayname" => "Име за приказ", -"Active" => "Активен", -"Calendar color" => "Боја на календарот", -"Save" => "Сними", -"Submit" => "Прати", -"Cancel" => "Откажи", -"Edit an event" => "Уреди настан", -"Export" => "Извези", -"Eventinfo" => "Инфо за настан", -"Repeating" => "Повторување", -"Alarm" => "Аларм", -"Attendees" => "Присутни", -"Share" => "Сподели", -"Title of the Event" => "Наслов на настанот", -"Category" => "Категорија", -"Separate categories with commas" => "Одвоете ги категориите со запирка", -"Edit categories" => "Уреди категории", -"All Day Event" => "Целодневен настан", -"From" => "Од", -"To" => "До", -"Advanced options" => "Напредни опции", -"Location" => "Локација", -"Location of the Event" => "Локација на настанот", -"Description" => "Опис", -"Description of the Event" => "Опис на настанот", -"Repeat" => "Повтори", -"Advanced" => "Напредно", -"Select weekdays" => "Избери работни денови", -"Select days" => "Избери денови", -"and the events day of year." => "и настаните ден од година.", -"and the events day of month." => "и настаните ден од месец.", -"Select months" => "Избери месеци", -"Select weeks" => "Избери седмици", -"and the events week of year." => "и настаните седмица од година.", -"Interval" => "интервал", -"End" => "Крај", -"occurrences" => "повторувања", -"create a new calendar" => "создади нов календар", -"Import a calendar file" => "Внеси календар од датотека ", -"Name of new calendar" => "Име на новиот календар", -"Import" => "Увези", -"Close Dialog" => "Затвори дијалог", -"Create a new event" => "Создади нов настан", -"View an event" => "Погледај настан", -"No categories selected" => "Нема избрано категории", -"of" => "од", -"at" => "на", -"Timezone" => "Временска зона", -"24h" => "24ч", -"12h" => "12ч", -"Users" => "Корисници", -"select users" => "избери корисници", -"Editable" => "Изменливо", -"Groups" => "Групи", -"select groups" => "избери групи", -"make public" => "направи јавно" -); diff --git a/apps/calendar/l10n/ms_MY.php b/apps/calendar/l10n/ms_MY.php deleted file mode 100644 index 4be91a4019..0000000000 --- a/apps/calendar/l10n/ms_MY.php +++ /dev/null @@ -1,156 +0,0 @@ - "Tiada kalendar dijumpai.", -"No events found." => "Tiada agenda dijumpai.", -"Wrong calendar" => "Silap kalendar", -"New Timezone:" => "Timezone Baru", -"Timezone changed" => "Zon waktu diubah", -"Invalid request" => "Permintaan tidak sah", -"Calendar" => "Kalendar", -"ddd" => "ddd", -"ddd M/d" => "dd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyy", -"Birthday" => "Hari lahir", -"Business" => "Perniagaan", -"Call" => "Panggilan", -"Clients" => "Klien", -"Deliverer" => "Penghantar", -"Holidays" => "Cuti", -"Ideas" => "Idea", -"Journey" => "Perjalanan", -"Jubilee" => "Jubli", -"Meeting" => "Perjumpaan", -"Other" => "Lain", -"Personal" => "Peribadi", -"Projects" => "Projek", -"Questions" => "Soalan", -"Work" => "Kerja", -"unnamed" => "tiada nama", -"New Calendar" => "Kalendar baru", -"Does not repeat" => "Tidak berulang", -"Daily" => "Harian", -"Weekly" => "Mingguan", -"Every Weekday" => "Setiap hari minggu", -"Bi-Weekly" => "Dua kali seminggu", -"Monthly" => "Bulanan", -"Yearly" => "Tahunan", -"never" => "jangan", -"by occurrences" => "dari kekerapan", -"by date" => "dari tarikh", -"by monthday" => "dari haribulan", -"by weekday" => "dari hari minggu", -"Monday" => "Isnin", -"Tuesday" => "Selasa", -"Wednesday" => "Rabu", -"Thursday" => "Khamis", -"Friday" => "Jumaat", -"Saturday" => "Sabtu", -"Sunday" => "Ahad", -"events week of month" => "event minggu dari bulan", -"first" => "pertama", -"second" => "kedua", -"third" => "ketiga", -"fourth" => "keempat", -"fifth" => "kelima", -"last" => "akhir", -"January" => "Januari", -"February" => "Februari", -"March" => "Mac", -"April" => "April", -"May" => "Mei", -"June" => "Jun", -"July" => "Julai", -"August" => "Ogos", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Disember", -"by events date" => "dari tarikh event", -"by yearday(s)" => "dari tahun", -"by weeknumber(s)" => "dari nombor minggu", -"by day and month" => "dari hari dan bulan", -"Date" => "Tarikh", -"Cal." => "Kalendar", -"All day" => "Sepanjang hari", -"Missing fields" => "Ruangan tertinggal", -"Title" => "Tajuk", -"From Date" => "Dari tarikh", -"From Time" => "Masa Dari", -"To Date" => "Sehingga kini", -"To Time" => "Semasa", -"The event ends before it starts" => "Peristiwa berakhir sebelum bermula", -"There was a database fail" => "Terdapat kegagalan pada pengkalan data", -"Week" => "Minggu", -"Month" => "Bulan", -"List" => "Senarai", -"Today" => "Hari ini", -"Your calendars" => "Kalendar anda", -"CalDav Link" => "Pautan CalDav", -"Shared calendars" => "Kalendar Kongsian", -"No shared calendars" => "Tiada kalendar kongsian", -"Share Calendar" => "Kongsi Kalendar", -"Download" => "Muat turun", -"Edit" => "Edit", -"Delete" => "Hapus", -"shared with you by" => "dikongsi dengan kamu oleh", -"New calendar" => "Kalendar baru", -"Edit calendar" => "Edit kalendar", -"Displayname" => "Paparan nama", -"Active" => "Aktif", -"Calendar color" => "Warna kalendar", -"Save" => "Simpan", -"Submit" => "Hantar", -"Cancel" => "Batal", -"Edit an event" => "Edit agenda", -"Export" => "Export", -"Eventinfo" => "Maklumat agenda", -"Repeating" => "Pengulangan", -"Alarm" => "Penggera", -"Attendees" => "Jemputan", -"Share" => "Berkongsi", -"Title of the Event" => "Tajuk agenda", -"Category" => "kategori", -"Separate categories with commas" => "Asingkan kategori dengan koma", -"Edit categories" => "Sunting Kategori", -"All Day Event" => "Agenda di sepanjang hari ", -"From" => "Dari", -"To" => "ke", -"Advanced options" => "Pilihan maju", -"Location" => "Lokasi", -"Location of the Event" => "Lokasi agenda", -"Description" => "Huraian", -"Description of the Event" => "Huraian agenda", -"Repeat" => "Ulang", -"Advanced" => "Maju", -"Select weekdays" => "Pilih hari minggu", -"Select days" => "Pilih hari", -"and the events day of year." => "dan hari event dalam tahun.", -"and the events day of month." => "dan hari event dalam bulan.", -"Select months" => "Pilih bulan", -"Select weeks" => "Pilih minggu", -"and the events week of year." => "dan event mingguan dalam setahun.", -"Interval" => "Tempoh", -"End" => "Tamat", -"occurrences" => "Peristiwa", -"create a new calendar" => "Cipta kalendar baru", -"Import a calendar file" => "Import fail kalendar", -"Name of new calendar" => "Nama kalendar baru", -"Import" => "Import", -"Close Dialog" => "Tutup dialog", -"Create a new event" => "Buat agenda baru", -"View an event" => "Papar peristiwa", -"No categories selected" => "Tiada kategori dipilih", -"of" => "dari", -"at" => "di", -"Timezone" => "Zon waktu", -"24h" => "24h", -"12h" => "12h", -"Users" => "Pengguna", -"select users" => "Pilih pengguna", -"Editable" => "Boleh disunting", -"Groups" => "Kumpulan-kumpulan", -"select groups" => "pilih kumpulan-kumpulan", -"make public" => "jadikan tontonan awam" -); diff --git a/apps/calendar/l10n/nb_NO.php b/apps/calendar/l10n/nb_NO.php deleted file mode 100644 index e4b859c737..0000000000 --- a/apps/calendar/l10n/nb_NO.php +++ /dev/null @@ -1,147 +0,0 @@ - "Ingen kalendere funnet", -"No events found." => "Ingen hendelser funnet", -"Wrong calendar" => "Feil kalender", -"New Timezone:" => "Ny tidssone:", -"Timezone changed" => "Tidssone endret", -"Invalid request" => "Ugyldig forespørsel", -"Calendar" => "Kalender", -"Birthday" => "Bursdag", -"Business" => "Forretninger", -"Call" => "Ring", -"Clients" => "Kunder", -"Holidays" => "Ferie", -"Ideas" => "Ideér", -"Journey" => "Reise", -"Jubilee" => "Jubileum", -"Meeting" => "Møte", -"Other" => "Annet", -"Personal" => "ersonlig", -"Projects" => "Prosjekter", -"Questions" => "Spørsmål", -"Work" => "Arbeid", -"unnamed" => "uten navn", -"New Calendar" => "Ny kalender", -"Does not repeat" => "Gjentas ikke", -"Daily" => "Daglig", -"Weekly" => "Ukentlig", -"Every Weekday" => "Hver ukedag", -"Bi-Weekly" => "Annenhver uke", -"Monthly" => "Månedlig", -"Yearly" => "Årlig", -"never" => "aldri", -"by occurrences" => "etter hyppighet", -"by date" => "etter dato", -"by monthday" => "etter dag i måned", -"by weekday" => "etter ukedag", -"Monday" => "Mandag", -"Tuesday" => "Tirsdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lørdag", -"Sunday" => "Søndag", -"events week of month" => "begivenhetens uke denne måneden", -"first" => "første", -"second" => "andre", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "siste", -"January" => "Januar", -"February" => "Februar", -"March" => "Mars", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Desember", -"by events date" => "etter hendelsenes dato", -"by yearday(s)" => "etter dag i året", -"by weeknumber(s)" => "etter ukenummer/-numre", -"by day and month" => "etter dag og måned", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "Hele dagen ", -"Missing fields" => "Manglende felt", -"Title" => "Tittel", -"From Date" => "Fra dato", -"From Time" => "Fra tidspunkt", -"To Date" => "Til dato", -"To Time" => "Til tidspunkt", -"The event ends before it starts" => "En hendelse kan ikke slutte før den har begynt.", -"There was a database fail" => "Det oppstod en databasefeil.", -"Week" => "Uke", -"Month" => "ned", -"List" => "Liste", -"Today" => "I dag", -"Your calendars" => "Dine kalendere", -"CalDav Link" => "CalDav-lenke", -"Shared calendars" => "Delte kalendere", -"No shared calendars" => "Ingen delte kalendere", -"Share Calendar" => "Del Kalender", -"Download" => "Last ned", -"Edit" => "Endre", -"Delete" => "Slett", -"shared with you by" => "delt med deg", -"New calendar" => "Ny kalender", -"Edit calendar" => "Rediger kalender", -"Displayname" => "Visningsnavn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarge", -"Save" => "Lagre", -"Submit" => "Lagre", -"Cancel" => "Avbryt", -"Edit an event" => "Rediger en hendelse", -"Export" => "Eksporter", -"Eventinfo" => "Hendelsesinformasjon", -"Repeating" => "Gjentas", -"Alarm" => "Alarm", -"Attendees" => "Deltakere", -"Share" => "Del", -"Title of the Event" => "Hendelsestittel", -"Category" => "Kategori", -"Separate categories with commas" => "Separer kategorier med komma", -"Edit categories" => "Rediger kategorier", -"All Day Event" => "Hele dagen-hendelse", -"From" => "Fra", -"To" => "Til", -"Advanced options" => "Avanserte innstillinger", -"Location" => "Sted", -"Location of the Event" => "Hendelsessted", -"Description" => "Beskrivelse", -"Description of the Event" => "Hendelesebeskrivelse", -"Repeat" => "Gjenta", -"Advanced" => "Avansert", -"Select weekdays" => "Velg ukedager", -"Select days" => "Velg dager", -"and the events day of year." => "og hendelsenes dag i året.", -"and the events day of month." => "og hendelsenes dag i måneden.", -"Select months" => "Velg måneder", -"Select weeks" => "Velg uker", -"and the events week of year." => "og hendelsenes uke i året.", -"Interval" => "Intervall", -"End" => "Slutt", -"occurrences" => "forekomster", -"create a new calendar" => "Lag en ny kalender", -"Import a calendar file" => "Importer en kalenderfil", -"Name of new calendar" => "Navn på ny kalender:", -"Import" => "Importer", -"Close Dialog" => "Lukk dialog", -"Create a new event" => "Opprett en ny hendelse", -"View an event" => "Se på hendelse", -"No categories selected" => "Ingen kategorier valgt", -"Timezone" => "Tidssone", -"24h" => "24 t", -"12h" => "12 t", -"Users" => "Brukere", -"select users" => "valgte brukere", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "velg grupper", -"make public" => "gjør offentlig" -); diff --git a/apps/calendar/l10n/nl.php b/apps/calendar/l10n/nl.php deleted file mode 100644 index bc0954abe2..0000000000 --- a/apps/calendar/l10n/nl.php +++ /dev/null @@ -1,198 +0,0 @@ - "Niet alle agenda's zijn volledig gecached", -"Everything seems to be completely cached" => "Alles lijkt volledig gecached te zijn", -"No calendars found." => "Geen kalenders gevonden.", -"No events found." => "Geen gebeurtenissen gevonden.", -"Wrong calendar" => "Verkeerde kalender", -"The file contained either no events or all events are already saved in your calendar." => "Het bestand bevat geen gebeurtenissen of alle gebeurtenissen worden al in uw agenda bewaard.", -"events has been saved in the new calendar" => "De gebeurtenissen worden in de nieuwe agenda bewaard", -"Import failed" => "import is gefaald", -"events has been saved in your calendar" => "de gebeurtenissen zijn in uw agenda opgeslagen ", -"New Timezone:" => "Nieuwe tijdszone:", -"Timezone changed" => "Tijdzone is veranderd", -"Invalid request" => "Ongeldige aanvraag", -"Calendar" => "Kalender", -"ddd" => "ddd", -"ddd M/d" => "ddd d.M", -"dddd M/d" => "dddd d.M", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d[ MMM][ yyyy]{ '—' d MMM yyyy}", -"dddd, MMM d, yyyy" => "dddd, d. MMM yyyy", -"Birthday" => "Verjaardag", -"Business" => "Zakelijk", -"Call" => "Bellen", -"Clients" => "Klanten", -"Deliverer" => "Leverancier", -"Holidays" => "Vakantie", -"Ideas" => "Ideeën", -"Journey" => "Reis", -"Jubilee" => "Jubileum", -"Meeting" => "Vergadering", -"Other" => "Ander", -"Personal" => "Persoonlijk", -"Projects" => "Projecten", -"Questions" => "Vragen", -"Work" => "Werk", -"by" => "door", -"unnamed" => "onbekend", -"New Calendar" => "Nieuwe Kalender", -"Does not repeat" => "Wordt niet herhaald", -"Daily" => "Dagelijks", -"Weekly" => "Wekelijks", -"Every Weekday" => "Elke weekdag", -"Bi-Weekly" => "Tweewekelijks", -"Monthly" => "Maandelijks", -"Yearly" => "Jaarlijks", -"never" => "nooit meer", -"by occurrences" => "volgens gebeurtenissen", -"by date" => "op datum", -"by monthday" => "per dag van de maand", -"by weekday" => "op weekdag", -"Monday" => "Maandag", -"Tuesday" => "Dinsdag", -"Wednesday" => "Woensdag", -"Thursday" => "Donderdag", -"Friday" => "Vrijdag", -"Saturday" => "Zaterdag", -"Sunday" => "Zondag", -"events week of month" => "gebeurtenissen week van maand", -"first" => "eerste", -"second" => "tweede", -"third" => "derde", -"fourth" => "vierde", -"fifth" => "vijfde", -"last" => "laatste", -"January" => "Januari", -"February" => "Februari", -"March" => "Maart", -"April" => "April", -"May" => "Mei", -"June" => "Juni", -"July" => "Juli", -"August" => "Augustus", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "volgens evenementsdatum", -"by yearday(s)" => "volgens jaardag(en)", -"by weeknumber(s)" => "volgens weeknummer(s)", -"by day and month" => "per dag en maand", -"Date" => "Datum", -"Cal." => "Cal.", -"Sun." => "Zon.", -"Mon." => "Maa.", -"Tue." => "Din.", -"Wed." => "Woe.", -"Thu." => "Don.", -"Fri." => "Vrij.", -"Sat." => "Zat.", -"Jan." => "Jan.", -"Feb." => "Feb.", -"Mar." => "Maa.", -"Apr." => "Apr.", -"May." => "Mei.", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Aug.", -"Sep." => "Sep.", -"Oct." => "Okt.", -"Nov." => "Nov.", -"Dec." => "Dec.", -"All day" => "Hele dag", -"Missing fields" => "missende velden", -"Title" => "Titel", -"From Date" => "Begindatum", -"From Time" => "Begintijd", -"To Date" => "Einddatum", -"To Time" => "Eindtijd", -"The event ends before it starts" => "Het evenement eindigt voordat het begint", -"There was a database fail" => "Er was een databasefout", -"Week" => "Week", -"Month" => "Maand", -"List" => "Lijst", -"Today" => "Vandaag", -"Settings" => "Instellingen", -"Your calendars" => "Je kalenders", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Gedeelde kalenders", -"No shared calendars" => "Geen gedeelde kalenders", -"Share Calendar" => "Deel kalender", -"Download" => "Download", -"Edit" => "Bewerken", -"Delete" => "Verwijderen", -"shared with you by" => "gedeeld met jou door", -"New calendar" => "Nieuwe kalender", -"Edit calendar" => "Bewerk kalender", -"Displayname" => "Weergavenaam", -"Active" => "Actief", -"Calendar color" => "Kalender kleur", -"Save" => "Opslaan", -"Submit" => "Opslaan", -"Cancel" => "Annuleren", -"Edit an event" => "Bewerken van een afspraak", -"Export" => "Exporteren", -"Eventinfo" => "Geberurtenisinformatie", -"Repeating" => "Herhalend", -"Alarm" => "Alarm", -"Attendees" => "Deelnemers", -"Share" => "Delen", -"Title of the Event" => "Titel van de afspraak", -"Category" => "Categorie", -"Separate categories with commas" => "Gescheiden door komma's", -"Edit categories" => "Wijzig categorieën", -"All Day Event" => "Hele dag", -"From" => "Van", -"To" => "Aan", -"Advanced options" => "Geavanceerde opties", -"Location" => "Locatie", -"Location of the Event" => "Locatie van de afspraak", -"Description" => "Beschrijving", -"Description of the Event" => "Beschrijving van het evenement", -"Repeat" => "Herhalen", -"Advanced" => "Geavanceerd", -"Select weekdays" => "Selecteer weekdagen", -"Select days" => "Selecteer dagen", -"and the events day of year." => "en de gebeurtenissen dag van het jaar", -"and the events day of month." => "en de gebeurtenissen dag van de maand", -"Select months" => "Selecteer maanden", -"Select weeks" => "Selecteer weken", -"and the events week of year." => "en de gebeurtenissen week van het jaar", -"Interval" => "Interval", -"End" => "Einde", -"occurrences" => "gebeurtenissen", -"create a new calendar" => "Maak een nieuw agenda", -"Import a calendar file" => "Importeer een agenda bestand", -"Please choose a calendar" => "Kies een agenda", -"Name of new calendar" => "Naam van de nieuwe agenda", -"Take an available name!" => "Kies een beschikbare naam!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Een agenda met deze naam bestaat al. Als u doorgaat, worden deze agenda's samengevoegd", -"Import" => "Importeer", -"Close Dialog" => "Sluit venster", -"Create a new event" => "Maak een nieuwe afspraak", -"View an event" => "Bekijk een gebeurtenis", -"No categories selected" => "Geen categorieën geselecteerd", -"of" => "van", -"at" => "op", -"General" => "Algemeen", -"Timezone" => "Tijdzone", -"Update timezone automatically" => "Werk de tijdzone automatisch bij", -"Time format" => "Tijd formaat", -"24h" => "24uur", -"12h" => "12uur", -"Start week on" => "Begin de week op", -"Cache" => "Cache", -"Clear cache for repeating events" => "Leeg cache voor repeterende gebeurtenissen", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "Agenda CalDAV synchronisatie adres", -"more info" => "meer informatie", -"Primary address (Kontact et al)" => "Primary adres (voor Kontact en dergelijke)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Alleen lezen iCalendar link(en)", -"Users" => "Gebruikers", -"select users" => "kies gebruikers", -"Editable" => "Te wijzigen", -"Groups" => "Groepen", -"select groups" => "kies groep", -"make public" => "maak publiek" -); diff --git a/apps/calendar/l10n/nn_NO.php b/apps/calendar/l10n/nn_NO.php deleted file mode 100644 index 3330cc562b..0000000000 --- a/apps/calendar/l10n/nn_NO.php +++ /dev/null @@ -1,125 +0,0 @@ - "Feil kalender", -"New Timezone:" => "Ny tidssone:", -"Timezone changed" => "Endra tidssone", -"Invalid request" => "Ugyldig førespurnad", -"Calendar" => "Kalender", -"Birthday" => "Bursdag", -"Business" => "Forretning", -"Call" => "Telefonsamtale", -"Clients" => "Klientar", -"Deliverer" => "Forsending", -"Holidays" => "Høgtid", -"Ideas" => "Idear", -"Journey" => "Reise", -"Jubilee" => "Jubileum", -"Meeting" => "Møte", -"Other" => "Anna", -"Personal" => "Personleg", -"Projects" => "Prosjekt", -"Questions" => "Spørsmål", -"Work" => "Arbeid", -"New Calendar" => "Ny kalender", -"Does not repeat" => "Ikkje gjenta", -"Daily" => "Kvar dag", -"Weekly" => "Kvar veke", -"Every Weekday" => "Kvar vekedag", -"Bi-Weekly" => "Annakvar veke", -"Monthly" => "Kvar månad", -"Yearly" => "Kvart år", -"never" => "aldri", -"by occurrences" => "av førekomstar", -"by date" => "av dato", -"by monthday" => "av månadsdag", -"by weekday" => "av vekedag", -"Monday" => "Måndag", -"Tuesday" => "Tysdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Laurdag", -"Sunday" => "Søndag", -"events week of month" => "hendingas veke av månad", -"first" => "første", -"second" => "andre", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "siste", -"January" => "Januar", -"February" => "Februar", -"March" => "Mars", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Desember", -"by events date" => "av hendingsdato", -"by yearday(s)" => "av årsdag(ar)", -"by weeknumber(s)" => "av vekenummer", -"by day and month" => "av dag og månad", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "Heile dagen", -"Missing fields" => "Manglande felt", -"Title" => "Tittel", -"From Date" => "Frå dato", -"From Time" => "Frå tid", -"To Date" => "Til dato", -"To Time" => "Til tid", -"The event ends before it starts" => "Hendinga endar før den startar", -"There was a database fail" => "Det oppstod ein databasefeil", -"Week" => "Veke", -"Month" => "Månad", -"List" => "Liste", -"Today" => "I dag", -"CalDav Link" => "CalDav-lenkje", -"Download" => "Last ned", -"Edit" => "Endra", -"Delete" => "Slett", -"New calendar" => "Ny kalender", -"Edit calendar" => "Endra kalendarar", -"Displayname" => "Visingsnamn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarge", -"Save" => "Lagra", -"Submit" => "Lagra", -"Cancel" => "Avbryt", -"Edit an event" => "Endra ein hending", -"Export" => "Eksporter", -"Title of the Event" => "Tittel på hendinga", -"Category" => "Kategori", -"All Day Event" => "Heildagshending", -"From" => "Frå", -"To" => "Til", -"Advanced options" => "Avanserte alternativ", -"Location" => "Stad", -"Location of the Event" => "Stad for hendinga", -"Description" => "Skildring", -"Description of the Event" => "Skildring av hendinga", -"Repeat" => "Gjenta", -"Advanced" => "Avansert", -"Select weekdays" => "Vel vekedagar", -"Select days" => "Vel dagar", -"and the events day of year." => "og hendingane dag for år.", -"and the events day of month." => "og hendingane dag for månad.", -"Select months" => "Vel månedar", -"Select weeks" => "Vel veker", -"and the events week of year." => "og hendingane veke av året.", -"Interval" => "Intervall", -"End" => "Ende", -"occurrences" => "førekomstar", -"create a new calendar" => "Lag ny kalender", -"Import a calendar file" => "Importer ei kalenderfil", -"Name of new calendar" => "Namn for ny kalender", -"Import" => "Importer", -"Close Dialog" => "Steng dialog", -"Create a new event" => "Opprett ei ny hending", -"Timezone" => "Tidssone", -"24h" => "24t", -"12h" => "12t" -); diff --git a/apps/calendar/l10n/pl.php b/apps/calendar/l10n/pl.php deleted file mode 100644 index 8fd1c3c2b4..0000000000 --- a/apps/calendar/l10n/pl.php +++ /dev/null @@ -1,182 +0,0 @@ - "Brak kalendarzy", -"No events found." => "Brak wydzarzeń", -"Wrong calendar" => "Nieprawidłowy kalendarz", -"Import failed" => "Import nieudany", -"events has been saved in your calendar" => "zdarzenie zostało zapisane w twoim kalendarzu", -"New Timezone:" => "Nowa strefa czasowa:", -"Timezone changed" => "Zmieniono strefę czasową", -"Invalid request" => "Nieprawidłowe żądanie", -"Calendar" => "Kalendarz", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM rrrr", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, rrrr", -"Birthday" => "Urodziny", -"Business" => "Interesy", -"Call" => "Rozmowy", -"Clients" => "Klienci", -"Deliverer" => "Dostawcy", -"Holidays" => "Święta", -"Ideas" => "Pomysły", -"Journey" => "Podróże", -"Jubilee" => "Jubileusze", -"Meeting" => "Spotkania", -"Other" => "Inne", -"Personal" => "Osobiste", -"Projects" => "Projekty", -"Questions" => "Pytania", -"Work" => "Zawodowe", -"by" => "przez", -"unnamed" => "nienazwany", -"New Calendar" => "Nowy kalendarz", -"Does not repeat" => "Brak", -"Daily" => "Codziennie", -"Weekly" => "Tygodniowo", -"Every Weekday" => "Każdego dnia tygodnia", -"Bi-Weekly" => "Dwa razy w tygodniu", -"Monthly" => "Miesięcznie", -"Yearly" => "Rocznie", -"never" => "nigdy", -"by occurrences" => "przez wydarzenia", -"by date" => "po dacie", -"by monthday" => "miesięcznie", -"by weekday" => "tygodniowo", -"Monday" => "Poniedziałek", -"Tuesday" => "Wtorek", -"Wednesday" => "Środa", -"Thursday" => "Czwartek", -"Friday" => "Piątek", -"Saturday" => "Sobota", -"Sunday" => "Niedziela", -"events week of month" => "wydarzenia miesiąca", -"first" => "pierwszy", -"second" => "drugi", -"third" => "trzeci", -"fourth" => "czwarty", -"fifth" => "piąty", -"last" => "ostatni", -"January" => "Styczeń", -"February" => "Luty", -"March" => "Marzec", -"April" => "Kwiecień", -"May" => "Maj", -"June" => "Czerwiec", -"July" => "Lipiec", -"August" => "Sierpień", -"September" => "Wrzesień", -"October" => "Październik", -"November" => "Listopad", -"December" => "Grudzień", -"by events date" => "po datach wydarzeń", -"by yearday(s)" => "po dniach roku", -"by weeknumber(s)" => "po tygodniach", -"by day and month" => "przez dzień i miesiąc", -"Date" => "Data", -"Cal." => "Kal.", -"Sun." => "N.", -"Mon." => "Pn.", -"Tue." => "Wt.", -"Wed." => "Śr.", -"Thu." => "Cz.", -"Fri." => "Pt.", -"Sat." => "S.", -"Jan." => "Sty.", -"Feb." => "Lut.", -"Mar." => "Mar.", -"Apr." => "Kwi.", -"May." => "Maj.", -"Jun." => "Cze.", -"Jul." => "Lip.", -"Aug." => "Sie.", -"Sep." => "Wrz.", -"Oct." => "Paź.", -"Nov." => "Lis.", -"Dec." => "Gru.", -"All day" => "Cały dzień", -"Missing fields" => "Brakujące pola", -"Title" => "Nazwa", -"From Date" => "Od daty", -"From Time" => "Od czasu", -"To Date" => "Do daty", -"To Time" => "Do czasu", -"The event ends before it starts" => "Wydarzenie kończy się przed rozpoczęciem", -"There was a database fail" => "Awaria bazy danych", -"Week" => "Tydzień", -"Month" => "Miesiąc", -"List" => "Lista", -"Today" => "Dzisiaj", -"Your calendars" => "Twoje kalendarze", -"CalDav Link" => "Wyświetla odnośnik CalDAV", -"Shared calendars" => "Współdzielone kalendarze", -"No shared calendars" => "Brak współdzielonych kalendarzy", -"Share Calendar" => "Współdziel kalendarz", -"Download" => "Pobiera kalendarz", -"Edit" => "Edytuje kalendarz", -"Delete" => "Usuwa kalendarz", -"shared with you by" => "współdzielisz z", -"New calendar" => "Nowy kalendarz", -"Edit calendar" => "Edytowanie kalendarza", -"Displayname" => "Wyświetlana nazwa", -"Active" => "Aktywny", -"Calendar color" => "Kolor", -"Save" => "Zapisz", -"Submit" => "Prześlij", -"Cancel" => "Anuluj", -"Edit an event" => "Edytowanie wydarzenia", -"Export" => "Wyeksportuj", -"Eventinfo" => "Informacja o wydarzeniach", -"Repeating" => "Powtarzanie", -"Alarm" => "Alarm", -"Attendees" => "Uczestnicy", -"Share" => "Współdziel", -"Title of the Event" => "Nazwa wydarzenia", -"Category" => "Kategoria", -"Separate categories with commas" => "Oddziel kategorie przecinkami", -"Edit categories" => "Edytuj kategorie", -"All Day Event" => "Wydarzenie całodniowe", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Opcje zaawansowane", -"Location" => "Lokalizacja", -"Location of the Event" => "Lokalizacja wydarzenia", -"Description" => "Opis", -"Description of the Event" => "Opis wydarzenia", -"Repeat" => "Powtarzanie", -"Advanced" => "Zaawansowane", -"Select weekdays" => "Wybierz dni powszechne", -"Select days" => "Wybierz dni", -"and the events day of year." => "oraz wydarzenia roku", -"and the events day of month." => "oraz wydarzenia miesiąca", -"Select months" => "Wybierz miesiące", -"Select weeks" => "Wybierz tygodnie", -"and the events week of year." => "oraz wydarzenia roku.", -"Interval" => "Interwał", -"End" => "Koniec", -"occurrences" => "wystąpienia", -"create a new calendar" => "stwórz nowy kalendarz", -"Import a calendar file" => "Zaimportuj plik kalendarza", -"Please choose a calendar" => "Proszę wybierz kalendarz", -"Name of new calendar" => "Nazwa kalendarza", -"Import" => "Import", -"Close Dialog" => "Zamknij okno", -"Create a new event" => "Tworzenie nowego wydarzenia", -"View an event" => "Zobacz wydarzenie", -"No categories selected" => "nie zaznaczono kategorii", -"of" => "z", -"at" => "w", -"Timezone" => "Strefa czasowa", -"24h" => "24h", -"12h" => "12h", -"more info" => "więcej informacji", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Odczytać tylko linki iCalendar", -"Users" => "Użytkownicy", -"select users" => "wybierz użytkowników", -"Editable" => "Edytowalne", -"Groups" => "Grupy", -"select groups" => "wybierz grupy", -"make public" => "uczyń publicznym" -); diff --git a/apps/calendar/l10n/pt_BR.php b/apps/calendar/l10n/pt_BR.php deleted file mode 100644 index b636c19bfe..0000000000 --- a/apps/calendar/l10n/pt_BR.php +++ /dev/null @@ -1,156 +0,0 @@ - "Nenhum calendário encontrado.", -"No events found." => "Nenhum evento encontrado.", -"Wrong calendar" => "Calendário incorreto", -"New Timezone:" => "Novo fuso horário", -"Timezone changed" => "Fuso horário alterado", -"Invalid request" => "Pedido inválido", -"Calendar" => "Calendário", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Aniversário", -"Business" => "Negócio", -"Call" => "Chamada", -"Clients" => "Clientes", -"Deliverer" => "Entrega", -"Holidays" => "Feriados", -"Ideas" => "Idéias", -"Journey" => "Jornada", -"Jubilee" => "Jubileu", -"Meeting" => "Reunião", -"Other" => "Outros", -"Personal" => "Pessoal", -"Projects" => "Projetos", -"Questions" => "Perguntas", -"Work" => "Trabalho", -"unnamed" => "sem nome", -"New Calendar" => "Novo Calendário", -"Does not repeat" => "Não repetir", -"Daily" => "Diariamente", -"Weekly" => "Semanal", -"Every Weekday" => "Cada dia da semana", -"Bi-Weekly" => "De duas em duas semanas", -"Monthly" => "Mensal", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por ocorrências", -"by date" => "por data", -"by monthday" => "por dia do mês", -"by weekday" => "por dia da semana", -"Monday" => "Segunda-feira", -"Tuesday" => "Terça-feira", -"Wednesday" => "Quarta-feira", -"Thursday" => "Quinta-feira", -"Friday" => "Sexta-feira", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "semana do evento no mês", -"first" => "primeiro", -"second" => "segundo", -"third" => "terceiro", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Janeiro", -"February" => "Fevereiro", -"March" => "Março", -"April" => "Abril", -"May" => "Maio", -"June" => "Junho", -"July" => "Julho", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Dezembro", -"by events date" => "eventos por data", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) da semana", -"by day and month" => "por dia e mês", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Todo o dia", -"Missing fields" => "Campos incompletos", -"Title" => "Título", -"From Date" => "Desde a Data", -"From Time" => "Desde a Hora", -"To Date" => "Até a Data", -"To Time" => "Até a Hora", -"The event ends before it starts" => "O evento termina antes de começar", -"There was a database fail" => "Houve uma falha de banco de dados", -"Week" => "Semana", -"Month" => "Mês", -"List" => "Lista", -"Today" => "Hoje", -"Your calendars" => "Meus Calendários", -"CalDav Link" => "Link para CalDav", -"Shared calendars" => "Calendários Compartilhados", -"No shared calendars" => "Nenhum Calendário Compartilhado", -"Share Calendar" => "Compartilhar Calendário", -"Download" => "Baixar", -"Edit" => "Editar", -"Delete" => "Excluir", -"shared with you by" => "compartilhado com você por", -"New calendar" => "Novo calendário", -"Edit calendar" => "Editar calendário", -"Displayname" => "Mostrar Nome", -"Active" => "Ativo", -"Calendar color" => "Cor do Calendário", -"Save" => "Salvar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", -"Edit an event" => "Editar um evento", -"Export" => "Exportar", -"Eventinfo" => "Info de Evento", -"Repeating" => "Repetindo", -"Alarm" => "Alarme", -"Attendees" => "Participantes", -"Share" => "Compartilhar", -"Title of the Event" => "Título do evento", -"Category" => "Categoria", -"Separate categories with commas" => "Separe as categorias por vírgulas", -"Edit categories" => "Editar categorias", -"All Day Event" => "Evento de dia inteiro", -"From" => "De", -"To" => "Para", -"Advanced options" => "Opções avançadas", -"Location" => "Local", -"Location of the Event" => "Local do evento", -"Description" => "Descrição", -"Description of the Event" => "Descrição do Evento", -"Repeat" => "Repetir", -"Advanced" => "Avançado", -"Select weekdays" => "Selecionar dias da semana", -"Select days" => "Selecionar dias", -"and the events day of year." => "e o dia do evento no ano.", -"and the events day of month." => "e o dia do evento no mês.", -"Select months" => "Selecionar meses", -"Select weeks" => "Selecionar semanas", -"and the events week of year." => "e a semana do evento no ano.", -"Interval" => "Intervalo", -"End" => "Final", -"occurrences" => "ocorrências", -"create a new calendar" => "criar um novo calendário", -"Import a calendar file" => "Importar um arquivo de calendário", -"Name of new calendar" => "Nome do novo calendário", -"Import" => "Importar", -"Close Dialog" => "Fechar caixa de diálogo", -"Create a new event" => "Criar um novo evento", -"View an event" => "Visualizar evento", -"No categories selected" => "Nenhuma categoria selecionada", -"of" => "de", -"at" => "para", -"Timezone" => "Fuso horário", -"24h" => "24h", -"12h" => "12h", -"Users" => "Usuários", -"select users" => "Selecione usuários", -"Editable" => "Editável", -"Groups" => "Grupos", -"select groups" => "Selecione grupos", -"make public" => "Tornar público" -); diff --git a/apps/calendar/l10n/pt_PT.php b/apps/calendar/l10n/pt_PT.php deleted file mode 100644 index d5ead9fd43..0000000000 --- a/apps/calendar/l10n/pt_PT.php +++ /dev/null @@ -1,198 +0,0 @@ - "Nem todos os calendários estão completamente pré-carregados", -"Everything seems to be completely cached" => "Parece que tudo está completamente pré-carregado", -"No calendars found." => "Nenhum calendário encontrado.", -"No events found." => "Nenhum evento encontrado.", -"Wrong calendar" => "Calendário errado", -"The file contained either no events or all events are already saved in your calendar." => "O ficheiro não continha nenhuns eventos ou então todos os eventos já estavam carregados no seu calendário", -"events has been saved in the new calendar" => "Os eventos foram guardados no novo calendário", -"Import failed" => "Falha na importação", -"events has been saved in your calendar" => "Os eventos foram guardados no seu calendário", -"New Timezone:" => "Nova zona horária", -"Timezone changed" => "Zona horária alterada", -"Invalid request" => "Pedido inválido", -"Calendar" => "Calendário", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM aaaa", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, aaaa", -"Birthday" => "Dia de anos", -"Business" => "Negócio", -"Call" => "Telefonar", -"Clients" => "Clientes", -"Deliverer" => "Entregar", -"Holidays" => "Férias", -"Ideas" => "Ideias", -"Journey" => "Jornada", -"Jubilee" => "Jublieu", -"Meeting" => "Encontro", -"Other" => "Outro", -"Personal" => "Pessoal", -"Projects" => "Projetos", -"Questions" => "Perguntas", -"Work" => "Trabalho", -"by" => "por", -"unnamed" => "não definido", -"New Calendar" => "Novo calendário", -"Does not repeat" => "Não repete", -"Daily" => "Diário", -"Weekly" => "Semanal", -"Every Weekday" => "Todos os dias da semana", -"Bi-Weekly" => "Bi-semanal", -"Monthly" => "Mensal", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por ocorrências", -"by date" => "por data", -"by monthday" => "por dia do mês", -"by weekday" => "por dia da semana", -"Monday" => "Segunda", -"Tuesday" => "Terça", -"Wednesday" => "Quarta", -"Thursday" => "Quinta", -"Friday" => "Sexta", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "Eventos da semana do mês", -"first" => "primeiro", -"second" => "segundo", -"third" => "terçeiro", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Janeiro", -"February" => "Fevereiro", -"March" => "Março", -"April" => "Abril", -"May" => "Maio", -"June" => "Junho", -"July" => "Julho", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Dezembro", -"by events date" => "por data de evento", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) da semana", -"by day and month" => "por dia e mês", -"Date" => "Data", -"Cal." => "Cal.", -"Sun." => "Dom.", -"Mon." => "Seg.", -"Tue." => "ter.", -"Wed." => "Qua.", -"Thu." => "Qui.", -"Fri." => "Sex.", -"Sat." => "Sáb.", -"Jan." => "Jan.", -"Feb." => "Fev,", -"Mar." => "Mar.", -"Apr." => "Abr.", -"May." => "Mai.", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Ago.", -"Sep." => "Set.", -"Oct." => "Out.", -"Nov." => "Nov.", -"Dec." => "Dez.", -"All day" => "Todo o dia", -"Missing fields" => "Falta campos", -"Title" => "Título", -"From Date" => "Da data", -"From Time" => "Da hora", -"To Date" => "Para data", -"To Time" => "Para hora", -"The event ends before it starts" => "O evento acaba antes de começar", -"There was a database fail" => "Houve uma falha de base de dados", -"Week" => "Semana", -"Month" => "Mês", -"List" => "Lista", -"Today" => "Hoje", -"Settings" => "Configurações", -"Your calendars" => "Os seus calendários", -"CalDav Link" => "Endereço CalDav", -"Shared calendars" => "Calendários partilhados", -"No shared calendars" => "Nenhum calendário partilhado", -"Share Calendar" => "Partilhar calendário", -"Download" => "Transferir", -"Edit" => "Editar", -"Delete" => "Apagar", -"shared with you by" => "Partilhado consigo por", -"New calendar" => "Novo calendário", -"Edit calendar" => "Editar calendário", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Calendar color" => "Cor do calendário", -"Save" => "Guardar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", -"Edit an event" => "Editar um evento", -"Export" => "Exportar", -"Eventinfo" => "Informação do evento", -"Repeating" => "Repetição", -"Alarm" => "Alarme", -"Attendees" => "Participantes", -"Share" => "Partilhar", -"Title of the Event" => "Título do evento", -"Category" => "Categoria", -"Separate categories with commas" => "Separe categorias por virgulas", -"Edit categories" => "Editar categorias", -"All Day Event" => "Evento de dia inteiro", -"From" => "De", -"To" => "Para", -"Advanced options" => "Opções avançadas", -"Location" => "Localização", -"Location of the Event" => "Localização do evento", -"Description" => "Descrição", -"Description of the Event" => "Descrição do evento", -"Repeat" => "Repetir", -"Advanced" => "Avançado", -"Select weekdays" => "Seleciona os dias da semana", -"Select days" => "Seleciona os dias", -"and the events day of year." => "e o dia de eventos do ano.", -"and the events day of month." => "e o dia de eventos do mês.", -"Select months" => "Seleciona os meses", -"Select weeks" => "Seleciona as semanas", -"and the events week of year." => "e a semana de eventos do ano.", -"Interval" => "Intervalo", -"End" => "Fim", -"occurrences" => "ocorrências", -"create a new calendar" => "criar novo calendário", -"Import a calendar file" => "Importar um ficheiro de calendário", -"Please choose a calendar" => "Escolha um calendário por favor", -"Name of new calendar" => "Nome do novo calendário", -"Take an available name!" => "Escolha um nome disponível!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Já existe um Calendário com esse nome. Se mesmo assim continuar, esses calendários serão fundidos.", -"Import" => "Importar", -"Close Dialog" => "Fechar diálogo", -"Create a new event" => "Criar novo evento", -"View an event" => "Ver um evento", -"No categories selected" => "Nenhuma categoria seleccionada", -"of" => "de", -"at" => "em", -"General" => "Geral", -"Timezone" => "Zona horária", -"Update timezone automatically" => "Actualizar automaticamente o fuso horário", -"Time format" => "Formato da hora", -"24h" => "24h", -"12h" => "12h", -"Start week on" => "Começar semana em", -"Cache" => "Memória de pré-carregamento", -"Clear cache for repeating events" => "Limpar a memória de pré carregamento para eventos recorrentes", -"URLs" => "Endereço(s) web", -"Calendar CalDAV syncing addresses" => "Endereços de sincronização de calendários CalDAV", -"more info" => "mais informação", -"Primary address (Kontact et al)" => "Endereço principal (contactos et al.)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Ligaç(ão/ões) só de leitura do iCalendar", -"Users" => "Utilizadores", -"select users" => "Selecione utilizadores", -"Editable" => "Editavel", -"Groups" => "Grupos", -"select groups" => "Selecione grupos", -"make public" => "Tornar público" -); diff --git a/apps/calendar/l10n/ro.php b/apps/calendar/l10n/ro.php deleted file mode 100644 index 528d9ae108..0000000000 --- a/apps/calendar/l10n/ro.php +++ /dev/null @@ -1,151 +0,0 @@ - "Nici un calendar găsit.", -"No events found." => "Nici un eveniment găsit.", -"Wrong calendar" => "Calendar greșit", -"New Timezone:" => "Fus orar nou:", -"Timezone changed" => "Fus orar schimbat", -"Invalid request" => "Cerere eronată", -"Calendar" => "Calendar", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "LLL z[aaaa]{'—'[LLL] z aaaa}", -"Birthday" => "Zi de naștere", -"Business" => "Afaceri", -"Call" => "Sună", -"Clients" => "Clienți", -"Deliverer" => "Curier", -"Holidays" => "Sărbători", -"Ideas" => "Idei", -"Journey" => "Călătorie", -"Jubilee" => "Aniversare", -"Meeting" => "Întâlnire", -"Other" => "Altele", -"Personal" => "Personal", -"Projects" => "Proiecte", -"Questions" => "Întrebări", -"Work" => "Servici", -"unnamed" => "fără nume", -"New Calendar" => "Calendar nou", -"Does not repeat" => "Nerepetabil", -"Daily" => "Zilnic", -"Weekly" => "Săptămânal", -"Every Weekday" => "În fiecare zii a săptămânii", -"Bi-Weekly" => "La fiecare două săptămâni", -"Monthly" => "Lunar", -"Yearly" => "Anual", -"never" => "niciodată", -"by occurrences" => "după repetiție", -"by date" => "după dată", -"by monthday" => "după ziua lunii", -"by weekday" => "după ziua săptămânii", -"Monday" => "Luni", -"Tuesday" => "Marți", -"Wednesday" => "Miercuri", -"Thursday" => "Joi", -"Friday" => "Vineri", -"Saturday" => "Sâmbătă", -"Sunday" => "Duminică", -"events week of month" => "evenimentele săptămânii din luna", -"first" => "primul", -"second" => "al doilea", -"third" => "al treilea", -"fourth" => "al patrulea", -"fifth" => "al cincilea", -"last" => "ultimul", -"January" => "Ianuarie", -"February" => "Februarie", -"March" => "Martie", -"April" => "Aprilie", -"May" => "Mai", -"June" => "Iunie", -"July" => "Iulie", -"August" => "August", -"September" => "Septembrie", -"October" => "Octombrie", -"November" => "Noiembrie", -"December" => "Decembrie", -"by events date" => "după data evenimentului", -"by yearday(s)" => "după ziua(zilele) anului", -"by weeknumber(s)" => "după numărul săptămânii", -"by day and month" => "după zi și lună", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Toată ziua", -"Missing fields" => "Câmpuri lipsă", -"Title" => "Titlu", -"From Date" => "Începând cu", -"From Time" => "De la", -"To Date" => "Până pe", -"To Time" => "La", -"The event ends before it starts" => "Evenimentul se termină înainte să înceapă", -"There was a database fail" => "A avut loc o eroare a bazei de date", -"Week" => "Săptămâna", -"Month" => "Luna", -"List" => "Listă", -"Today" => "Astăzi", -"Your calendars" => "Calendarele tale", -"CalDav Link" => "Legătură CalDav", -"Shared calendars" => "Calendare partajate", -"No shared calendars" => "Nici un calendar partajat", -"Share Calendar" => "Partajați calendarul", -"Download" => "Descarcă", -"Edit" => "Modifică", -"Delete" => "Șterge", -"shared with you by" => "Partajat cu tine de", -"New calendar" => "Calendar nou", -"Edit calendar" => "Modifică calendarul", -"Displayname" => "Nume afișat", -"Active" => "Activ", -"Calendar color" => "Culoarea calendarului", -"Save" => "Salveză", -"Submit" => "Trimite", -"Cancel" => "Anulează", -"Edit an event" => "Modifică un eveniment", -"Export" => "Exportă", -"Eventinfo" => "Informații despre eveniment", -"Repeating" => "Ciclic", -"Alarm" => "Alarmă", -"Attendees" => "Participanți", -"Share" => "Partajează", -"Title of the Event" => "Numele evenimentului", -"Category" => "Categorie", -"Separate categories with commas" => "Separă categoriile prin virgule", -"Edit categories" => "Editează categorii", -"All Day Event" => "Toată ziua", -"From" => "De la", -"To" => "Către", -"Advanced options" => "Opțiuni avansate", -"Location" => "Locație", -"Location of the Event" => "Locația evenimentului", -"Description" => "Descriere", -"Description of the Event" => "Descrierea evenimentului", -"Repeat" => "Repetă", -"Advanced" => "Avansat", -"Select weekdays" => "Selectează zilele săptămânii", -"Select days" => "Selectează zilele", -"and the events day of year." => "și evenimentele de zi cu zi ale anului.", -"and the events day of month." => "și evenimentele de zi cu zi ale lunii.", -"Select months" => "Selectează lunile", -"Select weeks" => "Selectează săptămânile", -"and the events week of year." => "și evenimentele săptămânale ale anului.", -"Interval" => "Interval", -"End" => "Sfârșit", -"occurrences" => "repetiții", -"create a new calendar" => "crează un calendar nou", -"Import a calendar file" => "Importă un calendar", -"Name of new calendar" => "Numele noului calendar", -"Import" => "Importă", -"Close Dialog" => "Închide", -"Create a new event" => "Crează un eveniment nou", -"View an event" => "Vizualizează un eveniment", -"No categories selected" => "Nici o categorie selectată", -"of" => "din", -"at" => "la", -"Timezone" => "Fus orar", -"24h" => "24h", -"12h" => "12h", -"Users" => "Utilizatori", -"select users" => "utilizatori selectați", -"Editable" => "Editabil", -"Groups" => "Grupuri", -"select groups" => "grupuri selectate", -"make public" => "fă public" -); diff --git a/apps/calendar/l10n/ru.php b/apps/calendar/l10n/ru.php deleted file mode 100644 index 7535a2868b..0000000000 --- a/apps/calendar/l10n/ru.php +++ /dev/null @@ -1,198 +0,0 @@ - "Не все календари полностью кешированы", -"Everything seems to be completely cached" => "Все, вроде бы, закешировано", -"No calendars found." => "Календари не найдены.", -"No events found." => "События не найдены.", -"Wrong calendar" => "Неверный календарь", -"The file contained either no events or all events are already saved in your calendar." => "Файл либо не собержит событий, либо все события уже есть в календаре", -"events has been saved in the new calendar" => "события были сохранены в новый календарь", -"Import failed" => "Ошибка импорта", -"events has been saved in your calendar" => "события были сохранены в вашем календаре", -"New Timezone:" => "Новый часовой пояс:", -"Timezone changed" => "Часовой пояс изменён", -"Invalid request" => "Неверный запрос", -"Calendar" => "Календарь", -"ddd" => "ддд", -"ddd M/d" => "ддд М/д", -"dddd M/d" => "дддд М/д", -"MMMM yyyy" => "ММММ гггг", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "дддд, МММ д, гггг", -"Birthday" => "День рождения", -"Business" => "Бизнес", -"Call" => "Звонить", -"Clients" => "Клиенты", -"Deliverer" => "Посыльный", -"Holidays" => "Праздники", -"Ideas" => "Идеи", -"Journey" => "Поездка", -"Jubilee" => "Юбилей", -"Meeting" => "Встреча", -"Other" => "Другое", -"Personal" => "Личное", -"Projects" => "Проекты", -"Questions" => "Вопросы", -"Work" => "Работа", -"by" => "до свидания", -"unnamed" => "без имени", -"New Calendar" => "Новый Календарь", -"Does not repeat" => "Не повторяется", -"Daily" => "Ежедневно", -"Weekly" => "Еженедельно", -"Every Weekday" => "По будням", -"Bi-Weekly" => "Каждые две недели", -"Monthly" => "Каждый месяц", -"Yearly" => "Каждый год", -"never" => "никогда", -"by occurrences" => "по числу повторений", -"by date" => "по дате", -"by monthday" => "по дню месяца", -"by weekday" => "по дню недели", -"Monday" => "Понедельник", -"Tuesday" => "Вторник", -"Wednesday" => "Среда", -"Thursday" => "Четверг", -"Friday" => "Пятница", -"Saturday" => "Суббота", -"Sunday" => "Воскресенье", -"events week of month" => "неделя месяца", -"first" => "первая", -"second" => "вторая", -"third" => "третья", -"fourth" => "червётрая", -"fifth" => "пятая", -"last" => "последняя", -"January" => "Январь", -"February" => "Февраль", -"March" => "Март", -"April" => "Апрель", -"May" => "Май", -"June" => "Июнь", -"July" => "Июль", -"August" => "Август", -"September" => "Сентябрь", -"October" => "Октябрь", -"November" => "Ноябрь", -"December" => "Декабрь", -"by events date" => "по дате событий", -"by yearday(s)" => "по дням недели", -"by weeknumber(s)" => "по номерам недели", -"by day and month" => "по дню и месяцу", -"Date" => "Дата", -"Cal." => "Кал.", -"Sun." => "Вс.", -"Mon." => "Пн.", -"Tue." => "Вт.", -"Wed." => "Ср.", -"Thu." => "Чт.", -"Fri." => "Пт.", -"Sat." => "Сб.", -"Jan." => "Янв.", -"Feb." => "Фев.", -"Mar." => "Мар.", -"Apr." => "Апр.", -"May." => "Май.", -"Jun." => "Июн.", -"Jul." => "Июл.", -"Aug." => "Авг.", -"Sep." => "Сен.", -"Oct." => "Окт.", -"Nov." => "Ноя.", -"Dec." => "Дек.", -"All day" => "Весь день", -"Missing fields" => "Незаполненные поля", -"Title" => "Название", -"From Date" => "Дата начала", -"From Time" => "Время начала", -"To Date" => "Дата окончания", -"To Time" => "Время окончания", -"The event ends before it starts" => "Окончание события раньше, чем его начало", -"There was a database fail" => "Ошибка базы данных", -"Week" => "Неделя", -"Month" => "Месяц", -"List" => "Список", -"Today" => "Сегодня", -"Settings" => "Параметры", -"Your calendars" => "Ваши календари", -"CalDav Link" => "Ссылка для CalDav", -"Shared calendars" => "Опубликованные", -"No shared calendars" => "Нет опубликованных календарей", -"Share Calendar" => "Опубликовать", -"Download" => "Скачать", -"Edit" => "Редактировать", -"Delete" => "Удалить", -"shared with you by" => "опубликовал для вас", -"New calendar" => "Новый календарь", -"Edit calendar" => "Редактировать календарь", -"Displayname" => "Отображаемое имя", -"Active" => "Активен", -"Calendar color" => "Цвет календаря", -"Save" => "Сохранить", -"Submit" => "Отправить", -"Cancel" => "Отмена", -"Edit an event" => "Редактировать событие", -"Export" => "Экспортировать", -"Eventinfo" => "Информация о событии", -"Repeating" => "Повторение", -"Alarm" => "Сигнал", -"Attendees" => "Участники", -"Share" => "Опубликовать", -"Title of the Event" => "Название событие", -"Category" => "Категория", -"Separate categories with commas" => "Разделяйте категории запятыми", -"Edit categories" => "Редактировать категории", -"All Day Event" => "Событие на весь день", -"From" => "От", -"To" => "До", -"Advanced options" => "Дополнительные параметры", -"Location" => "Место", -"Location of the Event" => "Место события", -"Description" => "Описание", -"Description of the Event" => "Описание события", -"Repeat" => "Повтор", -"Advanced" => "Дополнительно", -"Select weekdays" => "Выбрать дни недели", -"Select days" => "Выбрать дни", -"and the events day of year." => "и день года события", -"and the events day of month." => "и день месяца события", -"Select months" => "Выбрать месяцы", -"Select weeks" => "Выбрать недели", -"and the events week of year." => "и номер недели события", -"Interval" => "Интервал", -"End" => "Окончание", -"occurrences" => "повторений", -"create a new calendar" => "Создать новый календарь", -"Import a calendar file" => "Импортировать календарь из файла", -"Please choose a calendar" => "Пожалуйста, выберите календарь", -"Name of new calendar" => "Название нового календаря", -"Take an available name!" => "Возьмите разрешенное имя!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Календарь с таким именем уже существует. Если вы продолжите, одноименный календарь будет удален.", -"Import" => "Импортировать", -"Close Dialog" => "Закрыть Сообщение", -"Create a new event" => "Создать новое событие", -"View an event" => "Показать событие", -"No categories selected" => "Категории не выбраны", -"of" => "из", -"at" => "на", -"General" => "Основные", -"Timezone" => "Часовой пояс", -"Update timezone automatically" => "Автоматическое обновление временной зоны", -"Time format" => "Формат времени", -"24h" => "24ч", -"12h" => "12ч", -"Start week on" => "Начало недели", -"Cache" => "Кэш", -"Clear cache for repeating events" => "Очистить кэш повторяющихся событий", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "Адрес синхронизации CalDAV", -"more info" => "подробнее", -"Primary address (Kontact et al)" => "Основной адрес (Контакта)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Читать только ссылки iCalendar", -"Users" => "Пользователи", -"select users" => "выбрать пользователей", -"Editable" => "Редактируемо", -"Groups" => "Группы", -"select groups" => "выбрать группы", -"make public" => "селать публичным" -); diff --git a/apps/calendar/l10n/sk_SK.php b/apps/calendar/l10n/sk_SK.php deleted file mode 100644 index 65400c496d..0000000000 --- a/apps/calendar/l10n/sk_SK.php +++ /dev/null @@ -1,156 +0,0 @@ - "Nenašiel sa žiadny kalendár.", -"No events found." => "Nenašla sa žiadna udalosť.", -"Wrong calendar" => "Zlý kalendár", -"New Timezone:" => "Nová časová zóna:", -"Timezone changed" => "Časové pásmo zmenené", -"Invalid request" => "Neplatná požiadavka", -"Calendar" => "Kalendár", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM rrrr", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '—' d.[ MMM] yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, rrrr", -"Birthday" => "Narodeniny", -"Business" => "Podnikanie", -"Call" => "Hovor", -"Clients" => "Klienti", -"Deliverer" => "Doručovateľ", -"Holidays" => "Prázdniny", -"Ideas" => "Nápady", -"Journey" => "Cesta", -"Jubilee" => "Jubileá", -"Meeting" => "Stretnutia", -"Other" => "Ostatné", -"Personal" => "Osobné", -"Projects" => "Projekty", -"Questions" => "Otázky", -"Work" => "Práca", -"unnamed" => "nepomenovaný", -"New Calendar" => "Nový kalendár", -"Does not repeat" => "Neopakovať", -"Daily" => "Denne", -"Weekly" => "Týždenne", -"Every Weekday" => "Každý deň v týždni", -"Bi-Weekly" => "Každý druhý týždeň", -"Monthly" => "Mesačne", -"Yearly" => "Ročne", -"never" => "nikdy", -"by occurrences" => "podľa výskytu", -"by date" => "podľa dátumu", -"by monthday" => "podľa dňa v mesiaci", -"by weekday" => "podľa dňa v týždni", -"Monday" => "Pondelok", -"Tuesday" => "Utorok", -"Wednesday" => "Streda", -"Thursday" => "Štvrtok", -"Friday" => "Piatok", -"Saturday" => "Sobota", -"Sunday" => "Nedeľa", -"events week of month" => "týždenné udalosti v mesiaci", -"first" => "prvý", -"second" => "druhý", -"third" => "tretí", -"fourth" => "štvrtý", -"fifth" => "piaty", -"last" => "posledný", -"January" => "Január", -"February" => "Február", -"March" => "Marec", -"April" => "Apríl", -"May" => "Máj", -"June" => "Jún", -"July" => "Júl", -"August" => "August", -"September" => "September", -"October" => "Október", -"November" => "November", -"December" => "December", -"by events date" => "podľa dátumu udalosti", -"by yearday(s)" => "po dňoch", -"by weeknumber(s)" => "podľa čísel týždňov", -"by day and month" => "podľa dňa a mesiaca", -"Date" => "Dátum", -"Cal." => "Kal.", -"All day" => "Celý deň", -"Missing fields" => "Nevyplnené položky", -"Title" => "Nadpis", -"From Date" => "Od dátumu", -"From Time" => "Od času", -"To Date" => "Do dátumu", -"To Time" => "Do času", -"The event ends before it starts" => "Udalosť končí ešte pred tým než začne", -"There was a database fail" => "Nastala chyba databázy", -"Week" => "Týždeň", -"Month" => "Mesiac", -"List" => "Zoznam", -"Today" => "Dnes", -"Your calendars" => "Vaše kalendáre", -"CalDav Link" => "CalDav odkaz", -"Shared calendars" => "Zdielané kalendáre", -"No shared calendars" => "Žiadne zdielané kalendáre", -"Share Calendar" => "Zdielať kalendár", -"Download" => "Stiahnuť", -"Edit" => "Upraviť", -"Delete" => "Odstrániť", -"shared with you by" => "zdielané s vami používateľom", -"New calendar" => "Nový kalendár", -"Edit calendar" => "Upraviť kalendár", -"Displayname" => "Zobrazené meno", -"Active" => "Aktívne", -"Calendar color" => "Farba kalendáru", -"Save" => "Uložiť", -"Submit" => "Odoslať", -"Cancel" => "Zrušiť", -"Edit an event" => "Upraviť udalosť", -"Export" => "Exportovať", -"Eventinfo" => "Informácie o udalosti", -"Repeating" => "Opakovanie", -"Alarm" => "Alarm", -"Attendees" => "Účastníci", -"Share" => "Zdielať", -"Title of the Event" => "Nadpis udalosti", -"Category" => "Kategória", -"Separate categories with commas" => "Kategórie oddelené čiarkami", -"Edit categories" => "Úprava kategórií", -"All Day Event" => "Celodenná udalosť", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Pokročilé možnosti", -"Location" => "Poloha", -"Location of the Event" => "Poloha udalosti", -"Description" => "Popis", -"Description of the Event" => "Popis udalosti", -"Repeat" => "Opakovať", -"Advanced" => "Pokročilé", -"Select weekdays" => "Do času", -"Select days" => "Vybrať dni", -"and the events day of year." => "a denné udalosti v roku.", -"and the events day of month." => "a denné udalosti v mesiaci.", -"Select months" => "Vybrať mesiace", -"Select weeks" => "Vybrať týždne", -"and the events week of year." => "a týždenné udalosti v roku.", -"Interval" => "Interval", -"End" => "Koniec", -"occurrences" => "výskyty", -"create a new calendar" => "vytvoriť nový kalendár", -"Import a calendar file" => "Importovať súbor kalendára", -"Name of new calendar" => "Meno nového kalendára", -"Import" => "Importovať", -"Close Dialog" => "Zatvoriť dialóg", -"Create a new event" => "Vytvoriť udalosť", -"View an event" => "Zobraziť udalosť", -"No categories selected" => "Žiadne vybraté kategórie", -"of" => "z", -"at" => "v", -"Timezone" => "Časová zóna", -"24h" => "24h", -"12h" => "12h", -"Users" => "Používatelia", -"select users" => "vybrať používateľov", -"Editable" => "Upravovateľné", -"Groups" => "Skupiny", -"select groups" => "vybrať skupiny", -"make public" => "zverejniť" -); diff --git a/apps/calendar/l10n/sl.php b/apps/calendar/l10n/sl.php deleted file mode 100644 index 585132314b..0000000000 --- a/apps/calendar/l10n/sl.php +++ /dev/null @@ -1,198 +0,0 @@ - "Vsi koledarji niso povsem predpomnjeni", -"Everything seems to be completely cached" => "Izgleda, da je vse v predpomnilniku", -"No calendars found." => "Ni bilo najdenih koledarjev.", -"No events found." => "Ni bilo najdenih dogodkov.", -"Wrong calendar" => "Napačen koledar", -"The file contained either no events or all events are already saved in your calendar." => "Datoteka ni vsebovala dogodkov ali pa so vsi dogodki že shranjeni v koledarju.", -"events has been saved in the new calendar" => "dogodki so bili shranjeni v nov koledar", -"Import failed" => "Uvoz je spodletel", -"events has been saved in your calendar" => "dogodki so bili shranjeni v vaš koledar", -"New Timezone:" => "Nov časovni pas:", -"Timezone changed" => "Časovni pas je bil spremenjen", -"Invalid request" => "Neveljaven zahtevek", -"Calendar" => "Koledar", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Rojstni dan", -"Business" => "Poslovno", -"Call" => "Pokliči", -"Clients" => "Stranke", -"Deliverer" => "Dobavitelj", -"Holidays" => "Dopust", -"Ideas" => "Ideje", -"Journey" => "Potovanje", -"Jubilee" => "Obletnica", -"Meeting" => "Sestanek", -"Other" => "Ostalo", -"Personal" => "Osebno", -"Projects" => "Projekt", -"Questions" => "Vprašanja", -"Work" => "Delo", -"by" => "od", -"unnamed" => "neimenovan", -"New Calendar" => "Nov koledar", -"Does not repeat" => "Se ne ponavlja", -"Daily" => "Dnevno", -"Weekly" => "Tedensko", -"Every Weekday" => "Vsak dan v tednu", -"Bi-Weekly" => "Dvakrat tedensko", -"Monthly" => "Mesečno", -"Yearly" => "Letno", -"never" => "nikoli", -"by occurrences" => "po številu dogodkov", -"by date" => "po datumu", -"by monthday" => "po dnevu v mesecu", -"by weekday" => "po dnevu v tednu", -"Monday" => "ponedeljek", -"Tuesday" => "torek", -"Wednesday" => "sreda", -"Thursday" => "četrtek", -"Friday" => "petek", -"Saturday" => "sobota", -"Sunday" => "nedelja", -"events week of month" => "dogodki tedna v mesecu", -"first" => "prvi", -"second" => "drugi", -"third" => "tretji", -"fourth" => "četrti", -"fifth" => "peti", -"last" => "zadnji", -"January" => "januar", -"February" => "februar", -"March" => "marec", -"April" => "april", -"May" => "maj", -"June" => "junij", -"July" => "julij", -"August" => "avgust", -"September" => "september", -"October" => "oktober", -"November" => "november", -"December" => "december", -"by events date" => "po datumu dogodka", -"by yearday(s)" => "po številu let", -"by weeknumber(s)" => "po tednu v letu", -"by day and month" => "po dnevu in mesecu", -"Date" => "Datum", -"Cal." => "Kol.", -"Sun." => "ned.", -"Mon." => "pon.", -"Tue." => "tor.", -"Wed." => "sre.", -"Thu." => "čet.", -"Fri." => "pet.", -"Sat." => "sob.", -"Jan." => "jan.", -"Feb." => "feb.", -"Mar." => "mar.", -"Apr." => "apr.", -"May." => "maj", -"Jun." => "jun.", -"Jul." => "jul.", -"Aug." => "avg.", -"Sep." => "sep.", -"Oct." => "okt.", -"Nov." => "nov.", -"Dec." => "dec.", -"All day" => "Cel dan", -"Missing fields" => "Mankajoča polja", -"Title" => "Naslov", -"From Date" => "od Datum", -"From Time" => "od Čas", -"To Date" => "do Datum", -"To Time" => "do Čas", -"The event ends before it starts" => "Dogodek se konča preden se začne", -"There was a database fail" => "Napaka v podatkovni zbirki", -"Week" => "Teden", -"Month" => "Mesec", -"List" => "Seznam", -"Today" => "Danes", -"Settings" => "Nastavitve", -"Your calendars" => "Vaši koledarji", -"CalDav Link" => "CalDav povezava", -"Shared calendars" => "Koledarji v souporabi", -"No shared calendars" => "Ni koledarjev v souporabi", -"Share Calendar" => "Daj koledar v souporabo", -"Download" => "Prenesi", -"Edit" => "Uredi", -"Delete" => "Izbriši", -"shared with you by" => "z vami souporablja", -"New calendar" => "Nov koledar", -"Edit calendar" => "Uredi koledar", -"Displayname" => "Ime za prikaz", -"Active" => "Aktivno", -"Calendar color" => "Barva koledarja", -"Save" => "Shrani", -"Submit" => "Potrdi", -"Cancel" => "Prekliči", -"Edit an event" => "Uredi dogodek", -"Export" => "Izvozi", -"Eventinfo" => "Informacije od dogodku", -"Repeating" => "Ponavljanja", -"Alarm" => "Alarm", -"Attendees" => "Udeleženci", -"Share" => "Souporaba", -"Title of the Event" => "Naslov dogodka", -"Category" => "Kategorija", -"Separate categories with commas" => "Kategorije ločite z vejico", -"Edit categories" => "Uredi kategorije", -"All Day Event" => "Celodnevni dogodek", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Napredne možnosti", -"Location" => "Kraj", -"Location of the Event" => "Kraj dogodka", -"Description" => "Opis", -"Description of the Event" => "Opis dogodka", -"Repeat" => "Ponovi", -"Advanced" => "Napredno", -"Select weekdays" => "Izberite dneve v tednu", -"Select days" => "Izberite dneve", -"and the events day of year." => "in dnevu dogodka v letu.", -"and the events day of month." => "in dnevu dogodka v mesecu.", -"Select months" => "Izberite mesece", -"Select weeks" => "Izberite tedne", -"and the events week of year." => "in tednu dogodka v letu.", -"Interval" => "Časovni razmik", -"End" => "Konec", -"occurrences" => "ponovitev", -"create a new calendar" => "Ustvari nov koledar", -"Import a calendar file" => "Uvozi datoteko koledarja", -"Please choose a calendar" => "Prosimo, če izberete koledar", -"Name of new calendar" => "Ime novega koledarja", -"Take an available name!" => "Izberite prosto ime!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Koledar s tem imenom že obstaja. Če nadaljujete, bosta koledarja združena.", -"Import" => "Uvozi", -"Close Dialog" => "Zapri dialog", -"Create a new event" => "Ustvari nov dogodek", -"View an event" => "Poglej dogodek", -"No categories selected" => "Nobena kategorija ni izbrana", -"of" => "od", -"at" => "pri", -"General" => "Splošno", -"Timezone" => "Časovni pas", -"Update timezone automatically" => "Samodejno posodobi časovni pas", -"Time format" => "Oblika zapisa časa", -"24h" => "24ur", -"12h" => "12ur", -"Start week on" => "Začni teden z", -"Cache" => "Predpomnilnik", -"Clear cache for repeating events" => "Počisti predpomnilnik za ponavljajoče dogodke", -"URLs" => "URLji", -"Calendar CalDAV syncing addresses" => "CalDAV naslov za usklajevanje koledarjev", -"more info" => "dodatne informacije", -"Primary address (Kontact et al)" => "Glavni naslov (Kontakt et al)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "iCalendar povezava/e samo za branje", -"Users" => "Uporabniki", -"select users" => "izberite uporabnike", -"Editable" => "Možno urejanje", -"Groups" => "Skupine", -"select groups" => "izberite skupine", -"make public" => "objavi" -); diff --git a/apps/calendar/l10n/sr.php b/apps/calendar/l10n/sr.php deleted file mode 100644 index 4ec60e20cb..0000000000 --- a/apps/calendar/l10n/sr.php +++ /dev/null @@ -1,60 +0,0 @@ - "Погрешан календар", -"Timezone changed" => "Временска зона је промењена", -"Invalid request" => "Неисправан захтев", -"Calendar" => "Календар", -"Birthday" => "Рођендан", -"Business" => "Посао", -"Call" => "Позив", -"Clients" => "Клијенти", -"Deliverer" => "Достављач", -"Holidays" => "Празници", -"Ideas" => "Идеје", -"Journey" => "путовање", -"Jubilee" => "јубилеј", -"Meeting" => "Састанак", -"Other" => "Друго", -"Personal" => "Лично", -"Projects" => "Пројекти", -"Questions" => "Питања", -"Work" => "Посао", -"New Calendar" => "Нови календар", -"Does not repeat" => "Не понавља се", -"Daily" => "дневно", -"Weekly" => "недељно", -"Every Weekday" => "сваког дана у недељи", -"Bi-Weekly" => "двонедељно", -"Monthly" => "месечно", -"Yearly" => "годишње", -"All day" => "Цео дан", -"Title" => "Наслов", -"Week" => "Недеља", -"Month" => "Месец", -"List" => "Списак", -"Today" => "Данас", -"CalDav Link" => "КалДав веза", -"Download" => "Преузми", -"Edit" => "Уреди", -"Delete" => "Обриши", -"New calendar" => "Нови календар", -"Edit calendar" => "Уреди календар", -"Displayname" => "Приказаноиме", -"Active" => "Активан", -"Calendar color" => "Боја календара", -"Save" => "Сними", -"Submit" => "Пошаљи", -"Cancel" => "Откажи", -"Edit an event" => "Уреди догађај", -"Title of the Event" => "Наслов догађаја", -"Category" => "Категорија", -"All Day Event" => "Целодневни догађај", -"From" => "Од", -"To" => "До", -"Location" => "Локација", -"Location of the Event" => "Локација догађаја", -"Description" => "Опис", -"Description of the Event" => "Опис догађаја", -"Repeat" => "Понављај", -"Create a new event" => "Направи нови догађај", -"Timezone" => "Временска зона" -); diff --git a/apps/calendar/l10n/sr@latin.php b/apps/calendar/l10n/sr@latin.php deleted file mode 100644 index 4ceabcbae5..0000000000 --- a/apps/calendar/l10n/sr@latin.php +++ /dev/null @@ -1,60 +0,0 @@ - "Pogrešan kalendar", -"Timezone changed" => "Vremenska zona je promenjena", -"Invalid request" => "Neispravan zahtev", -"Calendar" => "Kalendar", -"Birthday" => "Rođendan", -"Business" => "Posao", -"Call" => "Poziv", -"Clients" => "Klijenti", -"Deliverer" => "Dostavljač", -"Holidays" => "Praznici", -"Ideas" => "Ideje", -"Journey" => "putovanje", -"Jubilee" => "jubilej", -"Meeting" => "Sastanak", -"Other" => "Drugo", -"Personal" => "Lično", -"Projects" => "Projekti", -"Questions" => "Pitanja", -"Work" => "Posao", -"New Calendar" => "Novi kalendar", -"Does not repeat" => "Ne ponavlja se", -"Daily" => "dnevno", -"Weekly" => "nedeljno", -"Every Weekday" => "svakog dana u nedelji", -"Bi-Weekly" => "dvonedeljno", -"Monthly" => "mesečno", -"Yearly" => "godišnje", -"All day" => "Ceo dan", -"Title" => "Naslov", -"Week" => "Nedelja", -"Month" => "Mesec", -"List" => "Spisak", -"Today" => "Danas", -"CalDav Link" => "KalDav veza", -"Download" => "Preuzmi", -"Edit" => "Uredi", -"Delete" => "Obriši", -"New calendar" => "Novi kalendar", -"Edit calendar" => "Uredi kalendar", -"Displayname" => "Prikazanoime", -"Active" => "Aktivan", -"Calendar color" => "Boja kalendara", -"Save" => "Snimi", -"Submit" => "Pošalji", -"Cancel" => "Otkaži", -"Edit an event" => "Uredi događaj", -"Title of the Event" => "Naslov događaja", -"Category" => "Kategorija", -"All Day Event" => "Celodnevni događaj", -"From" => "Od", -"To" => "Do", -"Location" => "Lokacija", -"Location of the Event" => "Lokacija događaja", -"Description" => "Opis", -"Description of the Event" => "Opis događaja", -"Repeat" => "Ponavljaj", -"Create a new event" => "Napravi novi događaj", -"Timezone" => "Vremenska zona" -); diff --git a/apps/calendar/l10n/sv.php b/apps/calendar/l10n/sv.php deleted file mode 100644 index 7baa0309a6..0000000000 --- a/apps/calendar/l10n/sv.php +++ /dev/null @@ -1,192 +0,0 @@ - "Alla kalendrar är inte fullständigt sparade i cache", -"Everything seems to be completely cached" => "Allt verkar vara fullständigt sparat i cache", -"No calendars found." => "Inga kalendrar funna", -"No events found." => "Inga händelser funna.", -"Wrong calendar" => "Fel kalender", -"The file contained either no events or all events are already saved in your calendar." => "Filen innehöll inga händelser eller så är alla händelser redan sparade i kalendern.", -"events has been saved in the new calendar" => "händelser har sparats i den nya kalendern", -"Import failed" => "Misslyckad import", -"events has been saved in your calendar" => "händelse har sparats i din kalender", -"New Timezone:" => "Ny tidszon:", -"Timezone changed" => "Tidszon ändrad", -"Invalid request" => "Ogiltig begäran", -"Calendar" => "Kalender", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM åååå", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "ddd, MMM d, åååå", -"Birthday" => "Födelsedag", -"Business" => "Företag", -"Call" => "Ringa", -"Clients" => "Klienter", -"Deliverer" => "Leverantör", -"Holidays" => "Semester", -"Ideas" => "Idéer", -"Journey" => "Resa", -"Jubilee" => "Jubileum", -"Meeting" => "Möte", -"Other" => "Annat", -"Personal" => "Personlig", -"Projects" => "Projekt", -"Questions" => "Frågor", -"Work" => "Arbetet", -"by" => "av", -"unnamed" => "Namn saknas", -"New Calendar" => "Ny kalender", -"Does not repeat" => "Upprepas inte", -"Daily" => "Dagligen", -"Weekly" => "Varje vecka", -"Every Weekday" => "Varje vardag", -"Bi-Weekly" => "Varannan vecka", -"Monthly" => "Varje månad", -"Yearly" => "Årligen", -"never" => "aldrig", -"by occurrences" => "efter händelser", -"by date" => "efter datum", -"by monthday" => "efter dag i månaden", -"by weekday" => "efter veckodag", -"Monday" => "Måndag", -"Tuesday" => "Tisdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lördag", -"Sunday" => "Söndag", -"events week of month" => "händelse vecka av månad", -"first" => "första", -"second" => "andra", -"third" => "tredje", -"fourth" => "fjärde", -"fifth" => "femte", -"last" => "sist", -"January" => "Januari", -"February" => "Februari", -"March" => "Mars", -"April" => "April", -"May" => "Maj", -"June" => "Juni", -"July" => "Juli", -"August" => "Augusti", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "efter händelsedatum", -"by yearday(s)" => "efter årsdag(ar)", -"by weeknumber(s)" => "efter veckonummer", -"by day and month" => "efter dag och månad", -"Date" => "Datum", -"Cal." => "Kal.", -"Sun." => "Sön.", -"Mon." => "Mån.", -"Tue." => "Tis.", -"Wed." => "Ons.", -"Thu." => "Tor.", -"Fri." => "Fre.", -"Sat." => "Lör.", -"Jan." => "Jan.", -"Feb." => "Feb.", -"Mar." => "Mar.", -"Apr." => "Apr.", -"May." => "Maj.", -"Jun." => "Jun.", -"Jul." => "Jul.", -"Aug." => "Aug.", -"Sep." => "Sep.", -"Oct." => "Okt.", -"Nov." => "Nov.", -"Dec." => "Dec.", -"All day" => "Hela dagen", -"Missing fields" => "Saknade fält", -"Title" => "Rubrik", -"From Date" => "Från datum", -"From Time" => "Från tid", -"To Date" => "Till datum", -"To Time" => "Till tid", -"The event ends before it starts" => "Händelsen slutar innan den börjar", -"There was a database fail" => "Det blev ett databasfel", -"Week" => "Vecka", -"Month" => "Månad", -"List" => "Lista", -"Today" => "Idag", -"Your calendars" => "Dina kalendrar", -"CalDav Link" => "CalDAV-länk", -"Shared calendars" => "Delade kalendrar", -"No shared calendars" => "Inga delade kalendrar", -"Share Calendar" => "Dela kalender", -"Download" => "Ladda ner", -"Edit" => "Redigera", -"Delete" => "Radera", -"shared with you by" => "delad med dig av", -"New calendar" => "Nya kalender", -"Edit calendar" => "Redigera kalender", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", -"Calendar color" => "Kalender-färg", -"Save" => "Spara", -"Submit" => "Lägg till", -"Cancel" => "Avbryt", -"Edit an event" => "Redigera en händelse", -"Export" => "Exportera", -"Eventinfo" => "Händelseinfo", -"Repeating" => "Repetera", -"Alarm" => "Alarm", -"Attendees" => "Deltagare", -"Share" => "Dela", -"Title of the Event" => "Rubrik för händelsen", -"Category" => "Kategori", -"Separate categories with commas" => "Separera kategorier med komman", -"Edit categories" => "Redigera kategorier", -"All Day Event" => "Hela dagen", -"From" => "Från", -"To" => "Till", -"Advanced options" => "Avancerade alternativ", -"Location" => "Plats", -"Location of the Event" => "Platsen för händelsen", -"Description" => "Beskrivning", -"Description of the Event" => "Beskrivning av händelse", -"Repeat" => "Upprepa", -"Advanced" => "Avancerad", -"Select weekdays" => "Välj veckodagar", -"Select days" => "Välj dagar", -"and the events day of year." => "och händelsedagen för året.", -"and the events day of month." => "och händelsedagen för månaden.", -"Select months" => "Välj månader", -"Select weeks" => "Välj veckor", -"and the events week of year." => "och händelsevecka för året.", -"Interval" => "Hur ofta", -"End" => "Slut", -"occurrences" => "Händelser", -"create a new calendar" => "skapa en ny kalender", -"Import a calendar file" => "Importera en kalenderfil", -"Please choose a calendar" => "Välj en kalender", -"Name of new calendar" => "Namn på ny kalender", -"Take an available name!" => "Ta ett ledigt namn!", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med detta namn finns redan. Om du fortsätter ändå så kommer dessa kalendrar att slås samman.", -"Import" => "Importera", -"Close Dialog" => "Stäng ", -"Create a new event" => "Skapa en ny händelse", -"View an event" => "Visa en händelse", -"No categories selected" => "Inga kategorier valda", -"of" => "av", -"at" => "på", -"Timezone" => "Tidszon", -"24h" => "24h", -"12h" => "12h", -"Cache" => "Cache", -"Clear cache for repeating events" => "Töm cache för upprepade händelser", -"Calendar CalDAV syncing addresses" => "Kalender CalDAV synkroniserar adresser", -"more info" => "mer info", -"Primary address (Kontact et al)" => "Primary address (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Read only iCalendar link(s)", -"Users" => "Användare", -"select users" => "välj användare", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "Välj grupper", -"make public" => "Gör offentlig" -); diff --git a/apps/calendar/l10n/th_TH.php b/apps/calendar/l10n/th_TH.php deleted file mode 100644 index 0b92a623d4..0000000000 --- a/apps/calendar/l10n/th_TH.php +++ /dev/null @@ -1,198 +0,0 @@ - "ไม่ใช่ปฏิทินทั้งหมดที่จะถูกจัดเก็บข้อมูลไว้ในหน่วยความจำแคชอย่างสมบูรณ์", -"Everything seems to be completely cached" => "ทุกสิ่งทุกอย่างได้ถูกเก็บเข้าไปไว้ในหน่วยความจำแคชอย่างสมบูรณ์แล้ว", -"No calendars found." => "ไม่พบปฏิทินที่ต้องการ", -"No events found." => "ไม่พบกิจกรรมที่ต้องการ", -"Wrong calendar" => "ปฏิทินไม่ถูกต้อง", -"The file contained either no events or all events are already saved in your calendar." => "ไฟล์ดังกล่าวบรรจุข้อมูลกิจกรรมที่มีอยู่แล้วในปฏิทินของคุณ", -"events has been saved in the new calendar" => "กิจกรรมได้ถูกบันทึกไปไว้ในปฏิทินที่สร้างขึ้นใหม่แล้ว", -"Import failed" => "การนำเข้าข้อมูลล้มเหลว", -"events has been saved in your calendar" => "กิจกรรมได้ถูกบันทึกเข้าไปไว้ในปฏิทินของคุณแล้ว", -"New Timezone:" => "สร้างโซนเวลาใหม่:", -"Timezone changed" => "โซนเวลาถูกเปลี่ยนแล้ว", -"Invalid request" => "คำร้องขอไม่ถูกต้อง", -"Calendar" => "ปฏิทิน", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "วันเกิด", -"Business" => "ธุรกิจ", -"Call" => "โทรติดต่อ", -"Clients" => "ลูกค้า", -"Deliverer" => "จัดส่ง", -"Holidays" => "วันหยุด", -"Ideas" => "ไอเดีย", -"Journey" => "การเดินทาง", -"Jubilee" => "งานเลี้ยง", -"Meeting" => "นัดประชุม", -"Other" => "อื่นๆ", -"Personal" => "ส่วนตัว", -"Projects" => "โครงการ", -"Questions" => "คำถาม", -"Work" => "งาน", -"by" => "โดย", -"unnamed" => "ไม่มีชื่อ", -"New Calendar" => "สร้างปฏิทินใหม่", -"Does not repeat" => "ไม่ต้องทำซ้ำ", -"Daily" => "รายวัน", -"Weekly" => "รายสัปดาห์", -"Every Weekday" => "ทุกวันหยุด", -"Bi-Weekly" => "รายปักษ์", -"Monthly" => "รายเดือน", -"Yearly" => "รายปี", -"never" => "ไม่ต้องเลย", -"by occurrences" => "ตามจำนวนที่ปรากฏ", -"by date" => "ตามวันที่", -"by monthday" => "จากเดือน", -"by weekday" => "จากสัปดาห์", -"Monday" => "วันจันทร์", -"Tuesday" => "วันอังคาร", -"Wednesday" => "วันพุธ", -"Thursday" => "วันพฤหัสบดี", -"Friday" => "วันศุกร์", -"Saturday" => "วันเสาร์", -"Sunday" => "วันอาทิตย์", -"events week of month" => "สัปดาห์ที่มีกิจกรรมของเดือน", -"first" => "ลำดับแรก", -"second" => "ลำดับที่สอง", -"third" => "ลำดับที่สาม", -"fourth" => "ลำดับที่สี่", -"fifth" => "ลำดับที่ห้า", -"last" => "ลำดับสุดท้าย", -"January" => "มกราคม", -"February" => "กุมภาพันธ์", -"March" => "มีนาคม", -"April" => "เมษายน", -"May" => "พฤษภาคม", -"June" => "มิถุนายน", -"July" => "กรกฏาคม", -"August" => "สิงหาคม", -"September" => "กันยายน", -"October" => "ตุลาคม", -"November" => "พฤศจิกายน", -"December" => "ธันวาคม", -"by events date" => "ตามวันที่จัดกิจกรรม", -"by yearday(s)" => "ของเมื่อวานนี้", -"by weeknumber(s)" => "จากหมายเลขของสัปดาห์", -"by day and month" => "ตามวันและเดือน", -"Date" => "วันที่", -"Cal." => "คำนวณ", -"Sun." => "อา.", -"Mon." => "จ.", -"Tue." => "อ.", -"Wed." => "พ.", -"Thu." => "พฤ.", -"Fri." => "ศ.", -"Sat." => "ส.", -"Jan." => "ม.ค.", -"Feb." => "ก.พ.", -"Mar." => "มี.ค.", -"Apr." => "เม.ย.", -"May." => "พ.ค.", -"Jun." => "มิ.ย.", -"Jul." => "ก.ค.", -"Aug." => "ส.ค.", -"Sep." => "ก.ย.", -"Oct." => "ต.ค.", -"Nov." => "พ.ย.", -"Dec." => "ธ.ค.", -"All day" => "ทั้งวัน", -"Missing fields" => "ช่องฟิลด์เกิดการสูญหาย", -"Title" => "ชื่อกิจกรรม", -"From Date" => "จากวันที่", -"From Time" => "ตั้งแต่เวลา", -"To Date" => "ถึงวันที่", -"To Time" => "ถึงเวลา", -"The event ends before it starts" => "วันที่สิ้นสุดกิจกรรมดังกล่าวอยู่ก่อนวันเริ่มต้น", -"There was a database fail" => "เกิดความล้มเหลวกับฐานข้อมูล", -"Week" => "สัปดาห์", -"Month" => "เดือน", -"List" => "รายการ", -"Today" => "วันนี้", -"Settings" => "ตั้งค่า", -"Your calendars" => "ปฏิทินของคุณ", -"CalDav Link" => "ลิงค์ CalDav", -"Shared calendars" => "ปฏิทินที่เปิดแชร์", -"No shared calendars" => "ไม่มีปฏิทินที่เปิดแชร์ไว้", -"Share Calendar" => "เปิดแชร์ปฏิทิน", -"Download" => "ดาวน์โหลด", -"Edit" => "แก้ไข", -"Delete" => "ลบ", -"shared with you by" => "แชร์ให้คุณโดย", -"New calendar" => "สร้างปฏิทินใหม่", -"Edit calendar" => "แก้ไขปฏิทิน", -"Displayname" => "ชื่อที่ต้องการให้แสดง", -"Active" => "ใช้งาน", -"Calendar color" => "สีของปฏิทิน", -"Save" => "บันทึก", -"Submit" => "ส่งข้อมูล", -"Cancel" => "ยกเลิก", -"Edit an event" => "แก้ไขกิจกรรม", -"Export" => "ส่งออกข้อมูล", -"Eventinfo" => "ข้อมูลเกี่ยวกับกิจกรรม", -"Repeating" => "ทำซ้ำ", -"Alarm" => "แจ้งเตือน", -"Attendees" => "ผู้เข้าร่วมกิจกรรม", -"Share" => "แชร์", -"Title of the Event" => "ชื่อของกิจกรรม", -"Category" => "หมวดหมู่", -"Separate categories with commas" => "คั่นระหว่างรายการหมวดหมู่ด้วยเครื่องหมายจุลภาคหรือคอมม่า", -"Edit categories" => "แก้ไขหมวดหมู่", -"All Day Event" => "เป็นกิจกรรมตลอดทั้งวัน", -"From" => "จาก", -"To" => "ถึง", -"Advanced options" => "ตัวเลือกขั้นสูง", -"Location" => "สถานที่", -"Location of the Event" => "สถานที่จัดกิจกรรม", -"Description" => "คำอธิบาย", -"Description of the Event" => "คำอธิบายเกี่ยวกับกิจกรรม", -"Repeat" => "ทำซ้ำ", -"Advanced" => "ขั้นสูง", -"Select weekdays" => "เลือกสัปดาห์", -"Select days" => "เลือกวัน", -"and the events day of year." => "และวันที่มีเหตุการณ์เกิดขึ้นในปี", -"and the events day of month." => "และวันที่มีเหตุการณ์เกิดขึ้นในเดือน", -"Select months" => "เลือกเดือน", -"Select weeks" => "เลือกสัปดาห์", -"and the events week of year." => "และสัปดาห์ที่มีเหตุการณ์เกิดขึ้นในปี", -"Interval" => "ช่วงเวลา", -"End" => "สิ้นสุด", -"occurrences" => "จำนวนที่ปรากฏ", -"create a new calendar" => "สร้างปฏิทินใหม่", -"Import a calendar file" => "นำเข้าไฟล์ปฏิทิน", -"Please choose a calendar" => "กรุณาเลือกปฏิทิน", -"Name of new calendar" => "ชื่อของปฏิทิน", -"Take an available name!" => "เลือกชื่อที่ต้องการ", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "ปฏิทินชื่อดังกล่าวถูกใช้งานไปแล้ว หากคุณยังดำเนินการต่อไป ปฏิทินดังกล่าวนี้จะถูกผสานข้อมูลเข้าด้วยกัน", -"Import" => "นำเข้าข้อมูล", -"Close Dialog" => "ปิดกล่องข้อความโต้ตอบ", -"Create a new event" => "สร้างกิจกรรมใหม่", -"View an event" => "ดูกิจกรรม", -"No categories selected" => "ยังไม่ได้เลือกหมวดหมู่", -"of" => "ของ", -"at" => "ที่", -"General" => "ทั่วไป", -"Timezone" => "โซนเวลา", -"Update timezone automatically" => "อัพเดทโซนเวลาอัตโนมัติ", -"Time format" => "รูปแบบเวลา", -"24h" => "24 ช.ม.", -"12h" => "12 ช.ม.", -"Start week on" => "เริ่มต้นสัปดาห์ด้วย", -"Cache" => "หน่วยความจำแคช", -"Clear cache for repeating events" => "ล้างข้อมูลในหน่วยความจำแคชสำหรับกิจกรรมที่ซ้ำซ้อน", -"URLs" => "URLs", -"Calendar CalDAV syncing addresses" => "ที่อยู่ที่ใช้สำหรับเชื่อมข้อมูลปฏิทิน CalDAV", -"more info" => "ข้อมูลเพิ่มเติม", -"Primary address (Kontact et al)" => "ที่อยู่หลัก (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "อ่านเฉพาะลิงก์ iCalendar เท่านั้น", -"Users" => "ผู้ใช้งาน", -"select users" => "เลือกผู้ใช้งาน", -"Editable" => "สามารถแก้ไขได้", -"Groups" => "กลุ่ม", -"select groups" => "เลือกกลุ่ม", -"make public" => "กำหนดเป็นสาธารณะ" -); diff --git a/apps/calendar/l10n/tr.php b/apps/calendar/l10n/tr.php deleted file mode 100644 index b9256eb619..0000000000 --- a/apps/calendar/l10n/tr.php +++ /dev/null @@ -1,192 +0,0 @@ - "Bütün takvimler tamamen ön belleğe alınmadı", -"Everything seems to be completely cached" => "Bütün herşey tamamen ön belleğe alınmış görünüyor", -"No calendars found." => "Takvim yok.", -"No events found." => "Etkinlik yok.", -"Wrong calendar" => "Yanlış takvim", -"The file contained either no events or all events are already saved in your calendar." => "Dosya ya hiçbir etkinlik içermiyor veya bütün etkinlikler takviminizde zaten saklı.", -"events has been saved in the new calendar" => "Etkinlikler yeni takvimde saklandı", -"Import failed" => "İçeri aktarma başarısız oldu.", -"events has been saved in your calendar" => "Etkinlikler takviminizde saklandı", -"New Timezone:" => "Yeni Zamandilimi:", -"Timezone changed" => "Zaman dilimi değiştirildi", -"Invalid request" => "Geçersiz istek", -"Calendar" => "Takvim", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "AAA g[ yyyy]{ '—'[ AAA] g yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Doğum günü", -"Business" => "İş", -"Call" => "Arama", -"Clients" => "Müşteriler", -"Deliverer" => "Teslimatçı", -"Holidays" => "Tatil günleri", -"Ideas" => "Fikirler", -"Journey" => "Seyahat", -"Jubilee" => "Yıl dönümü", -"Meeting" => "Toplantı", -"Other" => "Diğer", -"Personal" => "Kişisel", -"Projects" => "Projeler", -"Questions" => "Sorular", -"Work" => "İş", -"by" => "hazırlayan", -"unnamed" => "isimsiz", -"New Calendar" => "Yeni Takvim", -"Does not repeat" => "Tekrar etmiyor", -"Daily" => "Günlük", -"Weekly" => "Haftalı", -"Every Weekday" => "Haftaiçi Her gün", -"Bi-Weekly" => "İki haftada bir", -"Monthly" => "Aylık", -"Yearly" => "Yıllı", -"never" => "asla", -"by occurrences" => "sıklığa göre", -"by date" => "tarihe göre", -"by monthday" => "ay günlerine göre", -"by weekday" => "hafta günlerine göre", -"Monday" => "Pazartesi", -"Tuesday" => "Salı", -"Wednesday" => "Çarşamba", -"Thursday" => "Perşembe", -"Friday" => "Cuma", -"Saturday" => "Cumartesi", -"Sunday" => "Pazar", -"events week of month" => "ayın etkinlikler haftası", -"first" => "birinci", -"second" => "ikinci", -"third" => "üçüncü", -"fourth" => "dördüncü", -"fifth" => "beşinci", -"last" => "sonuncu", -"January" => "Ocak", -"February" => "Şubat", -"March" => "Mart", -"April" => "Nisan", -"May" => "Mayıs", -"June" => "Haziran", -"July" => "Temmuz", -"August" => "Ağustos", -"September" => "Eylül", -"October" => "Ekim", -"November" => "Kasım", -"December" => "Aralık", -"by events date" => "olay tarihine göre", -"by yearday(s)" => "yıl gün(ler)ine göre", -"by weeknumber(s)" => "hafta sayı(lar)ına göre", -"by day and month" => "gün ve aya göre", -"Date" => "Tarih", -"Cal." => "Takv.", -"Sun." => "Paz.", -"Mon." => "Pzt.", -"Tue." => "Sal.", -"Wed." => "Çar.", -"Thu." => "Per.", -"Fri." => "Cum.", -"Sat." => "Cmt.", -"Jan." => "Oca.", -"Feb." => "Şbt.", -"Mar." => "Mar.", -"Apr." => "Nis", -"May." => "May.", -"Jun." => "Haz.", -"Jul." => "Tem.", -"Aug." => "Agu.", -"Sep." => "Eyl.", -"Oct." => "Eki.", -"Nov." => "Kas.", -"Dec." => "Ara.", -"All day" => "Tüm gün", -"Missing fields" => "Eksik alanlar", -"Title" => "Başlık", -"From Date" => "Bu Tarihten", -"From Time" => "Bu Saatten", -"To Date" => "Bu Tarihe", -"To Time" => "Bu Saate", -"The event ends before it starts" => "Olay başlamadan önce bitiyor", -"There was a database fail" => "Bir veritabanı başarısızlığı oluştu", -"Week" => "Hafta", -"Month" => "Ay", -"List" => "Liste", -"Today" => "Bugün", -"Your calendars" => "Takvimleriniz", -"CalDav Link" => "CalDav Bağlantısı", -"Shared calendars" => "Paylaşılan", -"No shared calendars" => "Paylaşılan takvim yok", -"Share Calendar" => "Takvimi paylaş", -"Download" => "İndir", -"Edit" => "Düzenle", -"Delete" => "Sil", -"shared with you by" => "sizinle paylaşılmış", -"New calendar" => "Yeni takvim", -"Edit calendar" => "Takvimi düzenle", -"Displayname" => "Görünüm adı", -"Active" => "Aktif", -"Calendar color" => "Takvim rengi", -"Save" => "Kaydet", -"Submit" => "Gönder", -"Cancel" => "İptal", -"Edit an event" => "Bir olay düzenle", -"Export" => "Dışa aktar", -"Eventinfo" => "Etkinlik bilgisi", -"Repeating" => "Tekrarlama", -"Alarm" => "Alarm", -"Attendees" => "Katılanlar", -"Share" => "Paylaş", -"Title of the Event" => "Olayın Başlığı", -"Category" => "Kategori", -"Separate categories with commas" => "Kategorileri virgülle ayırın", -"Edit categories" => "Kategorileri düzenle", -"All Day Event" => "Tüm Gün Olay", -"From" => "Kimden", -"To" => "Kime", -"Advanced options" => "Gelişmiş opsiyonlar", -"Location" => "Konum", -"Location of the Event" => "Olayın Konumu", -"Description" => "Açıklama", -"Description of the Event" => "Olayın Açıklaması", -"Repeat" => "Tekrar", -"Advanced" => "Gelişmiş", -"Select weekdays" => "Hafta günlerini seçin", -"Select days" => "Günleri seçin", -"and the events day of year." => "ve yılın etkinlikler günü.", -"and the events day of month." => "ve ayın etkinlikler günü.", -"Select months" => "Ayları seç", -"Select weeks" => "Haftaları seç", -"and the events week of year." => "ve yılın etkinkinlikler haftası.", -"Interval" => "Aralık", -"End" => "Son", -"occurrences" => "olaylar", -"create a new calendar" => "Yeni bir takvim oluştur", -"Import a calendar file" => "Takvim dosyasını içeri aktar", -"Please choose a calendar" => "Lütfen takvim seçiniz", -"Name of new calendar" => "Yeni takvimin adı", -"Take an available name!" => "Müsait ismi al !", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Bu isimde bir takvim zaten mevcut. Yine de devam ederseniz bu takvimler birleştirilecektir.", -"Import" => "İçe Al", -"Close Dialog" => "Diyalogu kapat", -"Create a new event" => "Yeni olay oluştur", -"View an event" => "Bir olay görüntüle", -"No categories selected" => "Kategori seçilmedi", -"of" => "nın", -"at" => "üzerinde", -"Timezone" => "Zaman dilimi", -"24h" => "24s", -"12h" => "12s", -"Cache" => "Önbellek", -"Clear cache for repeating events" => "Tekrar eden etkinlikler için ön belleği temizle.", -"Calendar CalDAV syncing addresses" => "CalDAV takvimi adresleri senkronize ediyor.", -"more info" => "daha fazla bilgi", -"Primary address (Kontact et al)" => "Öncelikli adres", -"iOS/OS X" => "iOS/OS X", -"Read only iCalendar link(s)" => "Sadece okunabilir iCalendar link(ler)i", -"Users" => "Kullanıcılar", -"select users" => "kullanıcıları seç", -"Editable" => "Düzenlenebilir", -"Groups" => "Gruplar", -"select groups" => "grupları seç", -"make public" => "kamuyla paylaş" -); diff --git a/apps/calendar/l10n/uk.php b/apps/calendar/l10n/uk.php deleted file mode 100644 index 2911307e58..0000000000 --- a/apps/calendar/l10n/uk.php +++ /dev/null @@ -1,98 +0,0 @@ - "Новий часовий пояс", -"Timezone changed" => "Часовий пояс змінено", -"Calendar" => "Календар", -"Birthday" => "День народження", -"Business" => "Справи", -"Call" => "Подзвонити", -"Clients" => "Клієнти", -"Holidays" => "Свята", -"Ideas" => "Ідеї", -"Journey" => "Поїздка", -"Jubilee" => "Ювілей", -"Meeting" => "Зустріч", -"Other" => "Інше", -"Personal" => "Особисте", -"Projects" => "Проекти", -"Questions" => "Запитання", -"Work" => "Робота", -"New Calendar" => "новий Календар", -"Does not repeat" => "Не повторювати", -"Daily" => "Щоденно", -"Weekly" => "Щотижня", -"Every Weekday" => "По будням", -"Bi-Weekly" => "Кожні дві неділі", -"Monthly" => "Щомісяця", -"Yearly" => "Щорічно", -"never" => "ніколи", -"Monday" => "Понеділок", -"Tuesday" => "Вівторок", -"Wednesday" => "Середа", -"Thursday" => "Четвер", -"Friday" => "П'ятниця", -"Saturday" => "Субота", -"Sunday" => "Неділя", -"first" => "перший", -"second" => "другий", -"third" => "третій", -"fourth" => "четвертий", -"fifth" => "п'ятий", -"last" => "останній", -"January" => "Січень", -"February" => "Лютий", -"March" => "Березень", -"April" => "Квітень", -"May" => "Травень", -"June" => "Червень", -"July" => "Липень", -"August" => "Серпень", -"September" => "Вересень", -"October" => "Жовтень", -"November" => "Листопад", -"December" => "Грудень", -"Date" => "Дата", -"Cal." => "Кал.", -"All day" => "Увесь день", -"Missing fields" => "Пропущені поля", -"Title" => "Назва", -"From Date" => "Від Дати", -"From Time" => "З Часу", -"To Date" => "До Часу", -"To Time" => "По Дату", -"The event ends before it starts" => "Подія завершається до її початку", -"There was a database fail" => "Сталася помилка бази даних", -"Week" => "Тиждень", -"Month" => "Місяць", -"List" => "Список", -"Today" => "Сьогодні", -"Your calendars" => "Ваші календарі", -"Download" => "Завантажити", -"Edit" => "Редагувати", -"Delete" => "Видалити", -"New calendar" => "Новий календар", -"Edit calendar" => "Редагувати календар", -"Active" => "Активний", -"Calendar color" => "Колір календаря", -"Save" => "Зберегти", -"Cancel" => "Відмінити", -"Export" => "Експорт", -"Title of the Event" => "Назва події", -"Category" => "Категорія", -"From" => "З", -"To" => "По", -"Location" => "Місце", -"Location of the Event" => "Місце події", -"Description" => "Опис", -"Description of the Event" => "Опис події", -"Repeat" => "Повторювати", -"create a new calendar" => "створити новий календар", -"Import a calendar file" => "Імпортувати файл календаря", -"Name of new calendar" => "Назва нового календаря", -"Import" => "Імпорт", -"Create a new event" => "Створити нову подію", -"Timezone" => "Часовий пояс", -"24h" => "24г", -"12h" => "12г", -"Users" => "Користувачі", -"Groups" => "Групи" -); diff --git a/apps/calendar/l10n/vi.php b/apps/calendar/l10n/vi.php deleted file mode 100644 index 3594a095eb..0000000000 --- a/apps/calendar/l10n/vi.php +++ /dev/null @@ -1,131 +0,0 @@ - "Không tìm thấy lịch.", -"No events found." => "Không tìm thấy sự kiện nào", -"Wrong calendar" => "Sai lịch", -"New Timezone:" => "Múi giờ mới :", -"Timezone changed" => "Thay đổi múi giờ", -"Invalid request" => "Yêu cầu không hợp lệ", -"Calendar" => "Lịch", -"ddd" => "ddd", -"ddd M/d" => "ddd M/d", -"dddd M/d" => "dddd M/d", -"MMMM yyyy" => "MMMM yyyy", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", -"Birthday" => "Ngày sinh nhật", -"Business" => "Công việc", -"Call" => "Số điện thoại", -"Clients" => "Máy trạm", -"Holidays" => "Ngày lễ", -"Ideas" => "Ý tưởng", -"Jubilee" => "Lễ kỷ niệm", -"Meeting" => "Hội nghị", -"Other" => "Khác", -"Personal" => "Cá nhân", -"Projects" => "Dự án", -"Questions" => "Câu hỏi", -"Work" => "Công việc", -"New Calendar" => "Lịch mới", -"Does not repeat" => "Không lặp lại", -"Daily" => "Hàng ngày", -"Weekly" => "Hàng tuần", -"Every Weekday" => "Mỗi ngày trong tuần", -"Bi-Weekly" => "Hai tuần một lần", -"Monthly" => "Hàng tháng", -"Yearly" => "Hàng năm", -"never" => "không thay đổi", -"by occurrences" => "bởi xuất hiện", -"by date" => "bởi ngày", -"by monthday" => "bởi ngày trong tháng", -"by weekday" => "bởi ngày trong tuần", -"Monday" => "Thứ 2", -"Tuesday" => "Thứ 3", -"Wednesday" => "Thứ 4", -"Thursday" => "Thứ 5", -"Friday" => "Thứ ", -"Saturday" => "Thứ 7", -"Sunday" => "Chủ nhật", -"events week of month" => "sự kiện trong tuần của tháng", -"first" => "đầu tiên", -"second" => "Thứ hai", -"third" => "Thứ ba", -"fourth" => "Thứ tư", -"fifth" => "Thứ năm", -"January" => "Tháng 1", -"February" => "Tháng 2", -"March" => "Tháng 3", -"April" => "Tháng 4", -"May" => "Tháng 5", -"June" => "Tháng 6", -"July" => "Tháng 7", -"August" => "Tháng 8", -"September" => "Tháng 9", -"October" => "Tháng 10", -"November" => "Tháng 11", -"December" => "Tháng 12", -"by events date" => "Theo ngày tháng sự kiện", -"by weeknumber(s)" => "số tuần", -"by day and month" => "ngày, tháng", -"Date" => "Ngày", -"Cal." => "Cal.", -"All day" => "Tất cả các ngày", -"Title" => "Tiêu đề", -"From Date" => "Từ ngày", -"From Time" => "Từ thời gian", -"To Date" => "Tới ngày", -"To Time" => "Tới thời gian", -"The event ends before it starts" => "Sự kiện này kết thúc trước khi nó bắt đầu", -"Week" => "Tuần", -"Month" => "Tháng", -"List" => "Danh sách", -"Today" => "Hôm nay", -"Your calendars" => "Lịch của bạn", -"CalDav Link" => "Liên kết CalDav ", -"Shared calendars" => "Chia sẻ lịch", -"No shared calendars" => "Không chia sẻ lcihj", -"Share Calendar" => "Chia sẻ lịch", -"Download" => "Tải về", -"Edit" => "Chỉnh sửa", -"Delete" => "Xóa", -"shared with you by" => "Chia sẻ bởi", -"New calendar" => "Lịch mới", -"Edit calendar" => "sửa Lịch", -"Displayname" => "Hiển thị tên", -"Active" => "Kích hoạt", -"Calendar color" => "Màu lịch", -"Save" => "Lưu", -"Submit" => "Submit", -"Cancel" => "Hủy", -"Edit an event" => "Sửa sự kiện", -"Share" => "Chia sẻ", -"Title of the Event" => "Tên sự kiện", -"Category" => "Danh mục", -"All Day Event" => "Sự kiện trong ngày", -"From" => "Từ", -"To" => "Tới", -"Advanced options" => "Tùy chọn nâng cao", -"Location" => "Nơi", -"Location of the Event" => "Nơi tổ chức sự kiện", -"Description" => "Mô tả", -"Description of the Event" => "Mô tả sự kiện", -"Repeat" => "Lặp lại", -"Advanced" => "Nâng cao", -"Select weekdays" => "Chọn ngày trong tuần", -"Select days" => "Chọn ngày", -"and the events day of year." => "và sự kiện của ngày trong năm", -"and the events day of month." => "và sự kiện của một ngày trong năm", -"Select months" => "Chọn tháng", -"Select weeks" => "Chọn tuần", -"and the events week of year." => "và sự kiện của tuần trong năm.", -"create a new calendar" => "Tạo lịch mới", -"Name of new calendar" => "Tên lịch mới", -"Close Dialog" => "Đóng hộp thoại", -"Create a new event" => "Tạo một sự kiện mới", -"View an event" => "Xem một sự kiện", -"No categories selected" => "Không danh sách nào được chọn", -"of" => "của", -"at" => "tại", -"Timezone" => "Múi giờ", -"24h" => "24h", -"12h" => "12h" -); diff --git a/apps/calendar/l10n/xgettextfiles b/apps/calendar/l10n/xgettextfiles deleted file mode 100644 index a8c2601045..0000000000 --- a/apps/calendar/l10n/xgettextfiles +++ /dev/null @@ -1,12 +0,0 @@ -../appinfo/app.php -../lib/object.php -../templates/calendar.php -../templates/part.choosecalendar.php -../templates/part.choosecalendar.rowfields.php -../templates/part.editcalendar.php -../templates/part.editevent.php -../templates/part.eventform.php -../templates/part.import.php -../templates/part.newevent.php -../templates/settings.php -../templates/lAfix.php \ No newline at end of file diff --git a/apps/calendar/l10n/zh_CN.GB2312.php b/apps/calendar/l10n/zh_CN.GB2312.php deleted file mode 100644 index 38f039e661..0000000000 --- a/apps/calendar/l10n/zh_CN.GB2312.php +++ /dev/null @@ -1,121 +0,0 @@ - "错误的日历", -"New Timezone:" => "新时区", -"Timezone changed" => "时区改变了", -"Invalid request" => "非法请求", -"Calendar" => "日历", -"Birthday" => "生日", -"Business" => "商务", -"Call" => "呼叫", -"Clients" => "客户端", -"Deliverer" => "交付者", -"Holidays" => "假期", -"Ideas" => "灵感", -"Journey" => "旅行", -"Jubilee" => "五十年纪念", -"Meeting" => "会面", -"Other" => "其它", -"Personal" => "个人的", -"Projects" => "项目", -"Questions" => "问题", -"Work" => "工作", -"New Calendar" => "新的日历", -"Does not repeat" => "不要重复", -"Daily" => "每天", -"Weekly" => "每星期", -"Every Weekday" => "每个周末", -"Bi-Weekly" => "每两周", -"Monthly" => "每个月", -"Yearly" => "每年", -"never" => "从不", -"by occurrences" => "根据发生时", -"by date" => "根据日期", -"by monthday" => "根据月天", -"by weekday" => "根据星期", -"Monday" => "星期一", -"Tuesday" => "星期二", -"Wednesday" => "星期三", -"Thursday" => "星期四", -"Friday" => "星期五", -"Saturday" => "星期六", -"Sunday" => "星期天", -"events week of month" => "时间每月发生的周数", -"first" => "首先", -"second" => "其次", -"third" => "第三", -"fourth" => "第四", -"fifth" => "第五", -"last" => "最后", -"January" => "一月", -"February" => "二月", -"March" => "三月", -"April" => "四月", -"May" => "五月", -"June" => "六月", -"July" => "七月", -"August" => "八月", -"September" => "九月", -"October" => "十月", -"November" => "十一月", -"December" => "十二月", -"by events date" => "根据时间日期", -"by yearday(s)" => "根据年数", -"by weeknumber(s)" => "根据周数", -"by day and month" => "根据天和月", -"Date" => "日期", -"Cal." => "Cal.", -"All day" => "整天", -"Missing fields" => "丢失的输入框", -"Title" => "标题", -"From Date" => "从日期", -"From Time" => "从时间", -"To Date" => "到日期", -"To Time" => "到时间", -"The event ends before it starts" => "在它开始前需要结束的事件", -"There was a database fail" => "发生了一个数据库失败", -"Week" => "星期", -"Month" => "月", -"List" => "列表", -"Today" => "今天", -"CalDav Link" => "CalDav 链接", -"Download" => "下载", -"Edit" => "编辑", -"Delete" => "删除", -"New calendar" => "新的日历", -"Edit calendar" => "编辑日历", -"Displayname" => "显示名称", -"Active" => "活动", -"Calendar color" => "日历颜色", -"Save" => "保存", -"Submit" => "提交", -"Cancel" => " 取消", -"Edit an event" => "编辑一个事件", -"Export" => "导出", -"Title of the Event" => "事件的标题", -"Category" => "分类", -"All Day Event" => "每天的事件", -"From" => "从", -"To" => "到", -"Advanced options" => "进阶选项", -"Location" => "地点", -"Location of the Event" => "事件的地点", -"Description" => "解释", -"Description of the Event" => "事件描述", -"Repeat" => "重复", -"Advanced" => "进阶", -"Select weekdays" => "选择星期", -"Select days" => "选择日", -"and the events day of year." => "选择每年时间发生天数", -"and the events day of month." => "选择每个月事件发生的天", -"Select months" => "选择月份", -"Select weeks" => "选择星期", -"and the events week of year." => "每年时间发生的星期", -"Interval" => "间隔", -"End" => "结束", -"occurrences" => "发生", -"Import" => "导入", -"Create a new event" => "新建一个时间", -"Timezone" => "时区", -"24h" => "24小时", -"12h" => "12小时" -); diff --git a/apps/calendar/l10n/zh_CN.php b/apps/calendar/l10n/zh_CN.php deleted file mode 100644 index 48d00d02d5..0000000000 --- a/apps/calendar/l10n/zh_CN.php +++ /dev/null @@ -1,152 +0,0 @@ - "无法找到日历。", -"No events found." => "无法找到事件。", -"Wrong calendar" => "错误的日历", -"New Timezone:" => "新时区:", -"Timezone changed" => "时区已修改", -"Invalid request" => "非法请求", -"Calendar" => "日历", -"ddd" => "ddd", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "生日", -"Business" => "商务", -"Call" => "呼叫", -"Clients" => "客户", -"Deliverer" => "派送", -"Holidays" => "节日", -"Ideas" => "想法", -"Journey" => "旅行", -"Jubilee" => "周年纪念", -"Meeting" => "会议", -"Other" => "其他", -"Personal" => "个人", -"Projects" => "项目", -"Questions" => "问题", -"Work" => "工作", -"unnamed" => "未命名", -"New Calendar" => "新日历", -"Does not repeat" => "不重复", -"Daily" => "每天", -"Weekly" => "每周", -"Every Weekday" => "每个工作日", -"Bi-Weekly" => "每两周", -"Monthly" => "每月", -"Yearly" => "每年", -"never" => "从不", -"by occurrences" => "按发生次数", -"by date" => "按日期", -"by monthday" => "按月的某天", -"by weekday" => "按星期的某天", -"Monday" => "星期一", -"Tuesday" => "星期二", -"Wednesday" => "星期三", -"Thursday" => "星期四", -"Friday" => "星期五", -"Saturday" => "星期六", -"Sunday" => "星期日", -"events week of month" => "事件在每月的第几个星期", -"first" => "第一", -"second" => "第二", -"third" => "第三", -"fourth" => "第四", -"fifth" => "第五", -"last" => "最后", -"January" => "一月", -"February" => "二月", -"March" => "三月", -"April" => "四月", -"May" => "五月", -"June" => "六月", -"July" => "七月", -"August" => "八月", -"September" => "九月", -"October" => "十月", -"November" => "十一月", -"December" => "十二月", -"by events date" => "按事件日期", -"by yearday(s)" => "按每年的某天", -"by weeknumber(s)" => "按星期数", -"by day and month" => "按天和月份", -"Date" => "日期", -"Cal." => "日历", -"All day" => "全天", -"Missing fields" => "缺少字段", -"Title" => "标题", -"From Date" => "从", -"From Time" => "从", -"To Date" => "至", -"To Time" => "至", -"The event ends before it starts" => "事件在开始前已结束", -"There was a database fail" => "数据库访问失败", -"Week" => "星期", -"Month" => "月", -"List" => "列表", -"Today" => "今天", -"Your calendars" => "您的日历", -"CalDav Link" => "CalDav 链接", -"Shared calendars" => "共享的日历", -"No shared calendars" => "无共享的日历", -"Share Calendar" => "共享日历", -"Download" => "下载", -"Edit" => "编辑", -"Delete" => "删除", -"shared with you by" => " ", -"New calendar" => "新日历", -"Edit calendar" => "编辑日历", -"Displayname" => "显示名称", -"Active" => "激活", -"Calendar color" => "日历颜色", -"Save" => "保存", -"Submit" => "提交", -"Cancel" => "取消", -"Edit an event" => "编辑事件", -"Export" => "导出", -"Eventinfo" => "事件信息", -"Repeating" => "重复", -"Alarm" => "提醒", -"Attendees" => "参加者", -"Share" => "共享", -"Title of the Event" => "事件标题", -"Category" => "分类", -"Separate categories with commas" => "用逗号分隔分类", -"Edit categories" => "编辑分类", -"All Day Event" => "全天事件", -"From" => "自", -"To" => "至", -"Advanced options" => "高级选项", -"Location" => "地点", -"Location of the Event" => "事件地点", -"Description" => "描述", -"Description of the Event" => "事件描述", -"Repeat" => "重复", -"Advanced" => "高级", -"Select weekdays" => "选择星期中的某天", -"Select days" => "选择某天", -"and the events day of year." => "选择每年事件发生的日子", -"and the events day of month." => "选择每月事件发生的日子", -"Select months" => "选择月份", -"Select weeks" => "选择星期", -"and the events week of year." => "选择每年的事件发生的星期", -"Interval" => "间隔", -"End" => "结束", -"occurrences" => "次", -"create a new calendar" => "创建新日历", -"Import a calendar file" => "导入日历文件", -"Name of new calendar" => "新日历名称", -"Import" => "导入", -"Close Dialog" => "关闭对话框", -"Create a new event" => "创建新事件", -"View an event" => "查看事件", -"No categories selected" => "无选中分类", -"of" => "在", -"at" => "在", -"Timezone" => "时区", -"24h" => "24小时", -"12h" => "12小时", -"Users" => "用户", -"select users" => "选中用户", -"Editable" => "可编辑", -"Groups" => "分组", -"select groups" => "选中分组", -"make public" => "公开" -); diff --git a/apps/calendar/l10n/zh_TW.php b/apps/calendar/l10n/zh_TW.php deleted file mode 100644 index c2c03a4d44..0000000000 --- a/apps/calendar/l10n/zh_TW.php +++ /dev/null @@ -1,151 +0,0 @@ - "沒有找到行事曆", -"No events found." => "沒有找到活動", -"Wrong calendar" => "錯誤日曆", -"New Timezone:" => "新時區:", -"Timezone changed" => "時區已變更", -"Invalid request" => "無效請求", -"Calendar" => "日曆", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "生日", -"Business" => "商業", -"Call" => "呼叫", -"Clients" => "客戶", -"Deliverer" => "遞送者", -"Holidays" => "節日", -"Ideas" => "主意", -"Journey" => "旅行", -"Jubilee" => "周年慶", -"Meeting" => "會議", -"Other" => "其他", -"Personal" => "個人", -"Projects" => "計畫", -"Questions" => "問題", -"Work" => "工作", -"unnamed" => "無名稱的", -"New Calendar" => "新日曆", -"Does not repeat" => "不重覆", -"Daily" => "每日", -"Weekly" => "每週", -"Every Weekday" => "每週末", -"Bi-Weekly" => "每雙週", -"Monthly" => "每月", -"Yearly" => "每年", -"never" => "絕不", -"by occurrences" => "由事件", -"by date" => "由日期", -"by monthday" => "依月份日期", -"by weekday" => "由平日", -"Monday" => "週一", -"Tuesday" => "週二", -"Wednesday" => "週三", -"Thursday" => "週四", -"Friday" => "週五", -"Saturday" => "週六", -"Sunday" => "週日", -"events week of month" => "月份中活動週", -"first" => "第一", -"second" => "第二", -"third" => "第三", -"fourth" => "第四", -"fifth" => "第五", -"last" => "最後", -"January" => "一月", -"February" => "二月", -"March" => "三月", -"April" => "四月", -"May" => "五月", -"June" => "六月", -"July" => "七月", -"August" => "八月", -"September" => "九月", -"October" => "十月", -"November" => "十一月", -"December" => "十二月", -"by events date" => "由事件日期", -"by yearday(s)" => "依年份日期", -"by weeknumber(s)" => "由週數", -"by day and month" => "由日與月", -"Date" => "日期", -"Cal." => "行事曆", -"All day" => "整天", -"Missing fields" => "遺失欄位", -"Title" => "標題", -"From Date" => "自日期", -"From Time" => "至時間", -"To Date" => "至日期", -"To Time" => "至時間", -"The event ends before it starts" => "事件的結束在開始之前", -"There was a database fail" => "資料庫錯誤", -"Week" => "週", -"Month" => "月", -"List" => "清單", -"Today" => "今日", -"Your calendars" => "你的行事曆", -"CalDav Link" => "CalDav 聯結", -"Shared calendars" => "分享的行事曆", -"No shared calendars" => "不分享的行事曆", -"Share Calendar" => "分享行事曆", -"Download" => "下載", -"Edit" => "編輯", -"Delete" => "刪除", -"shared with you by" => "分享給你由", -"New calendar" => "新日曆", -"Edit calendar" => "編輯日曆", -"Displayname" => "顯示名稱", -"Active" => "作用中", -"Calendar color" => "日曆顏色", -"Save" => "儲存", -"Submit" => "提出", -"Cancel" => "取消", -"Edit an event" => "編輯事件", -"Export" => "匯出", -"Eventinfo" => "活動資訊", -"Repeating" => "重覆中", -"Alarm" => "鬧鐘", -"Attendees" => "出席者", -"Share" => "分享", -"Title of the Event" => "事件標題", -"Category" => "分類", -"Separate categories with commas" => "用逗點分隔分類", -"Edit categories" => "編輯分類", -"All Day Event" => "全天事件", -"From" => "自", -"To" => "至", -"Advanced options" => "進階選項", -"Location" => "位置", -"Location of the Event" => "事件位置", -"Description" => "描述", -"Description of the Event" => "事件描述", -"Repeat" => "重覆", -"Advanced" => "進階", -"Select weekdays" => "選擇平日", -"Select days" => "選擇日", -"and the events day of year." => "以及年中的活動日", -"and the events day of month." => "以及月中的活動日", -"Select months" => "選擇月", -"Select weeks" => "選擇週", -"and the events week of year." => "以及年中的活動週", -"Interval" => "間隔", -"End" => "結束", -"occurrences" => "事件", -"create a new calendar" => "建立新日曆", -"Import a calendar file" => "匯入日曆檔案", -"Name of new calendar" => "新日曆名稱", -"Import" => "匯入", -"Close Dialog" => "關閉對話", -"Create a new event" => "建立一個新事件", -"View an event" => "觀看一個活動", -"No categories selected" => "沒有選擇分類", -"of" => "於", -"at" => "於", -"Timezone" => "時區", -"24h" => "24小時制", -"12h" => "12小時制", -"Users" => "使用者", -"select users" => "選擇使用者", -"Editable" => "可編輯", -"Groups" => "群組", -"select groups" => "選擇群組", -"make public" => "公開" -); diff --git a/apps/calendar/lib/alarm.php b/apps/calendar/lib/alarm.php deleted file mode 100644 index a71cc08682..0000000000 --- a/apps/calendar/lib/alarm.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class manages reminders for calendars - */ -class OC_Calendar_Alarm{ - -} \ No newline at end of file diff --git a/apps/calendar/lib/app.php b/apps/calendar/lib/app.php deleted file mode 100644 index 8bdb54f486..0000000000 --- a/apps/calendar/lib/app.php +++ /dev/null @@ -1,436 +0,0 @@ - - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - * - * This class manages our app actions - */ -OC_Calendar_App::$l10n = new OC_L10N('calendar'); -OC_Calendar_App::$tz = OC_Calendar_App::getTimezone(); -class OC_Calendar_App{ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - /** - * @brief language object for calendar app - */ - public static $l10n; - - /** - * @brief categories of the user - */ - protected static $categories = null; - - /** - * @brief timezone of the user - */ - public static $tz; - - /** - * @brief returns informations about a calendar - * @param int $id - id of the calendar - * @param bool $security - check access rights or not - * @param bool $shared - check if the user got access via sharing - * @return mixed - bool / array - */ - public static function getCalendar($id, $security = true, $shared = false){ - if(! is_numeric($id)){ - return false; - } - $calendar = OC_Calendar_Calendar::find($id); - if($shared === true){ - if(OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR)){ - return $calendar; - } - } - if($security === true){ - if($calendar['userid'] != OCP\USER::getUser()){ - return false; - } - } - return $calendar; - } - - /** - * @brief returns informations about an event - * @param int $id - id of the event - * @param bool $security - check access rights or not - * @param bool $shared - check if the user got access via sharing - * @return mixed - bool / array - */ - public static function getEventObject($id, $security = true, $shared = false){ - $event = OC_Calendar_Object::find($id); - if($shared === true){ - if(OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT)){ - return $event; - } - } - if($security === true){ - $calendar = self::getCalendar($event['calendarid'], false); - if($calendar['userid'] != OCP\USER::getUser()){ - return false; - } - } - if($event === false){ - return false; - } - return $event; - } - - /** - * @brief returns the parsed calendar data - * @param int $id - id of the event - * @param bool $security - check access rights or not - * @return mixed - bool / object - */ - public static function getVCalendar($id, $security = true, $shared = false){ - $event_object = self::getEventObject($id, $security, $shared); - if($event_object === false){ - return false; - } - $vobject = OC_VObject::parse($event_object['calendardata']); - if(is_null($vobject)){ - return false; - } - return $vobject; - } - - /** - * @brief checks if an event was edited and dies if it was - * @param (object) $vevent - vevent object of the event - * @param (int) $lastmodified - time of last modification as unix timestamp - * @return (bool) - */ - public static function isNotModified($vevent, $lastmodified){ - $last_modified = $vevent->__get('LAST-MODIFIED'); - if($last_modified && $lastmodified != $last_modified->getDateTime()->format('U')){ - OCP\JSON::error(array('modified'=>true)); - exit; - } - return true; - } - - /** - * @brief returns the default categories of ownCloud - * @return (array) $categories - */ - protected static function getDefaultCategories(){ - return array( - self::$l10n->t('Birthday'), - self::$l10n->t('Business'), - self::$l10n->t('Call'), - self::$l10n->t('Clients'), - self::$l10n->t('Deliverer'), - self::$l10n->t('Holidays'), - self::$l10n->t('Ideas'), - self::$l10n->t('Journey'), - self::$l10n->t('Jubilee'), - self::$l10n->t('Meeting'), - self::$l10n->t('Other'), - self::$l10n->t('Personal'), - self::$l10n->t('Projects'), - self::$l10n->t('Questions'), - self::$l10n->t('Work'), - ); - } - - /** - * @brief returns the vcategories object of the user - * @return (object) $vcategories - */ - protected static function getVCategories() { - if (is_null(self::$categories)) { - self::$categories = new OC_VCategories('calendar', null, self::getDefaultCategories()); - } - return self::$categories; - } - - /** - * @brief returns the categories of the vcategories object - * @return (array) $categories - */ - public static function getCategoryOptions(){ - $categories = self::getVCategories()->categories(); - return $categories; - } - - /** - * scan events for categories. - * @param $events VEVENTs to scan. null to check all events for the current user. - */ - public static function scanCategories($events = null) { - if (is_null($events)) { - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); - if(count($calendars) > 0) { - $events = array(); - foreach($calendars as $calendar) { - $calendar_events = OC_Calendar_Object::all($calendar['id']); - $events = $events + $calendar_events; - } - } - } - if(is_array($events) && count($events) > 0) { - $vcategories = self::getVCategories(); - $vcategories->delete($vcategories->categories()); - foreach($events as $event) { - $vobject = OC_VObject::parse($event['calendardata']); - if(!is_null($vobject)) { - self::loadCategoriesFromVCalendar($vobject); - } - } - } - } - - /** - * check VEvent for new categories. - * @see OC_VCategories::loadFromVObject - */ - public static function loadCategoriesFromVCalendar(OC_VObject $calendar) { - $object = null; - if (isset($calendar->VEVENT)) { - $object = $calendar->VEVENT; - } else - if (isset($calendar->VTODO)) { - $object = $calendar->VTODO; - } else - if (isset($calendar->VJOURNAL)) { - $object = $calendar->VJOURNAL; - } - if ($object) { - self::getVCategories()->loadFromVObject($object, true); - } - } - - /** - * @brief returns the options for the repeat rule of an repeating event - * @return array - valid inputs for the repeat rule of an repeating event - */ - public static function getRepeatOptions(){ - return OC_Calendar_Object::getRepeatOptions(self::$l10n); - } - - /** - * @brief returns the options for the end of an repeating event - * @return array - valid inputs for the end of an repeating events - */ - public static function getEndOptions(){ - return OC_Calendar_Object::getEndOptions(self::$l10n); - } - - /** - * @brief returns the options for an monthly repeating event - * @return array - valid inputs for monthly repeating events - */ - public static function getMonthOptions(){ - return OC_Calendar_Object::getMonthOptions(self::$l10n); - } - - /** - * @brief returns the options for an weekly repeating event - * @return array - valid inputs for weekly repeating events - */ - public static function getWeeklyOptions(){ - return OC_Calendar_Object::getWeeklyOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event - * @return array - valid inputs for yearly repeating events - */ - public static function getYearOptions(){ - return OC_Calendar_Object::getYearOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific days of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByYearDayOptions(){ - return OC_Calendar_Object::getByYearDayOptions(); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific month of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByMonthOptions(){ - return OC_Calendar_Object::getByMonthOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific week numbers of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByWeekNoOptions(){ - return OC_Calendar_Object::getByWeekNoOptions(); - } - - /** - * @brief returns the options for an yearly or monthly repeating event which occurs on specific days of the month - * @return array - valid inputs for yearly or monthly repeating events - */ - public static function getByMonthDayOptions(){ - return OC_Calendar_Object::getByMonthDayOptions(); - } - - /** - * @brief returns the options for an monthly repeating event which occurs on specific weeks of the month - * @return array - valid inputs for monthly repeating events - */ - public static function getWeekofMonth(){ - return OC_Calendar_Object::getWeekofMonth(self::$l10n); - } - - /** - * @return (string) $timezone as set by user or the default timezone - */ - public static function getTimezone() { - return OCP\Config::getUserValue(OCP\User::getUser(), - 'calendar', - 'timezone', - date_default_timezone_get()); - } - - /** - * @brief checks the access for a calendar / an event - * @param (int) $id - id of the calendar / event - * @param (string) $type - type of the id (calendar/event) - * @return (string) $access - level of access - */ - public static function getaccess($id, $type){ - if($type == self::CALENDAR){ - $calendar = self::getCalendar($id, false, false); - if($calendar['userid'] == OCP\USER::getUser()){ - return 'owner'; - } - $isshared = OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR); - if($isshared){ - $writeaccess = OC_Calendar_Share::is_editing_allowed(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR); - if($writeaccess){ - return 'rw'; - }else{ - return 'r'; - } - }else{ - return false; - } - }elseif($type == self::EVENT){ - if(OC_Calendar_Object::getowner($id) == OCP\USER::getUser()){ - return 'owner'; - } - $isshared = OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT); - if($isshared){ - $writeaccess = OC_Calendar_Share::is_editing_allowed(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT); - if($writeaccess){ - return 'rw'; - }else{ - return 'r'; - } - }else{ - return false; - } - } - } - - /** - * @brief analyses the parameter for calendar parameter and returns the objects - * @param (string) $calendarid - calendarid - * @param (int) $start - unixtimestamp of start - * @param (int) $end - unixtimestamp of end - * @return (array) $events - */ - public static function getrequestedEvents($calendarid, $start, $end){ - $events = array(); - if($calendarid == 'shared_rw' || $calendarid == 'shared_r'){ - $calendars = OC_Calendar_Share::allSharedwithuser(OCP\USER::getUser(), OC_Calendar_Share::CALENDAR, 1, ($_GET['calendar_id'] == 'shared_rw')?'rw':'r'); - foreach($calendars as $calendar){ - $calendarevents = OC_Calendar_Object::allInPeriod($calendar['calendarid'], $start, $end); - foreach($calendarevents as $event){ - $event['summary'] .= ' (' . self::$l10n->t('by') . ' ' . OC_Calendar_Object::getowner($event['id']) . ')'; - } - $events = array_merge($events, $calendarevents); - } - $singleevents = OC_Calendar_Share::allSharedwithuser(OCP\USER::getUser(), OC_Calendar_Share::EVENT, 1, ($_GET['calendar_id'] == 'shared_rw')?'rw':'r'); - foreach($singleevents as $singleevent){ - $event = OC_Calendar_Object::find($singleevent['eventid']); - if(!array_key_exists('summary', $event)){ - $event['summary'] = self::$l10n->t('unnamed'); - } - $event['summary'] .= ' (' . self::$l10n->t('by') . ' ' . OC_Calendar_Object::getowner($event['id']) . ')'; - $events[] = $event; - } - }else{ - if (is_numeric($calendarid)) { - $calendar = self::getCalendar($calendarid); - OCP\Response::enableCaching(0); - OCP\Response::setETagHeader($calendar['ctag']); - $events = OC_Calendar_Object::allInPeriod($calendarid, $start, $end); - } else { - OCP\Util::emitHook('OC_Calendar', 'getEvents', array('calendar_id' => $calendarid, 'events' => &$events)); - } - } - return $events; - } - - /** - * @brief generates the output for an event which will be readable for our js - * @param (mixed) $event - event object / array - * @param (int) $start - DateTime object of start - * @param (int) $end - DateTime object of end - * @return (array) $output - readable output - */ - public static function generateEventOutput($event, $start, $end){ - if(!isset($event['calendardata']) && !isset($event['vevent'])){ - return false; - } - if(!isset($event['calendardata']) && isset($event['vevent'])){ - $event['calendardata'] = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud's Internal iCal System\n" . $event['vevent']->serialize() . "END:VCALENDAR"; - } - $object = OC_VObject::parse($event['calendardata']); - $vevent = $object->VEVENT; - $return = array(); - $id = $event['id']; - $allday = ($vevent->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE)?true:false; - $last_modified = @$vevent->__get('LAST-MODIFIED'); - $lastmodified = ($last_modified)?$last_modified->getDateTime()->format('U'):0; - $staticoutput = array('id'=>(int)$event['id'], - 'title' => ($event['summary']!=NULL || $event['summary'] != '')?$event['summary']: self::$l10n->t('unnamed'), - 'description' => isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:'', - 'lastmodified'=>$lastmodified, - 'allDay'=>$allday); - if(OC_Calendar_Object::isrepeating($id) && OC_Calendar_Repeat::is_cached_inperiod($event['id'], $start, $end)){ - $cachedinperiod = OC_Calendar_Repeat::get_inperiod($id, $start, $end); - foreach($cachedinperiod as $cachedevent){ - $dynamicoutput = array(); - if($allday){ - $start_dt = new DateTime($cachedevent['startdate'], new DateTimeZone('UTC')); - $end_dt = new DateTime($cachedevent['enddate'], new DateTimeZone('UTC')); - $dynamicoutput['start'] = $start_dt->format('Y-m-d'); - $dynamicoutput['end'] = $end_dt->format('Y-m-d'); - }else{ - $start_dt = new DateTime($cachedevent['startdate'], new DateTimeZone('UTC')); - $end_dt = new DateTime($cachedevent['enddate'], new DateTimeZone('UTC')); - $start_dt->setTimezone(new DateTimeZone(self::$tz)); - $end_dt->setTimezone(new DateTimeZone(self::$tz)); - $dynamicoutput['start'] = $start_dt->format('Y-m-d H:i:s'); - $dynamicoutput['end'] = $end_dt->format('Y-m-d H:i:s'); - } - $return[] = array_merge($staticoutput, $dynamicoutput); - } - }else{ - if(OC_Calendar_Object::isrepeating($id) || $event['repeating'] == 1){ - $object->expand($start, $end); - } - foreach($object->getComponents() as $singleevent){ - if(!($singleevent instanceof Sabre_VObject_Component_VEvent)){ - continue; - } - $dynamicoutput = OC_Calendar_Object::generateStartEndDate($singleevent->DTSTART, OC_Calendar_Object::getDTEndFromVEvent($singleevent), $allday, self::$tz); - $return[] = array_merge($staticoutput, $dynamicoutput); - } - } - return $return; - } -} diff --git a/apps/calendar/lib/attendees.php b/apps/calendar/lib/attendees.php deleted file mode 100644 index ac30e11b3b..0000000000 --- a/apps/calendar/lib/attendees.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class manages Attendees for calendars - */ -class OC_Calendar_Attendees{ - -} \ No newline at end of file diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php deleted file mode 100644 index f8f5aab363..0000000000 --- a/apps/calendar/lib/calendar.php +++ /dev/null @@ -1,308 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE calendar_calendars ( - * id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * userid VARCHAR(255), - * displayname VARCHAR(100), - * uri VARCHAR(100), - * active INTEGER UNSIGNED NOT NULL DEFAULT '0', - * ctag INTEGER UNSIGNED NOT NULL DEFAULT '0', - * calendarorder INTEGER UNSIGNED NOT NULL DEFAULT '0', - * calendarcolor VARCHAR(10), - * timezone TEXT, - * components VARCHAR(20) - * ); - * - */ - -/** - * This class manages our calendars - */ -class OC_Calendar_Calendar{ - /** - * @brief Returns the list of calendars for a specific user. - * @param string $uid User ID - * @param boolean $active Only return calendars with this $active state, default(=false) is don't care - * @return array - */ - public static function allCalendars($uid, $active=false){ - $values = array($uid); - $active_where = ''; - if (!is_null($active) && $active){ - $active_where = ' AND `active` = ?'; - $values[] = $active; - } - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_calendars` WHERE `userid` = ?' . $active_where ); - $result = $stmt->execute($values); - - $calendars = array(); - while( $row = $result->fetchRow()){ - $calendars[] = $row; - } - - return $calendars; - } - - /** - * @brief Returns the list of calendars for a principal (DAV term of user) - * @param string $principaluri - * @return array - */ - public static function allCalendarsWherePrincipalURIIs($principaluri){ - $uid = self::extractUserID($principaluri); - return self::allCalendars($uid); - } - - /** - * @brief Gets the data of one calendar - * @param integer $id - * @return associative array - */ - public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_calendars` WHERE `id` = ?' ); - $result = $stmt->execute(array($id)); - - return $result->fetchRow(); - } - - /** - * @brief Creates a new calendar - * @param string $userid - * @param string $name - * @param string $components Default: "VEVENT,VTODO,VJOURNAL" - * @param string $timezone Default: null - * @param integer $order Default: 1 - * @param string $color Default: null, format: '#RRGGBB(AA)' - * @return insertid - */ - public static function addCalendar($userid,$name,$components='VEVENT,VTODO,VJOURNAL',$timezone=null,$order=0,$color=null){ - $all = self::allCalendars($userid); - $uris = array(); - foreach($all as $i){ - $uris[] = $i['uri']; - } - - $uri = self::createURI($name, $uris ); - - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); - - $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); - OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid); - - return $insertid; - } - - /** - * @brief Creates a new calendar from the data sabredav provides - * @param string $principaluri - * @param string $uri - * @param string $name - * @param string $components - * @param string $timezone - * @param integer $order - * @param string $color format: '#RRGGBB(AA)' - * @return insertid - */ - public static function addCalendarFromDAVData($principaluri,$uri,$name,$components,$timezone,$order,$color){ - $userid = self::extractUserID($principaluri); - - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); - - $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); - OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid); - - return $insertid; - } - - /** - * @brief Edits a calendar - * @param integer $id - * @param string $name Default: null - * @param string $components Default: null - * @param string $timezone Default: null - * @param integer $order Default: null - * @param string $color Default: null, format: '#RRGGBB(AA)' - * @return boolean - * - * Values not null will be set - */ - public static function editCalendar($id,$name=null,$components=null,$timezone=null,$order=null,$color=null){ - // Need these ones for checking uri - $calendar = self::find($id); - - // Keep old stuff - if(is_null($name)) $name = $calendar['displayname']; - if(is_null($components)) $components = $calendar['components']; - if(is_null($timezone)) $timezone = $calendar['timezone']; - if(is_null($order)) $order = $calendar['calendarorder']; - if(is_null($color)) $color = $calendar['calendarcolor']; - - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `displayname`=?,`calendarorder`=?,`calendarcolor`=?,`timezone`=?,`components`=?,`ctag`=`ctag`+1 WHERE `id`=?' ); - $result = $stmt->execute(array($name,$order,$color,$timezone,$components,$id)); - - OCP\Util::emitHook('OC_Calendar', 'editCalendar', $id); - return true; - } - - /** - * @brief Sets a calendar (in)active - * @param integer $id - * @param boolean $active - * @return boolean - */ - public static function setCalendarActive($id,$active){ - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `active` = ? WHERE `id` = ?' ); - $stmt->execute(array($active, $id)); - - return true; - } - - /** - * @brief Updates ctag for calendar - * @param integer $id - * @return boolean - */ - public static function touchCalendar($id){ - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `ctag` = `ctag` + 1 WHERE `id` = ?' ); - $stmt->execute(array($id)); - - return true; - } - - /** - * @brief removes a calendar - * @param integer $id - * @return boolean - */ - public static function deleteCalendar($id){ - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_calendars` WHERE `id` = ?' ); - $stmt->execute(array($id)); - - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' ); - $stmt->execute(array($id)); - - OCP\Util::emitHook('OC_Calendar', 'deleteCalendar', $id); - if(count(self::allCalendars(OCP\USER::getUser())) == 0) { - self::addCalendar(OCP\USER::getUser(),'Default calendar'); - } - - return true; - } - - /** - * @brief merges two calendars - * @param integer $id1 - * @param integer $id2 - * @return boolean - */ - public static function mergeCalendar($id1, $id2){ - $stmt = OCP\DB::prepare('UPDATE `*PREFIX*calendar_objects` SET `calendarid` = ? WHERE `calendarid` = ?'); - $stmt->execute(array($id1, $id2)); - self::touchCalendar($id1); - self::deleteCalendar($id2); - } - - /** - * @brief Creates a URI for Calendar - * @param string $name name of the calendar - * @param array $existing existing calendar URIs - * @return string uri - */ - public static function createURI($name,$existing){ - $name = strtolower($name); - $newname = $name; - $i = 1; - while(in_array($newname,$existing)){ - $newname = $name.$i; - $i = $i + 1; - } - return $newname; - } - - /** - * @brief gets the userid from a principal path - * @return string - */ - public static function extractUserID($principaluri){ - list($prefix,$userid) = Sabre_DAV_URLUtil::splitPath($principaluri); - return $userid; - } - - /** - * @brief returns the possible color for calendars - * @return array - */ - public static function getCalendarColorOptions(){ - return array( - '#ff0000', // "Red" - '#b3dc6c', // "Green" - '#ffff00', // "Yellow" - '#808000', // "Olive" - '#ffa500', // "Orange" - '#ff7f50', // "Coral" - '#ee82ee', // "Violet" - '#9fc6e7', // "light blue" - ); - } - - /** - * @brief generates the Event Source Info for our JS - * @param array $calendar calendar data - * @return array - */ - public static function getEventSourceInfo($calendar){ - return array( - 'url' => OCP\Util::linkTo('calendar', 'ajax/events.php').'?calendar_id='.$calendar['id'], - 'backgroundColor' => $calendar['calendarcolor'], - 'borderColor' => '#888', - 'textColor' => self::generateTextColor($calendar['calendarcolor']), - 'cache' => true, - ); - } - - /* - * @brief checks if a calendar name is available for a user - * @param string $calendarname - * @param string $userid - * @return boolean - */ - public static function isCalendarNameavailable($calendarname, $userid){ - $calendars = self::allCalendars($userid); - foreach($calendars as $calendar){ - if($calendar['displayname'] == $calendarname){ - return false; - } - } - return true; - } - - /* - * @brief generates the text color for the calendar - * @param string $calendarcolor rgb calendar color code in hex format (with or without the leading #) - * (this function doesn't pay attention on the alpha value of rgba color codes) - * @return boolean - */ - public static function generateTextColor($calendarcolor){ - if(substr_count($calendarcolor, '#') == 1){ - $calendarcolor = substr($calendarcolor,1); - } - $red = hexdec(substr($calendarcolor,0,2)); - $green = hexdec(substr($calendarcolor,2,2)); - $blue = hexdec(substr($calendarcolor,2,2)); - //recommendation by W3C - $computation = ((($red * 299) + ($green * 587) + ($blue * 114)) / 1000); - return ($computation > 130)?'#000000':'#FAFAFA'; - } -} diff --git a/apps/calendar/lib/export.php b/apps/calendar/lib/export.php deleted file mode 100644 index 8f26891f36..0000000000 --- a/apps/calendar/lib/export.php +++ /dev/null @@ -1,94 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class does export and converts all times to UTC - */ -class OC_Calendar_Export{ - /** - * @brief Use one of these constants as second parameter if you call OC_Calendar_Export::export() - */ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - - /** - * @brief export a calendar or an event - * @param integer $id id of calendar / event - * @param string $type use OC_Calendar_Export constants - * @return string - */ - public static function export($id, $type){ - if($type == self::EVENT){ - $return = self::event($id); - }else{ - $return = self::calendar($id); - } - return self::fixLineBreaks($return); - } - - /** - * @brief exports a calendar and convert all times to UTC - * @param integer $id id of the calendar - * @return string - */ - private static function calendar($id){ - $events = OC_Calendar_Object::all($id); - $calendar = OC_Calendar_Calendar::find($id); - $return = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\nX-WR-CALNAME:" . $calendar['displayname'] . "\n"; - foreach($events as $event){ - $return .= self::generateEvent($event); - } - $return .= "END:VCALENDAR"; - return $return; - } - - /** - * @brief exports an event and convert all times to UTC - * @param integer $id id of the event - * @return string - */ - private static function event($id){ - $event = OC_Calendar_Object::find($id); - $return = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\nX-WR-CALNAME:" . $event['summary'] . "\n"; - $return .= self::generateEvent($event); - $return .= "END:VCALENDAR"; - return $return; - } - - /** - * @brief generates the VEVENT with UTC dates - * @param array $event - * @return string - */ - private static function generateEvent($event){ - $object = OC_VObject::parse($event['calendardata']); - $dtstart = $object->VEVENT->DTSTART; - $start_dt = $dtstart->getDateTime(); - $dtend = OC_Calendar_Object::getDTEndFromVEvent($object->VEVENT); - $end_dt = $dtend->getDateTime(); - if($dtstart->getDateType() !== Sabre_VObject_Element_DateTime::DATE){ - $start_dt->setTimezone(new DateTimeZone('UTC')); - $end_dt->setTimezone(new DateTimeZone('UTC')); - $object->VEVENT->setDateTime('DTSTART', $start_dt, Sabre_VObject_Property_DateTime::UTC); - $object->VEVENT->setDateTime('DTEND', $end_dt, Sabre_VObject_Property_DateTime::UTC); - } - return $object->VEVENT->serialize(); - } - - /** - * @brief fixes new line breaks - * (fixes problems with Apple iCal) - * @param string $string to fix - * @return string - */ - private static function fixLineBreaks($string){ - $string = str_replace("\r\n", "\n", $string); - $string = str_replace("\r", "\n", $string); - $string = str_replace("\n", "\r\n", $string); - return $string; - } -} diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php deleted file mode 100644 index bc0b02c62b..0000000000 --- a/apps/calendar/lib/hooks.php +++ /dev/null @@ -1,40 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -/** - * This class contains all hooks. - */ -class OC_Calendar_Hooks{ - /** - * @brief Creates default calendar for a user - * @param paramters parameters from postCreateUser-Hook - * @return array - */ - public static function createUser($parameters) { - OC_Calendar_Calendar::addCalendar($parameters['uid'],'Default calendar'); - - return true; - } - - /** - * @brief Deletes all calendars of a certain user - * @param paramters parameters from postDeleteUser-Hook - * @return array - */ - public static function deleteUser($parameters) { - $calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']); - - foreach($calendars as $calendar) { - OC_Calendar_Calendar::deleteCalendar($calendar['id']); - } - - OC_Calendar_Share::post_userdelete($parameters['uid']); - - return true; - } -} diff --git a/apps/calendar/lib/import.php b/apps/calendar/lib/import.php deleted file mode 100644 index 2e3a729e0c..0000000000 --- a/apps/calendar/lib/import.php +++ /dev/null @@ -1,336 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class does import and converts all times to the users current timezone - */ -class OC_Calendar_Import{ - /* - * @brief counts the absolute number of parsed elements - */ - private $abscount; - - /* - * @brief var saves if the percentage should be saved with OC_Cache - */ - private $cacheprogress; - - /* - * @brief Sabre_VObject_Component_VCalendar object - for documentation see http://code.google.com/p/sabredav/wiki/Sabre_VObject_Component_VCalendar - */ - private $calobject; - - /* - * @brief var counts the number of imported elements - */ - private $count; - - /* - * @brief var to check if errors happend while initialization - */ - private $error; - - /* - * @brief var saves the ical string that was submitted with the __construct function - */ - private $ical; - - /* - * @brief calendar id for import - */ - private $id; - - /* - * @brief var saves the percentage of the import's progress - */ - private $progress; - - /* - * @brief var saves the key for the percentage of the import's progress - */ - private $progresskey; - - /* - * @brief var saves the timezone the events shell converted to - */ - private $tz; - - /* - * @brief var saves the userid - */ - private $userid; - - /* - * public methods - */ - - /* - * @brief does general initialization for import object - * @param string $calendar content of ical file - * @param string $tz timezone of the user - * @return boolean - */ - public function __construct($ical){ - $this->error = null; - $this->ical = $ical; - $this->abscount = 0; - $this->count = 0; - try{ - $this->calobject = OC_VObject::parse($this->ical); - }catch(Exception $e){ - //MISSING: write some log - $this->error = true; - return false; - } - return true; - } - - /* - * @brief imports a calendar - * @return boolean - */ - public function import(){ - if(!$this->isValid()){ - return false; - } - $numofcomponents = count($this->calobject->getComponents()); - foreach($this->calobject->getComponents() as $object){ - if(!($object instanceof Sabre_VObject_Component_VEvent) && !($object instanceof Sabre_VObject_Component_VJournal) && !($object instanceof Sabre_VObject_Component_VTodo)){ - continue; - } - $dtend = OC_Calendar_Object::getDTEndFromVEvent($object); - $object->DTSTART->getDateTime()->setTimezone(new DateTimeZone($this->tz)); - $object->DTEND->setDateTime($dtend->getDateTime(), $object->DTSTART->getDateType()); - $object->DTEND->getDateTime()->setTimezone(new DateTimeZone($this->tz)); - $vcalendar = $this->createVCalendar($object->serialize()); - $insertid = OC_Calendar_Object::add($this->id, $vcalendar); - $this->abscount++; - if($this->isDuplicate($insertid)){ - OC_Calendar_Object::delete($insertid); - }else{ - $this->count++; - } - $this->updateProgress(intval(($this->abscount / $numofcomponents)*100)); - } - OC_Cache::remove($this->progresskey); - return true; - } - - /* - * @brief sets the timezone - * @return boolean - */ - public function setTimeZone($tz){ - $this->tz = $tz; - return true; - } - - /* - * @brief sets the progresskey - * @return boolean - */ - public function setProgresskey($progresskey){ - $this->progresskey = $progresskey; - return true; - } - - /* - * @brief checks if something went wrong while initialization - * @return boolean - */ - public function isValid(){ - if(is_null($this->error)){ - return true; - } - return false; - } - - /* - * @brief returns the percentage of progress - * @return integer - */ - public function getProgress(){ - return $this->progress; - } - - /* - * @brief enables the cache for the percentage of progress - * @return boolean - */ - public function enableProgressCache(){ - $this->cacheprogress = true; - return true; - } - - /* - * @brief disables the cache for the percentage of progress - * @return boolean - */ - public function disableProgressCache(){ - $this->cacheprogress = false; - return false; - } - - /* - * @brief generates a new calendar name - * @return string - */ - public function createCalendarName(){ - $calendars = OC_Calendar_Calendar::allCalendars($this->userid); - $calendarname = $guessedcalendarname = !is_null($this->guessCalendarName())?($this->guessCalendarName()):(OC_Calendar_App::$l10n->t('New Calendar')); - $i = 1; - while(!OC_Calendar_Calendar::isCalendarNameavailable($calendarname, $this->userid)){ - $calendarname = $guessedcalendarname . ' (' . $i . ')'; - $i++; - } - return $calendarname; - } - - /* - * @brief generates a new calendar color - * @return string - */ - public function createCalendarColor(){ - if(is_null($this->guessCalendarColor())){ - return '#9fc6e7'; - } - return $this->guessCalendarColor(); - } - - /* - * @brief sets the id for the calendar - * @param integer $id of the calendar - * @return boolean - */ - public function setCalendarID($id){ - $this->id = $id; - return true; - } - - /* - * @brief sets the userid to import the calendar - * @param string $id of the user - * @return boolean - */ - public function setUserID($userid){ - $this->userid = $userid; - return true; - } - - /* - * @brief returns the private - * @param string $id of the user - * @return boolean - */ - public function getCount(){ - return $this->count; - } - - /* - * private methods - */ - - /* - * @brief generates an unique ID - * @return string - */ - //private function createUID(){ - // return substr(md5(rand().time()),0,10); - //} - - /* - * @brief checks is the UID is already in use for another event - * @param string $uid uid to check - * @return boolean - */ - //private function isUIDAvailable($uid){ - // - //} - - /* - * @brief generates a proper VCalendar string - * @param string $vobject - * @return string - */ - private function createVCalendar($vobject){ - if(is_object($vobject)){ - $vobject = @$vobject->serialize(); - } - $vcalendar = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\n"; - $vcalendar .= $vobject; - $vcalendar .= "END:VCALENDAR"; - return $vcalendar; - } - - /* - * @brief checks if an event already exists in the user's calendars - * @param integer $insertid id of the new object - * @return boolean - */ - private function isDuplicate($insertid){ - $newobject = OC_Calendar_Object::find($insertid); - $stmt = OCP\DB::prepare('SELECT COUNT(*) AS `count` FROM `*PREFIX*calendar_objects` - INNER JOIN `*PREFIX*calendar_calendars` ON `calendarid`=`*PREFIX*calendar_calendars`.`id` - WHERE `objecttype`=? AND `startdate`=? AND `enddate`=? AND `repeating`=? AND `summary`=? AND `calendardata`=? AND `userid` = ?'); - $result = $stmt->execute(array($newobject['objecttype'],$newobject['startdate'],$newobject['enddate'],$newobject['repeating'],$newobject['summary'],$newobject['calendardata'], $this->userid)); - $result = $result->fetchRow(); - if($result['count'] >= 2){ - return true; - } - return false; - } - - /* - * @brief updates the progress var - * @param integer $percentage - * @return boolean - */ - private function updateProgress($percentage){ - $this->progress = $percentage; - if($this->cacheprogress){ - OC_Cache::set($this->progresskey, $this->progress, 300); - } - return true; - } - - /* - * public methods for (pre)rendering of X-... Attributes - */ - - /* - * @brief guesses the calendar color - * @return mixed - string or boolean - */ - public function guessCalendarColor(){ - if(!is_null($this->calobject->__get('X-APPLE-CALENDAR-COLOR'))){ - return $this->calobject->__get('X-APPLE-CALENDAR-COLOR'); - } - return null; - } - - /* - * @brief guesses the calendar description - * @return mixed - string or boolean - */ - public function guessCalendarDescription(){ - if(!is_null($this->calobject->__get('X-WR-CALDESC'))){ - return $this->calobject->__get('X-WR-CALDESC'); - } - return null; - } - - /* - * @brief guesses the calendar name - * @return mixed - string or boolean - */ - public function guessCalendarName(){ - if(!is_null($this->calobject->__get('X-WR-CALNAME'))){ - return $this->calobject->__get('X-WR-CALNAME'); - } - return null; - } -} diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php deleted file mode 100644 index 8020d7c2e5..0000000000 --- a/apps/calendar/lib/object.php +++ /dev/null @@ -1,937 +0,0 @@ - - * Copyright (c) 2012 Bart Visscher - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - /** - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE calendar_objects ( - * id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * calendarid INTEGER UNSIGNED NOT NULL, - * objecttype VARCHAR(40) NOT NULL, - * startdate DATETIME, - * enddate DATETIME, - * repeating INT(1), - * summary VARCHAR(255), - * calendardata TEXT, - * uri VARCHAR(100), - * lastmodified INT(11) - * ); - * - */ - -/** - * This class manages our calendar objects - */ -class OC_Calendar_Object{ - /** - * @brief Returns all objects of a calendar - * @param integer $id - * @return array - * - * The objects are associative arrays. You'll find the original vObject in - * ['calendardata'] - */ - public static function all($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' ); - $result = $stmt->execute(array($id)); - - $calendarobjects = array(); - while( $row = $result->fetchRow()){ - $calendarobjects[] = $row; - } - - return $calendarobjects; - } - - /** - * @brief Returns all objects of a calendar between $start and $end - * @param integer $id - * @param DateTime $start - * @param DateTime $end - * @return array - * - * The objects are associative arrays. You'll find the original vObject - * in ['calendardata'] - */ - public static function allInPeriod($id, $start, $end){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' - .' AND ((`startdate` >= ? AND `startdate` <= ? AND `repeating` = 0)' - .' OR (`enddate` >= ? AND `enddate` <= ? AND `repeating` = 0)' - .' OR (`startdate` <= ? AND `repeating` = 1))' ); - $start = self::getUTCforMDB($start); - $end = self::getUTCforMDB($end); - $result = $stmt->execute(array($id, - $start, $end, - $start, $end, - $end)); - - $calendarobjects = array(); - while( $row = $result->fetchRow()){ - $calendarobjects[] = $row; - } - - return $calendarobjects; - } - - /** - * @brief Returns an object - * @param integer $id - * @return associative array - */ - public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `id` = ?' ); - $result = $stmt->execute(array($id)); - - return $result->fetchRow(); - } - - /** - * @brief finds an object by its DAV Data - * @param integer $cid Calendar id - * @param string $uri the uri ('filename') - * @return associative array - */ - public static function findWhereDAVDataIs($cid,$uri){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ? AND `uri` = ?' ); - $result = $stmt->execute(array($cid,$uri)); - - return $result->fetchRow(); - } - - /** - * @brief Adds an object - * @param integer $id Calendar id - * @param string $data object - * @return insertid - */ - public static function add($id,$data){ - $object = OC_VObject::parse($data); - OC_Calendar_App::loadCategoriesFromVCalendar($object); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - if(is_null($uid)){ - $object->setUID(); - $data = $object->serialize(); - } - - $uri = 'owncloud-'.md5($data.rand().time()).'.ics'; - - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_objects` (`calendarid`,`objecttype`,`startdate`,`enddate`,`repeating`,`summary`,`calendardata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?,?,?,?,?)' ); - $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); - $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'addEvent', $object_id); - return $object_id; - } - - /** - * @brief Adds an object with the data provided by sabredav - * @param integer $id Calendar id - * @param string $uri the uri the card will have - * @param string $data object - * @return insertid - */ - public static function addFromDAVData($id,$uri,$data){ - $object = OC_VObject::parse($data); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_objects` (`calendarid`,`objecttype`,`startdate`,`enddate`,`repeating`,`summary`,`calendardata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?,?,?,?,?)' ); - $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); - $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'addEvent', $object_id); - return $object_id; - } - - /** - * @brief edits an object - * @param integer $id id of object - * @param string $data object - * @return boolean - */ - public static function edit($id, $data){ - $oldobject = self::find($id); - - $object = OC_VObject::parse($data); - OC_Calendar_App::loadCategoriesFromVCalendar($object); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `objecttype`=?,`startdate`=?,`enddate`=?,`repeating`=?,`summary`=?,`calendardata`=?,`lastmodified`= ? WHERE `id` = ?' ); - $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$id)); - - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'editEvent', $id); - - return true; - } - - /** - * @brief edits an object with the data provided by sabredav - * @param integer $id calendar id - * @param string $uri the uri of the object - * @param string $data object - * @return boolean - */ - public static function editFromDAVData($cid,$uri,$data){ - $oldobject = self::findWhereDAVDataIs($cid,$uri); - - $object = OC_VObject::parse($data); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `objecttype`=?,`startdate`=?,`enddate`=?,`repeating`=?,`summary`=?,`calendardata`=?,`lastmodified`= ? WHERE `id` = ?' ); - $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$oldobject['id'])); - - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'editEvent', $oldobject['id']); - - return true; - } - - /** - * @brief deletes an object - * @param integer $id id of object - * @return boolean - */ - public static function delete($id){ - $oldobject = self::find($id); - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `id` = ?' ); - $stmt->execute(array($id)); - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $id); - - return true; - } - - /** - * @brief deletes an object with the data provided by sabredav - * @param integer $cid calendar id - * @param string $uri the uri of the object - * @return boolean - */ - public static function deleteFromDAVData($cid,$uri){ - $oldobject = self::findWhereDAVDataIs($cid, $uri); - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid`= ? AND `uri`=?' ); - $stmt->execute(array($cid,$uri)); - OC_Calendar_Calendar::touchCalendar($cid); - OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $oldobject['id']); - - return true; - } - - public static function moveToCalendar($id, $calendarid){ - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `calendarid`=? WHERE `id`=?' ); - $stmt->execute(array($calendarid,$id)); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'moveEvent', $id); - - return true; - } - - /** - * @brief Creates a UID - * @return string - */ - protected static function createUID(){ - return substr(md5(rand().time()),0,10); - } - - /** - * @brief Extracts data from a vObject-Object - * @param Sabre_VObject $object - * @return array - * - * [type, start, end, summary, repeating, uid] - */ - protected static function extractData($object){ - $return = array('',null,null,'',0,null); - - // Child to use - $children = 0; - $use = null; - foreach($object->children as $property){ - if($property->name == 'VEVENT'){ - $children++; - $thisone = true; - - foreach($property->children as &$element){ - if($element->name == 'RECURRENCE-ID'){ - $thisone = false; - } - } unset($element); - - if($thisone){ - $use = $property; - } - } - elseif($property->name == 'VTODO' || $property->name == 'VJOURNAL'){ - $return[0] = $property->name; - foreach($property->children as &$element){ - if($element->name == 'SUMMARY'){ - $return[3] = $element->value; - } - elseif($element->name == 'UID'){ - $return[5] = $element->value; - } - }; - - // Only one VTODO or VJOURNAL per object - // (only one UID per object but a UID is required by a VTODO => - // one VTODO per object) - break; - } - } - - // find the data - if(!is_null($use)){ - $return[0] = $use->name; - foreach($use->children as $property){ - if($property->name == 'DTSTART'){ - $return[1] = self::getUTCforMDB($property->getDateTime()); - } - elseif($property->name == 'DTEND'){ - $return[2] = self::getUTCforMDB($property->getDateTime()); - } - elseif($property->name == 'SUMMARY'){ - $return[3] = $property->value; - } - elseif($property->name == 'RRULE'){ - $return[4] = 1; - } - elseif($property->name == 'UID'){ - $return[5] = $property->value; - } - } - } - - // More than one child means reoccuring! - if($children > 1){ - $return[4] = 1; - } - return $return; - } - - /** - * @brief DateTime to UTC string - * @param DateTime $datetime The date to convert - * @returns date as YYYY-MM-DD hh:mm - * - * This function creates a date string that can be used by MDB2. - * Furthermore it converts the time to UTC. - */ - public static function getUTCforMDB($datetime){ - return date('Y-m-d H:i', $datetime->format('U') - $datetime->getOffset()); - } - - /** - * @brief returns the DTEND of an $vevent object - * @param object $vevent vevent object - * @return object - */ - public static function getDTEndFromVEvent($vevent){ - if ($vevent->DTEND) { - $dtend = $vevent->DTEND; - }else{ - $dtend = clone $vevent->DTSTART; - // clone creates a shallow copy, also clone DateTime - $dtend->setDateTime(clone $dtend->getDateTime(), $dtend->getDateType()); - if ($vevent->DURATION){ - $duration = strval($vevent->DURATION); - $invert = 0; - if ($duration[0] == '-'){ - $duration = substr($duration, 1); - $invert = 1; - } - if ($duration[0] == '+'){ - $duration = substr($duration, 1); - } - $interval = new DateInterval($duration); - $interval->invert = $invert; - $dtend->getDateTime()->add($interval); - } - } - return $dtend; - } - - /** - * @brief returns the options for the repeat rule of an repeating event - * @return array - valid inputs for the repeat rule of an repeating event - */ - public static function getRepeatOptions($l10n){ - return array( - 'doesnotrepeat' => $l10n->t('Does not repeat'), - 'daily' => $l10n->t('Daily'), - 'weekly' => $l10n->t('Weekly'), - 'weekday' => $l10n->t('Every Weekday'), - 'biweekly' => $l10n->t('Bi-Weekly'), - 'monthly' => $l10n->t('Monthly'), - 'yearly' => $l10n->t('Yearly') - ); - } - - /** - * @brief returns the options for the end of an repeating event - * @return array - valid inputs for the end of an repeating events - */ - public static function getEndOptions($l10n){ - return array( - 'never' => $l10n->t('never'), - 'count' => $l10n->t('by occurrences'), - 'date' => $l10n->t('by date') - ); - } - - /** - * @brief returns the options for an monthly repeating event - * @return array - valid inputs for monthly repeating events - */ - public static function getMonthOptions($l10n){ - return array( - 'monthday' => $l10n->t('by monthday'), - 'weekday' => $l10n->t('by weekday') - ); - } - - /** - * @brief returns the options for an weekly repeating event - * @return array - valid inputs for weekly repeating events - */ - public static function getWeeklyOptions($l10n){ - return array( - 'MO' => $l10n->t('Monday'), - 'TU' => $l10n->t('Tuesday'), - 'WE' => $l10n->t('Wednesday'), - 'TH' => $l10n->t('Thursday'), - 'FR' => $l10n->t('Friday'), - 'SA' => $l10n->t('Saturday'), - 'SU' => $l10n->t('Sunday') - ); - } - - /** - * @brief returns the options for an monthly repeating event which occurs on specific weeks of the month - * @return array - valid inputs for monthly repeating events - */ - public static function getWeekofMonth($l10n){ - return array( - 'auto' => $l10n->t('events week of month'), - '1' => $l10n->t('first'), - '2' => $l10n->t('second'), - '3' => $l10n->t('third'), - '4' => $l10n->t('fourth'), - '5' => $l10n->t('fifth'), - '-1' => $l10n->t('last') - ); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific days of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByYearDayOptions(){ - $return = array(); - foreach(range(1,366) as $num){ - $return[(string) $num] = (string) $num; - } - return $return; - } - - /** - * @brief returns the options for an yearly or monthly repeating event which occurs on specific days of the month - * @return array - valid inputs for yearly or monthly repeating events - */ - public static function getByMonthDayOptions(){ - $return = array(); - foreach(range(1,31) as $num){ - $return[(string) $num] = (string) $num; - } - return $return; - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific month of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByMonthOptions($l10n){ - return array( - '1' => $l10n->t('January'), - '2' => $l10n->t('February'), - '3' => $l10n->t('March'), - '4' => $l10n->t('April'), - '5' => $l10n->t('May'), - '6' => $l10n->t('June'), - '7' => $l10n->t('July'), - '8' => $l10n->t('August'), - '9' => $l10n->t('September'), - '10' => $l10n->t('October'), - '11' => $l10n->t('November'), - '12' => $l10n->t('December') - ); - } - - /** - * @brief returns the options for an yearly repeating event - * @return array - valid inputs for yearly repeating events - */ - public static function getYearOptions($l10n){ - return array( - 'bydate' => $l10n->t('by events date'), - 'byyearday' => $l10n->t('by yearday(s)'), - 'byweekno' => $l10n->t('by weeknumber(s)'), - 'bydaymonth' => $l10n->t('by day and month') - ); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific week numbers of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByWeekNoOptions(){ - return range(1, 52); - } - - /** - * @brief validates a request - * @param array $request - * @return mixed (array / boolean) - */ - public static function validateRequest($request){ - $errnum = 0; - $errarr = array('title'=>'false', 'cal'=>'false', 'from'=>'false', 'fromtime'=>'false', 'to'=>'false', 'totime'=>'false', 'endbeforestart'=>'false'); - if($request['title'] == ''){ - $errarr['title'] = 'true'; - $errnum++; - } - - $fromday = substr($request['from'], 0, 2); - $frommonth = substr($request['from'], 3, 2); - $fromyear = substr($request['from'], 6, 4); - if(!checkdate($frommonth, $fromday, $fromyear)){ - $errarr['from'] = 'true'; - $errnum++; - } - $allday = isset($request['allday']); - if(!$allday && self::checkTime(urldecode($request['fromtime']))) { - $errarr['fromtime'] = 'true'; - $errnum++; - } - - $today = substr($request['to'], 0, 2); - $tomonth = substr($request['to'], 3, 2); - $toyear = substr($request['to'], 6, 4); - if(!checkdate($tomonth, $today, $toyear)){ - $errarr['to'] = 'true'; - $errnum++; - } - if($request['repeat'] != 'doesnotrepeat'){ - if(is_nan($request['interval']) && $request['interval'] != ''){ - $errarr['interval'] = 'true'; - $errnum++; - } - if(array_key_exists('repeat', $request) && !array_key_exists($request['repeat'], self::getRepeatOptions(OC_Calendar_App::$l10n))){ - $errarr['repeat'] = 'true'; - $errnum++; - } - if(array_key_exists('advanced_month_select', $request) && !array_key_exists($request['advanced_month_select'], self::getMonthOptions(OC_Calendar_App::$l10n))){ - $errarr['advanced_month_select'] = 'true'; - $errnum++; - } - if(array_key_exists('advanced_year_select', $request) && !array_key_exists($request['advanced_year_select'], self::getYearOptions(OC_Calendar_App::$l10n))){ - $errarr['advanced_year_select'] = 'true'; - $errnum++; - } - if(array_key_exists('weekofmonthoptions', $request) && !array_key_exists($request['weekofmonthoptions'], self::getWeekofMonth(OC_Calendar_App::$l10n))){ - $errarr['weekofmonthoptions'] = 'true'; - $errnum++; - } - if($request['end'] != 'never'){ - if(!array_key_exists($request['end'], self::getEndOptions(OC_Calendar_App::$l10n))){ - $errarr['end'] = 'true'; - $errnum++; - } - if($request['end'] == 'count' && is_nan($request['byoccurrences'])){ - $errarr['byoccurrences'] = 'true'; - $errnum++; - } - if($request['end'] == 'date'){ - list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']); - if(!checkdate($bydate_month, $bydate_day, $bydate_year)){ - $errarr['bydate'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('weeklyoptions', $request)){ - foreach($request['weeklyoptions'] as $option){ - if(!in_array($option, self::getWeeklyOptions(OC_Calendar_App::$l10n))){ - $errarr['weeklyoptions'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('byyearday', $request)){ - foreach($request['byyearday'] as $option){ - if(!array_key_exists($option, self::getByYearDayOptions())){ - $errarr['byyearday'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('weekofmonthoptions', $request)){ - if(is_nan((double)$request['weekofmonthoptions'])){ - $errarr['weekofmonthoptions'] = 'true'; - $errnum++; - } - } - if(array_key_exists('bymonth', $request)){ - foreach($request['bymonth'] as $option){ - if(!in_array($option, self::getByMonthOptions(OC_Calendar_App::$l10n))){ - $errarr['bymonth'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('byweekno', $request)){ - foreach($request['byweekno'] as $option){ - if(!array_key_exists($option, self::getByWeekNoOptions())){ - $errarr['byweekno'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('bymonthday', $request)){ - foreach($request['bymonthday'] as $option){ - if(!array_key_exists($option, self::getByMonthDayOptions())){ - $errarr['bymonthday'] = 'true'; - $errnum++; - } - } - } - } - if(!$allday && self::checkTime(urldecode($request['totime']))) { - $errarr['totime'] = 'true'; - $errnum++; - } - if($today < $fromday && $frommonth == $tomonth && $fromyear == $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($today == $fromday && $frommonth > $tomonth && $fromyear == $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($today == $fromday && $frommonth == $tomonth && $fromyear > $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if(!$allday && $fromday == $today && $frommonth == $tomonth && $fromyear == $toyear){ - list($tohours, $tominutes) = explode(':', $request['totime']); - list($fromhours, $fromminutes) = explode(':', $request['fromtime']); - if($tohours < $fromhours){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($tohours == $fromhours && $tominutes < $fromminutes){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - } - if ($errnum) - { - return $errarr; - } - return false; - } - - /** - * @brief validates time - * @param string $time - * @return boolean - */ - protected static function checkTime($time){ - list($hours, $minutes) = explode(':', $time); - return empty($time) - || $hours < 0 || $hours > 24 - || $minutes < 0 || $minutes > 60; - } - - /** - * @brief creates an VCalendar Object from the request data - * @param array $request - * @return object created $vcalendar - */ public static function createVCalendarFromRequest($request){ - $vcalendar = new OC_VObject('VCALENDAR'); - $vcalendar->add('PRODID', 'ownCloud Calendar'); - $vcalendar->add('VERSION', '2.0'); - - $vevent = new OC_VObject('VEVENT'); - $vcalendar->add($vevent); - - $vevent->setDateTime('CREATED', 'now', Sabre_VObject_Property_DateTime::UTC); - - $vevent->setUID(); - return self::updateVCalendarFromRequest($request, $vcalendar); - } - - /** - * @brief updates an VCalendar Object from the request data - * @param array $request - * @param object $vcalendar - * @return object updated $vcalendar - */ - public static function updateVCalendarFromRequest($request, $vcalendar){ - $title = $request["title"]; - $location = $request["location"]; - $categories = $request["categories"]; - $allday = isset($request["allday"]); - $from = $request["from"]; - $to = $request["to"]; - if (!$allday){ - $fromtime = $request['fromtime']; - $totime = $request['totime']; - } - $vevent = $vcalendar->VEVENT; - $description = $request["description"]; - $repeat = $request["repeat"]; - if($repeat != 'doesnotrepeat'){ - $rrule = ''; - $interval = $request['interval']; - $end = $request['end']; - $byoccurrences = $request['byoccurrences']; - switch($repeat){ - case 'daily': - $rrule .= 'FREQ=DAILY'; - break; - case 'weekly': - $rrule .= 'FREQ=WEEKLY'; - if(array_key_exists('weeklyoptions', $request)){ - $byday = ''; - $daystrings = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - foreach($request['weeklyoptions'] as $days){ - if($byday == ''){ - $byday .= $daystrings[$days]; - }else{ - $byday .= ',' .$daystrings[$days]; - } - } - $rrule .= ';BYDAY=' . $byday; - } - break; - case 'weekday': - $rrule .= 'FREQ=WEEKLY'; - $rrule .= ';BYDAY=MO,TU,WE,TH,FR'; - break; - case 'biweekly': - $rrule .= 'FREQ=WEEKLY'; - $interval = $interval * 2; - break; - case 'monthly': - $rrule .= 'FREQ=MONTHLY'; - if($request['advanced_month_select'] == 'monthday'){ - break; - }elseif($request['advanced_month_select'] == 'weekday'){ - if($request['weekofmonthoptions'] == 'auto'){ - list($_day, $_month, $_year) = explode('-', $from); - $weekofmonth = floor($_day/7); - }else{ - $weekofmonth = $request['weekofmonthoptions']; - } - $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - $byday = ''; - foreach($request['weeklyoptions'] as $day){ - if($byday == ''){ - $byday .= $weekofmonth . $days[$day]; - }else{ - $byday .= ',' . $weekofmonth . $days[$day]; - } - } - if($byday == ''){ - $byday = 'MO,TU,WE,TH,FR,SA,SU'; - } - $rrule .= ';BYDAY=' . $byday; - } - break; - case 'yearly': - $rrule .= 'FREQ=YEARLY'; - if($request['advanced_year_select'] == 'bydate'){ - - }elseif($request['advanced_year_select'] == 'byyearday'){ - list($_day, $_month, $_year) = explode('-', $from); - $byyearday = date('z', mktime(0,0,0, $_month, $_day, $_year)) + 1; - if(array_key_exists('byyearday', $request)){ - foreach($request['byyearday'] as $yearday){ - $byyearday .= ',' . $yearday; - } - } - $rrule .= ';BYYEARDAY=' . $byyearday; - }elseif($request['advanced_year_select'] == 'byweekno'){ - list($_day, $_month, $_year) = explode('-', $from); - $rrule .= ';BYDAY=' . strtoupper(substr(date('l', mktime(0,0,0, $_month, $_day, $_year)), 0, 2)); - $byweekno = ''; - foreach($request['byweekno'] as $weekno){ - if($byweekno == ''){ - $byweekno = $weekno; - }else{ - $byweekno .= ',' . $weekno; - } - } - $rrule .= ';BYWEEKNO=' . $byweekno; - }elseif($request['advanced_year_select'] == 'bydaymonth'){ - if(array_key_exists('weeklyoptions', $request)){ - $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - $byday = ''; - foreach($request['weeklyoptions'] as $day){ - if($byday == ''){ - $byday .= $days[$day]; - }else{ - $byday .= ',' . $days[$day]; - } - } - $rrule .= ';BYDAY=' . $byday; - } - if(array_key_exists('bymonth', $request)){ - $monthes = array_flip(self::getByMonthOptions(OC_Calendar_App::$l10n)); - $bymonth = ''; - foreach($request['bymonth'] as $month){ - if($bymonth == ''){ - $bymonth .= $monthes[$month]; - }else{ - $bymonth .= ',' . $monthes[$month]; - } - } - $rrule .= ';BYMONTH=' . $bymonth; - - } - if(array_key_exists('bymonthday', $request)){ - $bymonthday = ''; - foreach($request['bymonthday'] as $monthday){ - if($bymonthday == ''){ - $bymonthday .= $monthday; - }else{ - $bymonthday .= ',' . $monthday; - } - } - $rrule .= ';BYMONTHDAY=' . $bymonthday; - - } - } - break; - default: - break; - } - if($interval != ''){ - $rrule .= ';INTERVAL=' . $interval; - } - if($end == 'count'){ - $rrule .= ';COUNT=' . $byoccurrences; - } - if($end == 'date'){ - list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']); - $rrule .= ';UNTIL=' . $bydate_year . $bydate_month . $bydate_day; - } - $vevent->setString('RRULE', $rrule); - $repeat = "true"; - }else{ - $repeat = "false"; - } - - - $vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); - $vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - $vevent->setString('SUMMARY', $title); - - if($allday){ - $start = new DateTime($from); - $end = new DateTime($to.' +1 day'); - $vevent->setDateTime('DTSTART', $start, Sabre_VObject_Property_DateTime::DATE); - $vevent->setDateTime('DTEND', $end, Sabre_VObject_Property_DateTime::DATE); - }else{ - $timezone = OC_Calendar_App::getTimezone(); - $timezone = new DateTimeZone($timezone); - $start = new DateTime($from.' '.$fromtime, $timezone); - $end = new DateTime($to.' '.$totime, $timezone); - $vevent->setDateTime('DTSTART', $start, Sabre_VObject_Property_DateTime::LOCALTZ); - $vevent->setDateTime('DTEND', $end, Sabre_VObject_Property_DateTime::LOCALTZ); - } - unset($vevent->DURATION); - - $vevent->setString('LOCATION', $location); - $vevent->setString('DESCRIPTION', $description); - $vevent->setString('CATEGORIES', $categories); - - /*if($repeat == "true"){ - $vevent->RRULE = $repeat; - }*/ - - return $vcalendar; - } - - /** - * @brief returns the owner of an object - * @param integer $id - * @return string - */ - public static function getowner($id){ - $event = self::find($id); - $cal = OC_Calendar_Calendar::find($event['calendarid']); - return $cal['userid']; - } - - /** - * @brief returns the calendarid of an object - * @param integer $id - * @return integer - */ - public static function getCalendarid($id){ - $event = self::find($id); - return $event['calendarid']; - } - - /** - * @brief checks if an object is repeating - * @param integer $id - * @return boolean - */ - public static function isrepeating($id){ - $event = self::find($id); - return ($event['repeating'] == 1)?true:false; - } - - /** - * @brief converts the start_dt and end_dt to a new timezone - * @param object $dtstart - * @param object $dtend - * @param boolean $allday - * @param string $tz - * @return array - */ - public static function generateStartEndDate($dtstart, $dtend, $allday, $tz){ - $start_dt = $dtstart->getDateTime(); - $end_dt = $dtend->getDateTime(); - $return = array(); - if($allday){ - $return['start'] = $start_dt->format('Y-m-d'); - $end_dt->modify('-1 minute'); - while($start_dt >= $end_dt){ - $end_dt->modify('+1 day'); - } - $return['end'] = $end_dt->format('Y-m-d'); - }else{ - $start_dt->setTimezone(new DateTimeZone($tz)); - $end_dt->setTimezone(new DateTimeZone($tz)); - $return['start'] = $start_dt->format('Y-m-d H:i:s'); - $return['end'] = $end_dt->format('Y-m-d H:i:s'); - } - return $return; - } -} diff --git a/apps/calendar/lib/repeat.php b/apps/calendar/lib/repeat.php deleted file mode 100644 index 27f1e0481a..0000000000 --- a/apps/calendar/lib/repeat.php +++ /dev/null @@ -1,204 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class manages the caching of repeating events - * Events will be cached for the current year ± 5 years - */ -class OC_Calendar_Repeat{ - /** - * @brief returns the cache of an event - * @param (int) $id - id of the event - * @return (array) - */ - public static function get($id){ - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?'); - $result = $stmt->execute(array($id)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of an event in a specific peroid - * @param (int) $id - id of the event - * @param (DateTime) $from - start for period in UTC - * @param (DateTime) $until - end for period in UTC - * @return (array) - */ - public static function get_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?' - .' AND ((`startdate` >= ? AND `startdate` <= ?)' - .' OR (`enddate` >= ? AND `enddate` <= ?))'); - $result = $stmt->execute(array($id, - OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until), - OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until))); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of all repeating events of a calendar - * @param (int) $id - id of the calendar - * @return (array) - */ - public static function getCalendar($id){ - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?'); - $result = $stmt->execute(array($id)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of all repeating events of a calendar in a specific period - * @param (int) $id - id of the event - * @param (string) $from - start for period in UTC - * @param (string) $until - end for period in UTC - * @return (array) - */ - public static function getCalendar_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?' - .' AND ((`startdate` >= ? AND `startdate` <= ?)' - .' OR (`enddate` >= ? AND `enddate` <= ?))'); - $result = $stmt->execute(array($id, - $from, $until, - $from, $until)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief generates the cache the first time - * @param (int) id - id of the event - * @return (bool) - */ - public static function generate($id){ - $event = OC_Calendar_Object::find($id); - if($event['repeating'] == 0){ - return false; - } - $object = OC_VObject::parse($event['calendardata']); - $start = new DateTime('01-01-' . date('Y') . ' 00:00:00', new DateTimeZone('UTC')); - $start->modify('-5 years'); - $end = new DateTime('31-12-' . date('Y') . ' 23:59:59', new DateTimeZone('UTC')); - $end->modify('+5 years'); - $object->expand($start, $end); - foreach($object->getComponents() as $vevent){ - if(!($vevent instanceof Sabre_VObject_Component_VEvent)){ - continue; - } - $startenddate = OC_Calendar_Object::generateStartEndDate($vevent->DTSTART, OC_Calendar_Object::getDTEndFromVEvent($vevent), ($vevent->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE)?true:false, 'UTC'); - $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*calendar_repeat` (`eventid`,`calid`,`startdate`,`enddate`) VALUES(?,?,?,?)'); - $stmt->execute(array($id,OC_Calendar_Object::getCalendarid($id),$startenddate['start'],$startenddate['end'])); - } - return true; - } - /** - * @brief generates the cache the first time for all repeating event of an calendar - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function generateCalendar($id){ - $allobjects = OC_Calendar_Object::all($id); - foreach($allobjects as $event){ - self::generate($event['id']); - } - return true; - } - /** - * @brief updates an event that is already cached - * @param (int) id - id of the event - * @return (bool) - */ - public static function update($id){ - self::clean($id); - self::generate($id); - return true; - } - /** - * @brief updates all repating events of a calendar that are already cached - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function updateCalendar($id){ - self::cleanCalendar($id); - self::generateCalendar($id); - return true; - } - /** - * @brief checks if an event is already cached - * @param (int) id - id of the event - * @return (bool) - */ - public static function is_cached($id){ - if(count(self::get($id)) != 0){ - return true; - }else{ - return false; - } - } - /** - * @brief checks if an event is already cached in a specific period - * @param (int) id - id of the event - * @param (DateTime) $from - start for period in UTC - * @param (DateTime) $until - end for period in UTC - * @return (bool) - */ - public static function is_cached_inperiod($id, $start, $end){ - if(count(self::get_inperiod($id, $start, $end)) != 0){ - return true; - }else{ - return false; - } - - } - /** - * @brief checks if a whole calendar is already cached - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function is_calendar_cached($id){ - $cachedevents = count(self::getCalendar($id)); - $repeatingevents = 0; - $allevents = OC_Calendar_Object::all($id); - foreach($allevents as $event){ - if($event['repeating'] === 1){ - $repeatingevents++; - } - } - if($cachedevents < $repeatingevents){ - return false; - }else{ - return true; - } - } - /** - * @brief removes the cache of an event - * @param (int) id - id of the event - * @return (bool) - */ - public static function clean($id){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?'); - $stmt->execute(array($id)); - } - /** - * @brief removes the cache of all events of a calendar - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function cleanCalendar($id){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?'); - $stmt->execute(array($id)); - } -} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/backend.php b/apps/calendar/lib/sabre/backend.php deleted file mode 100644 index ac3b26ceb3..0000000000 --- a/apps/calendar/lib/sabre/backend.php +++ /dev/null @@ -1,318 +0,0 @@ - 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principalUri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - $raw = OC_Calendar_Calendar::allCalendarsWherePrincipalURIIs($principalUri); - - $calendars = array(); - foreach( $raw as $row ){ - $components = explode(',',$row['components']); - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => 'principals/'.$row['userid'], - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), - ); - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - } - return $calendars; - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - * @return mixed - */ - public function createCalendar($principalUri,$calendarUri, array $properties) { - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { - throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $myValue = $properties[$xmlName]; - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - if(!isset($newValues['displayname'])) $newValues['displayname'] = 'unnamed'; - if(!isset($newValues['components'])) $newValues['components'] = 'VEVENT,VTODO'; - if(!isset($newValues['timezone'])) $newValues['timezone'] = null; - if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = 0; - if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; - if(!is_null($newValues['calendarcolor']) && strlen($newValues['calendarcolor']) == 9){ - $newValues['calendarcolor'] = substr($newValues['calendarcolor'], 0, 7); - } - - return OC_Calendar_Calendar::addCalendarFromDAVData($principalUri,$calendarUri,$newValues['displayname'],$newValues['components'],$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); - } - - /** - * Updates a calendars properties - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existant property is always succesful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $properties - * @return bool|array - */ - public function updateCalendar($calendarId, array $properties) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($properties as $propertyName=>$propertyValue) { - - // We don't know about this property. - if (!isset($this->propertyMap[$propertyName])) { - $hasError = true; - $result[403][$propertyName] = null; - unset($properties[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($properties as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - if(!isset($newValues['displayname'])) $newValues['displayname'] = null; - if(!isset($newValues['timezone'])) $newValues['timezone'] = null; - if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = null; - if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; - if(!is_null($newValues['calendarcolor']) && strlen($newValues['calendarcolor']) == 9){ - $newValues['calendarcolor'] = substr($newValues['calendarcolor'], 0, 7); - } - - OC_Calendar_Calendar::editCalendar($calendarId,$newValues['displayname'],null,$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - if(preg_match( '=iCal/[1-4]?.*Mac OS X/10.[1-6](.[0-9])?=', $_SERVER['HTTP_USER_AGENT'] )){ - throw new Sabre_DAV_Exception_Forbidden("Action is not possible with OSX 10.6.x", 403); - } - - OC_Calendar_Calendar::deleteCalendar($calendarId); - } - - /** - * Returns all calendar objects within a calendar object. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calnedar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - $data = array(); - foreach(OC_Calendar_Object::all($calendarId) as $row){ - $data[] = $this->OCAddETag($row); - } - return $data; - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri) { - $data = OC_Calendar_Object::findWhereDAVDataIs($calendarId,$objectUri); - if(is_array($data)){ - $data = $this->OCAddETag($data); - } - return $data; - } - - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - OC_Calendar_Object::addFromDAVData($calendarId,$objectUri,$calendarData); - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData){ - OC_Calendar_Object::editFromDAVData($calendarId,$objectUri,$calendarData); - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri){ - OC_Calendar_Object::deleteFromDAVData($calendarId,$objectUri); - } - - /** - * @brief Creates a etag - * @param array $row Database result - * @returns associative array - * - * Adds a key "etag" to the row - */ - private function OCAddETag($row){ - $row['etag'] = '"'.md5($row['calendarid'].$row['uri'].$row['calendardata'].$row['lastmodified']).'"'; - return $row; - } -} diff --git a/apps/calendar/lib/sabre/calendar.php b/apps/calendar/lib/sabre/calendar.php deleted file mode 100644 index 179be1b281..0000000000 --- a/apps/calendar/lib/sabre/calendar.php +++ /dev/null @@ -1,127 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CalDAV_Calendar::getACL() to return read/write - * permissions based on user and shared state and it overrides - * Sabre_CalDAV_Calendar::getChild() and Sabre_CalDAV_Calendar::getChildren() - * to instantiate OC_Connector_Sabre_CalDAV_CalendarObjects. -*/ -class OC_Connector_Sabre_CalDAV_Calendar extends Sabre_CalDAV_Calendar { - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $readprincipal = $this->getOwner(); - $writeprincipal = $this->getOwner(); - $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); - - if($uid != OCP\USER::getUser()) { - $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); - if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { - $readprincipal = 'principals/' . OCP\USER::getUser(); - } - if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - $writeprincipal = 'principals/' . OCP\USER::getUser(); - } - } - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal . '/calendar-proxy-read', - 'protected' => true, - ), - array( - 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy', - 'principal' => '{DAV:}authenticated', - 'protected' => true, - ), - - ); - - } - - /** - * Returns a calendar object - * - * The contained calendar objects are for example Events or Todo's. - * - * @param string $name - * @return Sabre_DAV_ICalendarObject - */ - public function getChild($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_NotFound('Calendar object not found'); - return new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - - } - - /** - * Returns the full list of calendar objects - * - * @return array - */ - public function getChildren() { - - $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - } - return $children; - - } - -} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/calendarroot.php b/apps/calendar/lib/sabre/calendarroot.php deleted file mode 100644 index e09731c95b..0000000000 --- a/apps/calendar/lib/sabre/calendarroot.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CalDAV_CalendarRootNode::getChildForPrincipal() - * to instantiate OC_Connector_Sabre_CalDAV_UserCalendars. -*/ -class OC_Connector_Sabre_CalDAV_CalendarRoot extends Sabre_CalDAV_CalendarRootNode { - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new OC_Connector_Sabre_CalDAV_UserCalendars($this->principalBackend, $this->caldavBackend, $principal['uri']); - - } - -} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/object.php b/apps/calendar/lib/sabre/object.php deleted file mode 100644 index 0d1bfa397c..0000000000 --- a/apps/calendar/lib/sabre/object.php +++ /dev/null @@ -1,87 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CalDAV_CalendarObject::getACL() - * to return read/write permissions based on user and shared state. -*/ -class OC_Connector_Sabre_CalDAV_CalendarObject extends Sabre_CalDAV_CalendarObject { - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $readprincipal = $this->getOwner(); - $writeprincipal = $this->getOwner(); - $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); - - if($uid != OCP\USER::getUser()) { - $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); - if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { - $readprincipal = 'principals/' . OCP\USER::getUser(); - } - if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - $writeprincipal = 'principals/' . OCP\USER::getUser(); - } - } - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal . '/calendar-proxy-read', - 'protected' => true, - ), - ); - - } - -} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/usercalendars.php b/apps/calendar/lib/sabre/usercalendars.php deleted file mode 100644 index 919f6b27e1..0000000000 --- a/apps/calendar/lib/sabre/usercalendars.php +++ /dev/null @@ -1,46 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CalDAV_UserCalendars::getChildren() - * to instantiate OC_Connector_Sabre_CalDAV_Calendars. -*/ -class OC_Connector_Sabre_CalDAV_UserCalendars extends Sabre_CalDAV_UserCalendars { - - /** - * Returns a list of calendars - * - * @return array - */ - public function getChildren() { - - $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); - $objs = array(); - foreach($calendars as $calendar) { - $objs[] = new OC_Connector_Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); - } - $objs[] = new Sabre_CalDAV_Schedule_Outbox($this->principalInfo['uri']); - return $objs; - - } - -} \ No newline at end of file diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php deleted file mode 100644 index 551489672b..0000000000 --- a/apps/calendar/lib/search.php +++ /dev/null @@ -1,49 +0,0 @@ - 0){ - $searchquery = explode(' ', $query); - }else{ - $searchquery[] = $query; - } - $user_timezone = OC_Calendar_App::getTimezone(); - $l = new OC_l10n('calendar'); - foreach($calendars as $calendar){ - $objects = OC_Calendar_Object::all($calendar['id']); - foreach($objects as $object){ - if($object['objecttype']!='VEVENT') { - continue; - } - if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){ - $calendardata = OC_VObject::parse($object['calendardata']); - $vevent = $calendardata->VEVENT; - $dtstart = $vevent->DTSTART; - $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); - $start_dt = $dtstart->getDateTime(); - $start_dt->setTimezone(new DateTimeZone($user_timezone)); - $end_dt = $dtend->getDateTime(); - $end_dt->setTimezone(new DateTimeZone($user_timezone)); - if ($dtstart->getDateType() == Sabre_VObject_Property_DateTime::DATE){ - $end_dt->modify('-1 sec'); - if($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')){ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y'); - }else{ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); - } - }else{ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); - } - $link = OCP\Util::linkTo('calendar', 'index.php').'?showevent='.urlencode($object['id']); - $results[]=new OC_Search_Result($object['summary'],$info, $link,(string)$l->t('Cal.'));//$name,$text,$link,$type - } - } - } - return $results; - } -} diff --git a/apps/calendar/lib/share.php b/apps/calendar/lib/share.php deleted file mode 100644 index bad1082c33..0000000000 --- a/apps/calendar/lib/share.php +++ /dev/null @@ -1,295 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class manages shared calendars - */ -class OC_Calendar_Share{ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - /** - * @brief: returns informations about all calendar or events which users are sharing with the user - userid - * @param: string $userid - id of the user - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return: array $return - information about calendars - */ - public static function allSharedwithuser($userid, $type, $active=null, $permission=null){ - $format = OC_Share_Backend_Calendar::FORMAT_CALENDAR; - if ($type == self::EVENT) { - $format = OC_Share_Backend_Event::FORMAT_EVENT; - } - $return = OCP\Share::getItemsSharedWith($type, - $format, - array( - 'active' => $active, - 'permissions' => $permission, - )); - return $return; - } - /** - * @brief: returns all users a calendar / event is shared with - * @param: integer id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return: array $users - information about users a calendar / event is shared with - */ - public static function allUsersSharedwith($id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `' . $type . 'id` = ? ORDER BY `share`'); - $result = $stmt->execute(array($id)); - $users = array(); - while( $row = $result->fetchRow()){ - $users[] = $row; - } - return $users; - } - /** - * @brief: shares a calendar / event - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return (mixed) - token (if $sharetype == public) / bool (if $sharetype != public) - */ - public static function share($owner, $share, $sharetype, $id, $type){ - if(self::is_already_shared($owner, $share, $sharetype, $id, $type)){ - return false; - } - switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - return false; - } - if($sharetype == 'public'){ - $share = self::generate_token($id, $type); - } - $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*calendar_share_' . $type . '` (`owner`,`share`,`sharetype`,`' . $type . 'id`,`permissions`' . (($type == self::CALENDAR)?',`active`':'') . ') VALUES(?,?,?,?,0' . (($type == self::CALENDAR)?', 1':'') . ')' ); - $result = $stmt->execute(array($owner,$share,$sharetype,$id)); - if($sharetype == 'public'){ - return $share; - }else{ - return true; - } - } - /** - * @brief: stops sharing a calendar / event - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function unshare($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? ' . (($sharetype != 'public')?'AND `share` = ?':'') . ' AND `sharetype` = ? AND `' . $type . 'id` = ?'); - if($sharetype != 'public'){ - $stmt->execute(array($owner,$share,$sharetype,$id)); - }else{ - $stmt->execute(array($owner,$sharetype,$id)); - } - return true; - } - /** - * @brief: changes the permission for a calendar / event - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: integer $permission - permission of user the calendar / event is shared with (if $sharetype == public then $permission = 0) - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function changepermission($share, $sharetype, $id, $permission, $type){ - if($sharetype == 'public' && $permission == 1){ - $permission = 0; - } - $stmt = OCP\DB::prepare('UPDATE `*PREFIX*calendar_share_' . $type . '` SET `permissions` = ? WHERE `share` = ? AND `sharetype` = ? AND `' . $type . 'id` = ?'); - $stmt->execute(array($permission, $share, $sharetype, $id)); - return true; - } - /** - * @brief: generates a token for public calendars / events - * @return: string $token - */ - private static function generate_token($id, $type){ - $uniqid = uniqid(); - if($type == self::CALENDAR){ - $events = OC_Calendar_Object::all($id); - $string = ''; - foreach($events as $event){ - $string .= $event['calendardata']; - } - }else{ - $string = OC_Calendar_Object::find($id); - } - $string = sha1($string['calendardata']); - $id = sha1($id); - $array = array($uniqid,$string,$id); - shuffle($array); - $string = implode('', $array); - $token = md5($string); - return substr($token, rand(0,16), 15); - } - /** - * @brief: checks if it is already shared - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function is_already_shared($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? AND `share` = ? AND `sharetype` = ? AND `' . $type . 'id` = ?'); - $result = $stmt->execute(array($owner, $share, $sharetype, $id)); - if($result->numRows() > 0){ - return true; - } - return false; - } - private static function group_sql($groups){ - $group_where = ''; - $i = 0; - foreach($groups as $group){ - $group_where .= ' OR '; - $group_where .= ' (`share` = \'' . $group . '\' AND `sharetype` = \'group\') '; - $i++; - } - return $group_where; - } - private static function permission_sql($permission = null){ - $permission_where = ''; - if(!is_null($permission)){ - $permission_where = ' AND `permissions` = '; - $permission_where .= ($permission=='rw')?"'1'":"'0'"; - } - return $permission_where; - } - private static function active_sql($active = null){ - $active_where = ''; - if(!is_null($active)){ - $active_where = 'AND `active` = '; - $active_where .= (!is_null($active) && $active)?'1':'0'; - } - return $active_where; - } - /** - * @brief: checks the permission for editing an event - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function is_editing_allowed($share, $id, $type){ - $group_where = self::group_sql(OC_Group::getUserGroups($share)); - $permission_where = self::permission_sql('rw'); - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE ((`share` = ? AND `sharetype` = \'user\') ' . $group_where . ') ' . $permission_where); - $result = $stmt->execute(array($share)); - if($result->numRows() == 1){ - return true; - } - if($type == self::EVENT){ - $event = OC_Calendar_App::getEventObject($id, false, false); - return self::is_editing_allowed($share, $event['calendarid'], self::CALENDAR); - } - return false; - } - /** - * @brief: checks the access of - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function check_access($share, $id, $type){ - $group_where = self::group_sql(OC_Group::getUserGroups($share)); - $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE (`' . $type . 'id` = ? AND (`share` = ? AND `sharetype` = \'user\') ' . $group_where . ')'); - $result = $stmt->execute(array($id,$share)); - $rows = $result->numRows(); - if($rows > 0){ - return true; - }elseif($type == self::EVENT){ - $event = OC_Calendar_App::getEventObject($id, false, false); - return self::check_access($share, $event['calendarid'], self::CALENDAR); - }else{ - return false; - } - } - /** - * @brief: returns the calendardata of an event or a calendar - * @param: string $token - token which should be searched - * @return: mixed - bool if false, array with type and id if true - */ - public static function getElementByToken($token){ - $stmt_calendar = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . OC_Calendar_Share::CALENDAR . '` WHERE `sharetype` = \'public\' AND `share` = ?'); - $result_calendar = $stmt_calendar->execute(array($token)); - $stmt_event = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . OC_Calendar_Share::EVENT . '` WHERE `sharetype` = \'public\' AND `share` = ?'); - $result_event = $stmt_event->execute(array($token)); - $return = array(); - if($result_calendar->numRows() == 0 && $result_event->numRows() == 0){ - return false; - }elseif($result_calendar->numRows() != 0){ - $return ['type'] = 'calendar'; - $calendar = $result_calendar->fetchRow(); - $return ['id'] = $calendar['calendarid']; - }else{ - $return ['type'] = 'event'; - $event = $result_event->fetchRow(); - $return ['id'] = $event['eventid']; - } - return $return; - } - - /** - * @brief sets the active status of the calendar - * @param string - */ - public static function set_active($share, $id, $active){ - $stmt = OCP\DB::prepare("UPDATE `*PREFIX*calendar_share_calendar` SET `active` = ? WHERE `share` = ? AND `sharetype` = 'user' AND `calendarid` = ?"); - $stmt->execute(array($active, $share, $id)); - } - - /** - * @brief deletes all shared calendars / events after a user was deleted - * @param string $userid - * @return boolean - */ - public static function post_userdelete($userid){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `owner` = ?'); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `owner` = ?'); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `share` = ? AND `sharetype` = 'user'"); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_event` WHERE `share` = ? AND `sharetype` = 'user'"); - $stmt->execute(array($userid)); - return true; - } - - /** - * @brief deletes all shared events of a calendar - * @param integer $calid - * @return boolean - */ - public static function post_caldelete($calid){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `calendarid` = ?'); - $stmt->execute(array($calid)); - return true; - } - - /** - * @brief deletes all shares of an event - * @param integer $eventid - * @return boolean - */ - public static function post_eventdelete($eventid){ - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `eventid` = ?'); - $stmt->execute(array($eventid)); - return true; - } -} \ No newline at end of file diff --git a/apps/calendar/lib/share/calendar.php b/apps/calendar/lib/share/calendar.php deleted file mode 100644 index bbc43fcca0..0000000000 --- a/apps/calendar/lib/share/calendar.php +++ /dev/null @@ -1,111 +0,0 @@ - -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Affero General Public -* License along with this library. If not, see . -*/ - -class OC_Share_Backend_Calendar implements OCP\Share_Backend_Collection { - const FORMAT_CALENDAR = 1; - - /** - * @brief Get the source of the item to be stored in the database - * @param string Item - * @param string Owner of the item - * @return mixed|array|false Source - * - * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' - * Return false if the item does not exist for the user - * - * The formatItems() function will translate the source returned back into the item - */ - public function isValidSource($itemSource, $uidOwner) { - $calendar = OC_Calendar_App::getCalendar( $itemSource ); - if ($calendar || $calendar['userid'] != $uidOwner) { - return false; - } - return true; - } - - /** - * @brief Get a unique name of the item for the specified user - * @param string Item - * @param string|false User the item is being shared with - * @param array|null List of similar item names already existing as shared items - * @return string Target name - * - * This function needs to verify that the user does not already have an item with this name. - * If it does generate a new name e.g. name_# - */ - public function generateTarget($itemSource, $shareWith, $exclude = null) { - $calendar = OC_Calendar_App::getCalendar( $itemSource ); - $user_calendars = array(); - foreach(OC_Contacts_Addressbook::all($uid) as $user_calendar) { - $user_calendars[] = $user_calendar['displayname']; - } - $name = $calendar['userid']."'s ".$calendar['displayname']; - $suffix = ''; - while (in_array($name.$suffix, $user_calendars)) { - $suffix++; - } - - return $name.$suffix; - } - - /** - * @brief Converts the shared item sources back into the item in the specified format - * @param array Shared items - * @param int Format - * @return ? - * - * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. - * The key/value pairs included in the share info depend on the function originally called: - * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source - * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target - * This function allows the backend to control the output of shared items with custom formats. - * It is only called through calls to the public getItem(s)Shared(With) functions. - */ - public function formatItems($items, $format, $parameters = null) { - $calendars = array(); - if ($format == self::FORMAT_CALENDAR) { - foreach ($items as $item) { - $calendar = OC_Calendar_App::getCalendar($item['item_source'], false); - // TODO: really check $parameters['permissions'] == 'rw'/'r' - if ($parameters['permissions'] == 'rw') { - continue; // TODO - } - $calendar['displaynamename'] = $item['item_target']; - $calendar['calendarid'] = $calendar['id']; - $calendar['owner'] = $calendar['userid']; - $calendars[] = $calendar; - } - } - return $calendars; - } - - public function getChildren($itemSource) { - $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?'); - $result = $query->execute(array($itemSource)); - $sources = array(); - while ($object = $result->fetchRow()) { - $sources[] = $object['id']; - } - return $sources; - } - -} \ No newline at end of file diff --git a/apps/calendar/lib/share/event.php b/apps/calendar/lib/share/event.php deleted file mode 100644 index 5bb72ee6c9..0000000000 --- a/apps/calendar/lib/share/event.php +++ /dev/null @@ -1,40 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class OC_Share_Backend_Event implements OCP\Share_Backend { - - const FORMAT_EVENT = 0; - - private static $event; - - public function isValidSource($itemSource, $uidOwner) { - self::$event = OC_Calendar_Object::find($itemSource); - if (self::$event) { - return true; - } - return false; - } - - public function generateTarget($itemSource, $shareWith, $exclude = null) { - // TODO Get default calendar and check for conflicts - return self::$event['summary']; - } - - public function formatItems($items, $format, $parameters = null) { - $events = array(); - if ($format == self::FORMAT_EVENT) { - foreach ($items as $item) { - $event = OC_Calendar_Object::find($item['item_source']); - $event['summary'] = $item['item_target']; - $events[] = $event; - } - } - return $events; - } - -} diff --git a/apps/calendar/lib/share_backend.php b/apps/calendar/lib/share_backend.php deleted file mode 100644 index 1ea58ac270..0000000000 --- a/apps/calendar/lib/share_backend.php +++ /dev/null @@ -1,44 +0,0 @@ -. -*/ - -class OC_Share_Backend_Calendar extends OCP\Share_Backend { - - public function getSource($item, $uid) { - $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*calendar_calendars` WHERE `userid` = ? AND `displayname` = ?',1); - return $query->execute(array($uid, $item))->fetchAll(); - } - - public function generateTarget($item, $uid) { - - } - - public function getItems($sources) { - - } - -} - -class OC_Share_Backend_Event extends OCP\Share_Backend { - -} - - -?> \ No newline at end of file diff --git a/apps/calendar/settings.php b/apps/calendar/settings.php deleted file mode 100644 index f563518046..0000000000 --- a/apps/calendar/settings.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$tmpl = new OCP\Template( 'calendar', 'settings'); -$timezone=OCP\Config::getUserValue(OCP\USER::getUser(),'calendar','timezone',''); -$tmpl->assign('timezone',$timezone); -$tmpl->assign('timezones',DateTimeZone::listIdentifiers()); -$tmpl->assign('calendars', OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()), false); - -OCP\Util::addscript('calendar','settings'); - -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/share.php b/apps/calendar/share.php deleted file mode 100644 index bffcf0b470..0000000000 --- a/apps/calendar/share.php +++ /dev/null @@ -1,31 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$token = strip_tags($_GET['t']); -$shared = OC_Calendar_Share::getElementByToken($token); -if($shared['type'] == OC_Calendar_Share::CALENDAR){ - $calendar = OC_Calendar_App::getCalendar($shared['id'], false); - if(!$calendar){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $calendar['displayname']) . '.ics'); - echo OC_Calendar_Export::export($shared['id'], OC_Calendar_Export::CALENDAR); -}elseif($shared['type'] == OC_Calendar_Share::EVENT){ - $data = OC_Calendar_App::getEventObject($shared['id'], false); - if(!$data){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $data['summary']) . '.ics'); - echo OC_Calendar_Export::export($shared['id'], OC_Calendar_Export::EVENT); -}else{ - header('HTTP/1.0 404 Not Found'); - exit; -} diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php deleted file mode 100644 index 15891aafd9..0000000000 --- a/apps/calendar/templates/calendar.php +++ /dev/null @@ -1,57 +0,0 @@ - - -
    -
    - - -    - -
    -
    - - <?php echo $l->t('Settings'); ?> - <?php echo $l->t('Settings'); ?> -
    -
    - - - -
    -
    -
    -
    - \ No newline at end of file diff --git a/apps/calendar/templates/part.choosecalendar.php b/apps/calendar/templates/part.choosecalendar.php deleted file mode 100644 index ad2f9e753f..0000000000 --- a/apps/calendar/templates/part.choosecalendar.php +++ /dev/null @@ -1,52 +0,0 @@ -
    -

    t('Your calendars'); ?>:

    - - "; - $tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); - $tmpl->assign('calendar', $option_calendars[$i]); - if(OC_Calendar_Share::allUsersSharedwith($option_calendars[$i]['id'], OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; - }else{ - $shared = true; - } - $tmpl->assign('shared', $shared); - $tmpl->printpage(); - echo ""; - } - ?> - - - - - - -
    - -
    -

    ">

    -

    -

    t('Shared calendars'); ?>:

    - - '; - $tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields.shared'); - $tmpl->assign('share', $share[$i]); - $tmpl->printpage(); - echo ''; - } - ?> -
    - ' . $l->t('No shared calendars') . '

    '; - } - ?> - -
    \ No newline at end of file diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.php b/apps/calendar/templates/part.choosecalendar.rowfields.php deleted file mode 100644 index 64aaa79719..0000000000 --- a/apps/calendar/templates/part.choosecalendar.rowfields.php +++ /dev/null @@ -1,21 +0,0 @@ - - > - - - - - - - - - - - - - - - - - - - diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php b/apps/calendar/templates/part.choosecalendar.rowfields.shared.php deleted file mode 100644 index 6a212858a2..0000000000 --- a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php +++ /dev/null @@ -1,4 +0,0 @@ -'; -echo ''; -echo '' . $l->t('shared with you by') . ' ' . $_['share']['owner'] . ''; \ No newline at end of file diff --git a/apps/calendar/templates/part.editcalendar.php b/apps/calendar/templates/part.editcalendar.php deleted file mode 100644 index b4ff573ec8..0000000000 --- a/apps/calendar/templates/part.editcalendar.php +++ /dev/null @@ -1,44 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -t("Edit calendar"); ?>" colspan="6"> - - - - - - - - - - - - - - - -
    t('Displayname') ?> - -
    - > - -
    t('Calendar color') ?> - -
    -);" value="t("Save") : $l->t("Submit"); ?>"> -);" value="t("Cancel"); ?>"> - diff --git a/apps/calendar/templates/part.editevent.php b/apps/calendar/templates/part.editevent.php deleted file mode 100644 index ea91192cc6..0000000000 --- a/apps/calendar/templates/part.editevent.php +++ /dev/null @@ -1,13 +0,0 @@ -
    "> -
    - - -inc("part.eventform"); ?> -
    - - " onclick="Calendar.UI.validateEventForm('');"> - " onclick="Calendar.UI.submitDeleteEventForm('');"> - " onclick="window.location='?eventid=';"> - -
    -
    diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php deleted file mode 100644 index 95eecf2622..0000000000 --- a/apps/calendar/templates/part.eventform.php +++ /dev/null @@ -1,251 +0,0 @@ - - - -
    - - - - - -
    t("Title");?>: - " value="" maxlength="100" name="title"/> -
    - - - - - 1) { ?> - - - - - - - -
    t("Category");?>: - - <?php echo $l->t('Edit categories'); ?> -    t("Calendar");?>: - -   - -
    -
    - - - - - - - - - - - - - -
    - id="allday_checkbox" name="allday"> - -
    t("From");?>: - -    - -
    t("To");?>: - -    - -
    - " onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button"> - -
    -
    - - - - - - -
    t("Repeat");?>: - " onclick="Calendar.UI.showadvancedoptionsforrepeating();" id="advanced_options_button">
    - -
    - - -
    - inc('share.dropdown'); } ?> -
    - diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php deleted file mode 100644 index 2ce3cc3423..0000000000 --- a/apps/calendar/templates/part.import.php +++ /dev/null @@ -1,58 +0,0 @@ -'404')); -} -$import = new OC_Calendar_Import($file); -$import->setUserID(OCP\User::getUser()); -$newcalendarname = strip_tags($import->createCalendarName()); -$guessedcalendarname = strip_tags($import->guessCalendarName()); -$calendarcolor = strip_tags($import->createCalendarColor()); -//loading calendars for select box -$calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$calendar_options[] = array('id'=>'newcal', 'displayname'=>$l->t('create a new calendar')); -$defaultcolors = OC_Calendar_Calendar::getCalendarColorOptions(); -?> -
    "> -
    -
    - - - - -
    t('Please choose a calendar'); ?>
    - -

    -
    - -
    -
    - '; - } - ?> -
    - -
    t('A Calendar with this name already exists. If you continue anyhow, these calendars will be merged.'); ?>
    -
    - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    \ No newline at end of file diff --git a/apps/calendar/templates/part.newevent.php b/apps/calendar/templates/part.newevent.php deleted file mode 100644 index a4f48aecbc..0000000000 --- a/apps/calendar/templates/part.newevent.php +++ /dev/null @@ -1,9 +0,0 @@ -
    "> - -inc("part.eventform"); ?> -
    - - " onclick="Calendar.UI.validateEventForm('');"> - - -
    diff --git a/apps/calendar/templates/part.showevent.php b/apps/calendar/templates/part.showevent.php deleted file mode 100644 index 59684d831e..0000000000 --- a/apps/calendar/templates/part.showevent.php +++ /dev/null @@ -1,243 +0,0 @@ -
    "> - -
    - - - - - -
    t("Title");?>: - -
    - - - - - - - - - -
    t("Category");?>: - t('No categories selected'); - }else{ - echo '
      '; - foreach($_['categories'] as $categorie){ - echo '
    • ' . $categorie . '
    • '; - } - echo '
    '; - } - ?> -
       t("Calendar");?>: - t('of') . ' ' . $calendar['userid']; - ?> -   - -
    -
    - - - - - - - - - - - - - -
    - id="allday_checkbox" name="allday" disabled="disabled"> - t("All Day Event");?> -
    t("From");?>: - -    t('at'):''; ?>    - -
    t("To");?>: - -    t('at'):''; ?>    - -
    - " onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button"> - -
    -
    - - - - - - -
    t("Repeat");?>: - " onclick="Calendar.UI.showadvancedoptionsforrepeating();" id="advanced_options_button">
    - -
    - - -
    \ No newline at end of file diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php deleted file mode 100644 index 56a6a42ee0..0000000000 --- a/apps/calendar/templates/settings.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -

    t('General'); ?>

    -
    - - - - - - - - - - - - - - - - - - - - - -
    - -    - - -
    -    - - -   - -
    - -    - - -
    - -    - - -
    - -    - - -
    -
    -

    t('URLs'); ?>

    -
    - t('Calendar CalDAV syncing addresses'); ?> (t('more info'); ?>) -
    -
    t('Primary address (Kontact et al)'); ?>
    -
    -
    t('iOS/OS X'); ?>
    -
    principals//
    -
    t('Read only iCalendar link(s)'); ?>
    -
    - -
    - -
    -
    -
    - \ No newline at end of file diff --git a/apps/calendar/templates/share.dropdown.php b/apps/calendar/templates/share.dropdown.php deleted file mode 100644 index 391ae83765..0000000000 --- a/apps/calendar/templates/share.dropdown.php +++ /dev/null @@ -1,77 +0,0 @@ - -t('Users');?>:
    -
    -
      - -
    • style="visibility:hidden;" title="t('Editable'); ?>">
    • - - -
    -t('Groups');?>:
    -
    -
      - -
    • style="visibility:hidden;" title="t('Editable'); ?>">
    • - - -
    -
    - >
    - -
    \ No newline at end of file diff --git a/apps/contacts/ajax/addressbook/activate.php b/apps/contacts/ajax/addressbook/activate.php deleted file mode 100644 index a8dec21dac..0000000000 --- a/apps/contacts/ajax/addressbook/activate.php +++ /dev/null @@ -1,32 +0,0 @@ - - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -$book = OC_Contacts_App::getAddressbook($id);// is owner access check - -if(!OC_Contacts_Addressbook::setActive($id, $_POST['active'])) { - OCP\Util::writeLog('contacts', - 'ajax/activation.php: Error activating addressbook: '. $id, - OCP\Util::ERROR); - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')))); - exit(); -} - -OCP\JSON::success(array( - 'active' => OC_Contacts_Addressbook::isActive($id), - 'id' => $id, - 'addressbook' => $book, -)); diff --git a/apps/contacts/ajax/addressbook/add.php b/apps/contacts/ajax/addressbook/add.php deleted file mode 100644 index 65077743ed..0000000000 --- a/apps/contacts/ajax/addressbook/add.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once __DIR__.'/../loghandler.php'; - -debug('name: '.$_POST['name']); - -$userid = OCP\USER::getUser(); -$name = isset($_POST['name'])?trim(strip_tags($_POST['name'])):null; -$description = isset($_POST['description']) - ? trim(strip_tags($_POST['description'])) - : null; - -if(is_null($name)) { - bailOut('Cannot add addressbook with an empty name.'); -} -$bookid = OC_Contacts_Addressbook::add($userid, $name, $description); -if(!$bookid) { - bailOut('Error adding addressbook: '.$name); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { - bailOut('Error activating addressbook.'); -} -$addressbook = OC_Contacts_App::getAddressbook($bookid); -OCP\JSON::success(array('data' => array('addressbook' => $addressbook))); diff --git a/apps/contacts/ajax/addressbook/delete.php b/apps/contacts/ajax/addressbook/delete.php deleted file mode 100644 index f59c605f4e..0000000000 --- a/apps/contacts/ajax/addressbook/delete.php +++ /dev/null @@ -1,36 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once __DIR__.'/../loghandler.php'; - -$id = $_POST['id']; -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} -OC_Contacts_App::getAddressbook( $id ); // is owner access check - -OC_Contacts_Addressbook::delete($id); -OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/addressbook/update.php b/apps/contacts/ajax/addressbook/update.php deleted file mode 100644 index 0fc66c3a3b..0000000000 --- a/apps/contacts/ajax/addressbook/update.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once __DIR__.'/../loghandler.php'; - -$id = $_POST['id']; -$name = trim(strip_tags($_POST['name'])); -$description = trim(strip_tags($_POST['description'])); -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} - -if(!$name) { - bailOut(OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.')); -} - -if(!OC_Contacts_Addressbook::edit($id, $name, $description)) { - bailOut(OC_Contacts_App::$l10n->t('Error updating addressbook.')); -} - -if(!OC_Contacts_Addressbook::setActive($id, $_POST['active'])) { - bailOut(OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')); -} - -OC_Contacts_App::getAddressbook($id); // is owner access check -$addressbook = OC_Contacts_App::getAddressbook($id); -OCP\JSON::success(array( - 'addressbook' => $addressbook, -)); diff --git a/apps/contacts/ajax/categories/categoriesfor.php b/apps/contacts/ajax/categories/categoriesfor.php deleted file mode 100644 index 8391b14b54..0000000000 --- a/apps/contacts/ajax/categories/categoriesfor.php +++ /dev/null @@ -1,34 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = isset($_GET['id'])?$_GET['id']:null; -if(is_null($id)) { - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('No ID provided')))); - exit(); -} -$vcard = OC_Contacts_App::getContactVCard( $id ); -foreach($vcard->children as $property){ - if($property->name == 'CATEGORIES') { - $checksum = md5($property->serialize()); - OCP\JSON::success(array( - 'data' => array( - 'value' => $property->value, - 'checksum' => $checksum, - ))); - exit(); - } -} -OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('Error setting checksum.')))); diff --git a/apps/contacts/ajax/categories/delete.php b/apps/contacts/ajax/categories/delete.php deleted file mode 100644 index bc9f3e14e8..0000000000 --- a/apps/contacts/ajax/categories/delete.php +++ /dev/null @@ -1,48 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once __DIR__.'/../loghandler.php'; - -$categories = isset($_POST['categories'])?$_POST['categories']:null; - -if(is_null($categories)) { - bailOut(OC_Contacts_App::$l10n->t('No categories selected for deletion.')); -} - -debug(print_r($categories, true)); - -$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -if(count($addressbooks) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No address books found.')); -} -$addressbookids = array(); -foreach($addressbooks as $addressbook) { - $addressbookids[] = $addressbook['id']; -} -$contacts = OC_Contacts_VCard::all($addressbookids); -if(count($contacts) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No contacts found.')); -} - -$cards = array(); -foreach($contacts as $contact) { - $cards[] = array($contact['id'], $contact['carddata']); -} - -debug('Before delete: '.print_r($categories, true)); - -$catman = new OC_VCategories('contacts'); -$catman->delete($categories, $cards); -debug('After delete: '.print_r($catman->categories(), true)); -OC_Contacts_VCard::updateDataByID($cards); -OCP\JSON::success(array('data' => array('categories'=>$catman->categories()))); diff --git a/apps/contacts/ajax/categories/list.php b/apps/contacts/ajax/categories/list.php deleted file mode 100644 index f234116ba8..0000000000 --- a/apps/contacts/ajax/categories/list.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$categories = OC_Contacts_App::getCategories(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); diff --git a/apps/contacts/ajax/categories/rescan.php b/apps/contacts/ajax/categories/rescan.php deleted file mode 100644 index a06e780395..0000000000 --- a/apps/contacts/ajax/categories/rescan.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -OC_Contacts_App::scanCategories(); -$categories = OC_Contacts_App::getCategories(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); diff --git a/apps/contacts/ajax/contact/add.php b/apps/contacts/ajax/contact/add.php deleted file mode 100644 index c7cec7d946..0000000000 --- a/apps/contacts/ajax/contact/add.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$aid = isset($_POST['aid'])?$_POST['aid']:null; -if(!$aid) { - $aid = min(OC_Contacts_Addressbook::activeIds()); // first active addressbook. -} -OC_Contacts_App::getAddressbook( $aid ); // is owner access check - -$isnew = isset($_POST['isnew'])?$_POST['isnew']:false; -$fn = trim($_POST['fn']); -$n = trim($_POST['n']); - -$vcard = new OC_VObject('VCARD'); -$vcard->setUID(); -$vcard->setString('FN', $fn); -$vcard->setString('N', $n); - -$id = OC_Contacts_VCard::add($aid, $vcard, null, $isnew); -if(!$id) { - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.')))); - OCP\Util::writeLog('contacts', 'ajax/addcontact.php: Recieved non-positive ID on adding card: '.$id, OCP\Util::ERROR); - exit(); -} - -$lastmodified = OC_Contacts_App::lastModified($vcard); -if(!$lastmodified) { - $lastmodified = new DateTime(); -} -OCP\JSON::success(array( - 'data' => array( - 'id' => $id, - 'aid' => $aid, - 'lastmodified' => $lastmodified->format('U') - ) -)); diff --git a/apps/contacts/ajax/contact/addproperty.php b/apps/contacts/ajax/contact/addproperty.php deleted file mode 100644 index 2b80ebd58b..0000000000 --- a/apps/contacts/ajax/contact/addproperty.php +++ /dev/null @@ -1,168 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once __DIR__.'/../loghandler.php'; - -$id = isset($_POST['id'])?$_POST['id']:null; -$name = isset($_POST['name'])?$_POST['name']:null; -$value = isset($_POST['value'])?$_POST['value']:null; -$parameters = isset($_POST['parameters'])?$_POST['parameters']:array(); - -$vcard = OC_Contacts_App::getContactVCard($id); -$l10n = OC_Contacts_App::$l10n; - -if(!$name) { - bailOut($l10n->t('element name is not set.')); -} -if(!$id) { - bailOut($l10n->t('id is not set.')); -} - -if(!$vcard) { - bailOut($l10n->t('Could not parse contact: ').$id); -} - -if(!is_array($value)) { - $value = trim($value); - if(!$value - && in_array( - $name, - array('TEL', 'EMAIL', 'ORG', 'BDAY', 'URL', 'NICKNAME', 'NOTE')) - ) { - bailOut($l10n->t('Cannot add empty property.')); - } -} elseif($name === 'ADR') { // only add if non-empty elements. - $empty = true; - foreach($value as $part) { - if(trim($part) != '') { - $empty = false; - break; - } - } - if($empty) { - bailOut($l10n->t('At least one of the address fields has to be filled out.')); - } -} - -// Prevent setting a duplicate entry -$current = $vcard->select($name); -foreach($current as $item) { - $tmpvalue = (is_array($value)?implode(';', $value):$value); - if($tmpvalue == $item->value) { - bailOut($l10n->t('Trying to add duplicate property: '.$name.': '.$tmpvalue)); - } -} - -if(is_array($value)) { - // NOTE: Important, otherwise the compound value will - // be set in the order the fields appear in the form! - ksort($value); - $value = array_map('strip_tags', $value); -} else { - $value = strip_tags($value); -} - -/* preprocessing value */ -switch($name) { - case 'BDAY': - $date = New DateTime($value); - $value = $date->format(DateTime::ATOM); - case 'FN': - if(!$value) { - // create a method thats returns an alternative for FN. - //$value = getOtherValue(); - } - case 'N': - case 'ORG': - case 'NOTE': - $value = str_replace('\n', ' \\n', $value); - break; - case 'NICKNAME': - // TODO: Escape commas and semicolons. - break; - case 'EMAIL': - $value = strtolower($value); - break; - case 'TEL': - case 'ADR': - break; - case 'IMPP': - if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) { - bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.')); - } - $impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']); - if(is_null($impp)) { - bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE'])); - } - $value = $impp['protocol'] . ':' . $value; - break; -} - -switch($name) { - case 'NOTE': - $vcard->setString('NOTE', $value); - break; - default: - $property = $vcard->addProperty($name, $value); //, $parameters); - break; -} - -$line = count($vcard->children) - 1; - -// Apparently Sabre_VObject_Parameter doesn't do well with -// multiple values or I don't know how to do it. Tanghus. -foreach ($parameters as $key=>$element) { - if(is_array($element) /*&& strtoupper($key) == 'TYPE'*/) { - // NOTE: Maybe this doesn't only apply for TYPE? - // And it probably shouldn't be done here anyways :-/ - foreach($element as $e) { - if($e != '' && !is_null($e)) { - if(trim($e)) { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $e); - } - } - } - } else { - if(trim($element)) { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $element); - } - } -} -$checksum = md5($vcard->children[$line]->serialize()); - -try { - OC_Contacts_VCard::edit($id, $vcard); -} catch(Exception $e) { - bailOut($e->getMessage()); -} - -OCP\JSON::success(array( - 'data' => array( - 'checksum' => $checksum, - 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U')) - ) -); diff --git a/apps/contacts/ajax/contact/delete.php b/apps/contacts/ajax/contact/delete.php deleted file mode 100644 index e73f34f898..0000000000 --- a/apps/contacts/ajax/contact/delete.php +++ /dev/null @@ -1,44 +0,0 @@ -. - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once __DIR__.'/../loghandler.php'; - -$id = isset($_POST['id'])?$_POST['id']:null; -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} - -try { - OC_Contacts_VCard::delete($id); -} catch(Exception $e) { - $msg = $e->getMessage(); - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$msg, - OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); - bailOut($msg); -} -OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/contact/deleteproperty.php b/apps/contacts/ajax/contact/deleteproperty.php deleted file mode 100644 index b76b6e55ed..0000000000 --- a/apps/contacts/ajax/contact/deleteproperty.php +++ /dev/null @@ -1,54 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once __DIR__.'/../loghandler.php'; - -$id = $_POST['id']; -$checksum = $_POST['checksum']; -$l10n = OC_Contacts_App::$l10n; - -$vcard = OC_Contacts_App::getContactVCard( $id ); -$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); -if(is_null($line)) { - bailOut($l10n->t('Information about vCard is incorrect. Please reload the page.')); - exit(); -} - -unset($vcard->children[$line]); - -try { - OC_Contacts_VCard::edit($id, $vcard); -} catch(Exception $e) { - bailOut($e->getMessage()); -} - -OCP\JSON::success(array( - 'data' => array( - 'id' => $id, - 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'), - ) -)); diff --git a/apps/contacts/ajax/contact/details.php b/apps/contacts/ajax/contact/details.php deleted file mode 100644 index 5bf337e645..0000000000 --- a/apps/contacts/ajax/contact/details.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -require_once __DIR__.'/../loghandler.php'; - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = isset($_GET['id'])?$_GET['id']:null; -if(is_null($id)) { - bailOut(OC_Contacts_App::$l10n->t('Missing ID')); -} -$card = OC_Contacts_VCard::find($id); -$vcard = OC_VObject::parse($card['carddata']); -if(is_null($vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error parsing VCard for ID: "'.$id.'"')); -} -$details = OC_Contacts_VCard::structureContact($vcard); - -// Make up for not supporting the 'N' field in earlier version. -if(!isset($details['N'])) { - $details['N'] = array(); - $details['N'][0] = array($details['FN'][0]['value'],'','','',''); -} - -// Don't wanna transfer the photo in a json string. -if(isset($details['PHOTO'])) { - $details['PHOTO'] = true; - //unset($details['PHOTO']); -} else { - $details['PHOTO'] = false; -} -$lastmodified = OC_Contacts_App::lastModified($vcard); -if(!$lastmodified) { - $lastmodified = new DateTime(); -} -$details['id'] = $id; -$details['displayname'] = $card['fullname']; -$details['addressbookid'] = $card['addressbookid']; -$details['lastmodified'] = $lastmodified->format('U'); -OC_Contacts_App::setLastModifiedHeader($vcard); -OCP\JSON::success(array('data' => $details)); diff --git a/apps/contacts/ajax/contact/list.php b/apps/contacts/ajax/contact/list.php deleted file mode 100644 index 4e2509d8d5..0000000000 --- a/apps/contacts/ajax/contact/list.php +++ /dev/null @@ -1,97 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -function cmp($a, $b) -{ - if ($a['displayname'] == $b['displayname']) { - return 0; - } - return ($a['displayname'] < $b['displayname']) ? -1 : 1; -} - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$start = isset($_GET['startat'])?$_GET['startat']:0; -$aid = isset($_GET['aid'])?$_GET['aid']:null; - -if(is_null($aid)) { - // Called initially to get the active addressbooks. - $active_addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); -} else { - // called each time more contacts has to be shown. - $active_addressbooks = array(OC_Contacts_Addressbook::find($aid)); -} - - -session_write_close(); - -// create the addressbook associate array -$contacts_addressbook = array(); -$ids = array(); -foreach($active_addressbooks as $addressbook) { - $ids[] = $addressbook['id']; - if(!isset($contacts_addressbook[$addressbook['id']])) { - $contacts_addressbook[$addressbook['id']] - = array('contacts' => array('type' => 'book',)); - $contacts_addressbook[$addressbook['id']]['displayname'] - = $addressbook['displayname']; - $contacts_addressbook[$addressbook['id']]['permissions'] - = isset($addressbook['permissions']) - ? $addressbook['permissions'] - : '0'; - } -} - -$contacts_alphabet = array(); - -// get next 50 for each addressbook. -foreach($ids as $id) { - if($id) { - $contacts_alphabet = array_merge( - $contacts_alphabet, - OC_Contacts_VCard::all($id, $start, 50) - ); - } -} -// Our new array for the contacts sorted by addressbook -if($contacts_alphabet) { - foreach($contacts_alphabet as $contact) { - // This should never execute. - if(!isset($contacts_addressbook[$contact['addressbookid']])) { - $contacts_addressbook[$contact['addressbookid']] = array( - 'contacts' => array('type' => 'book',) - ); - } - $display = trim($contact['fullname']); - if(!$display) { - $vcard = OC_Contacts_App::getContactVCard($contact['id']); - if(!is_null($vcard)) { - $struct = OC_Contacts_VCard::structureContact($vcard); - $display = isset($struct['EMAIL'][0]) - ? $struct['EMAIL'][0]['value'] - : '[UNKNOWN]'; - } - } - $contacts_addressbook[$contact['addressbookid']]['contacts'][] = array( - 'type' => 'contact', - 'id' => $contact['id'], - 'addressbookid' => $contact['addressbookid'], - 'displayname' => htmlspecialchars($display), - 'permissions' => - isset($contacts_addressbook[$contact['addressbookid']]['permissions']) - ? $contacts_addressbook[$contact['addressbookid']]['permissions'] - : '0', - ); - } -} -unset($contacts_alphabet); -uasort($contacts_addressbook, 'cmp'); - -OCP\JSON::success(array('data' => array('entries' => $contacts_addressbook))); - diff --git a/apps/contacts/ajax/contact/move.php b/apps/contacts/ajax/contact/move.php deleted file mode 100644 index 053343c47e..0000000000 --- a/apps/contacts/ajax/contact/move.php +++ /dev/null @@ -1,29 +0,0 @@ - -* Copyright (c) 2012 Thomas Tanghus -* This file is licensed under the Affero General Public License version 3 or -* later. -* See the COPYING-README file. -*/ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$id = intval($_POST['id']); -$aid = intval($_POST['aid']); -$isaddressbook = isset($_POST['isaddressbook']) ? true: false; - -// Ownership checking -OC_Contacts_App::getAddressbook($aid); -try { - OC_Contacts_VCard::moveToAddressBook($aid, $id, $isaddressbook); -} catch (Exception $e) { - $msg = $e->getMessage(); - OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $id).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR); - OC_JSON::error(array('data' => array('message' => $msg,))); -} - -OC_JSON::success(array('data' => array('ids' => $id,))); \ No newline at end of file diff --git a/apps/contacts/ajax/contact/saveproperty.php b/apps/contacts/ajax/contact/saveproperty.php deleted file mode 100644 index 7ae183538b..0000000000 --- a/apps/contacts/ajax/contact/saveproperty.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -require_once __DIR__.'/../loghandler.php'; - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -$id = isset($_POST['id'])?$_POST['id']:null; -$name = isset($_POST['name'])?$_POST['name']:null; -$value = isset($_POST['value'])?$_POST['value']:null; -$parameters = isset($_POST['parameters'])?$_POST['parameters']:null; -$checksum = isset($_POST['checksum'])?$_POST['checksum']:null; - -if(!$name) { - bailOut(OC_Contacts_App::$l10n->t('element name is not set.')); -} -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} -if(!$checksum) { - bailOut(OC_Contacts_App::$l10n->t('checksum is not set.')); -} -if(is_array($value)) { - $value = array_map('strip_tags', $value); - // NOTE: Important, otherwise the compound value will be - // set in the order the fields appear in the form! - ksort($value); - //if($name == 'CATEGORIES') { - // $value = OC_Contacts_VCard::escapeDelimiters($value, ','); - //} else { - $value = OC_Contacts_VCard::escapeDelimiters($value, ';'); - //} -} else { - $value = trim(strip_tags($value)); -} - -$vcard = OC_Contacts_App::getContactVCard( $id ); -$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); -if(is_null($line)) { - bailOut(OC_Contacts_App::$l10n->t( - 'Information about vCard is incorrect. Please reload the page: ').$checksum - ); -} -$element = $vcard->children[$line]->name; - -if($element != $name) { - bailOut(OC_Contacts_App::$l10n->t( - 'Something went FUBAR. ').$name.' != '.$element - ); -} - -/* preprocessing value */ -switch($element) { - case 'BDAY': - $date = New DateTime($value); - $value = $date->format('Y-m-d'); - break; - case 'FN': - if(!$value) { - // create a method thats returns an alternative for FN. - //$value = getOtherValue(); - } - break; - case 'NOTE': - $value = str_replace('\n', '\\n', $value); - break; - case 'EMAIL': - $value = strtolower($value); - break; - case 'IMPP': - if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) { - bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.')); - } - $impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']); - if(is_null($impp)) { - bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE'])); - } - $value = $impp['protocol'] . ':' . $value; - break; -} - -if(!$value) { - unset($vcard->children[$line]); - $checksum = ''; -} else { - /* setting value */ - switch($element) { - case 'BDAY': - // I don't use setDateTime() because that formats it as YYYYMMDD instead - // of YYYY-MM-DD which is what the RFC recommends. - $vcard->children[$line]->setValue($value); - $vcard->children[$line]->parameters = array(); - $vcard->children[$line]->add( - new Sabre_VObject_Parameter('VALUE', 'DATE') - ); - debug('Setting value:'.$name.' '.$vcard->children[$line]); - break; - case 'CATEGORIES': - debug('Setting string:'.$name.' '.$value); - $vcard->children[$line]->setValue($value); - break; - case 'EMAIL': - case 'TEL': - case 'ADR': - case 'IMPP': - debug('Setting element: (EMAIL/TEL/ADR)'.$element); - $vcard->children[$line]->setValue($value); - $vcard->children[$line]->parameters = array(); - if(!is_null($parameters)) { - debug('Setting parameters: '.$parameters); - foreach($parameters as $key => $parameter) { - debug('Adding parameter: '.$key); - if(is_array($parameter)) { - foreach($parameter as $val) { - if(trim($val)) { - debug('Adding parameter: '.$key.'=>'.$val); - $vcard->children[$line]->add(new Sabre_VObject_Parameter( - $key, - strtoupper(strip_tags($val))) - ); - } - } - } else { - if(trim($parameter)) { - $vcard->children[$line]->add(new Sabre_VObject_Parameter( - $key, - strtoupper(strip_tags($parameter))) - ); - } - } - } - } - break; - default: - debug('Setting string:'.$name.' '.$value); - $vcard->setString($name, $value); - break; - } - // Do checksum and be happy - $checksum = md5($vcard->children[$line]->serialize()); -} -//debug('New checksum: '.$checksum); - -try { - OC_Contacts_VCard::edit($id, $vcard); -} catch(Exception $e) { - bailOut($e->getMessage()); -} - -OCP\JSON::success(array('data' => array( - 'line' => $line, - 'checksum' => $checksum, - 'oldchecksum' => $_POST['checksum'], - 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'), -))); diff --git a/apps/contacts/ajax/cropphoto.php b/apps/contacts/ajax/cropphoto.php deleted file mode 100644 index eb9f1fcdb5..0000000000 --- a/apps/contacts/ajax/cropphoto.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$tmpkey = $_GET['tmpkey']; -$requesttoken = $_GET['requesttoken']; -$id = $_GET['id']; -$tmpl = new OCP\Template("contacts", "part.cropphoto"); -$tmpl->assign('tmpkey', $tmpkey); -$tmpl->assign('id', $id); -$tmpl->assign('requesttoken', $requesttoken); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/currentphoto.php b/apps/contacts/ajax/currentphoto.php deleted file mode 100644 index 96080e661e..0000000000 --- a/apps/contacts/ajax/currentphoto.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -if (!isset($_GET['id'])) { - bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); -} - -$contact = OC_Contacts_App::getContactVCard($_GET['id']); -// invalid vcard -if( is_null($contact)) { - bailOut(OC_Contacts_App::$l10n->t('Error reading contact photo.')); -} else { - $image = new OC_Image(); - if(!$image->loadFromBase64($contact->getAsString('PHOTO'))) { - $image->loadFromBase64($contact->getAsString('LOGO')); - } - if($image->valid()) { - $tmpkey = 'contact-photo-'.$contact->getAsString('UID'); - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey))); - exit(); - } else { - bailOut(OC_Contacts_App::$l10n->t('Error saving temporary file.')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('The loading photo is not valid.')); - } -} diff --git a/apps/contacts/ajax/editaddress.php b/apps/contacts/ajax/editaddress.php deleted file mode 100644 index b5e4b72ed5..0000000000 --- a/apps/contacts/ajax/editaddress.php +++ /dev/null @@ -1,41 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = $_GET['id']; -$checksum = isset($_GET['checksum'])?$_GET['checksum']:''; -$vcard = OC_Contacts_App::getContactVCard($id); -$adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); - -$tmpl = new OCP\Template("contacts", "part.edit_address_dialog"); -if($checksum) { - $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); - $element = $vcard->children[$line]; - $adr = OC_Contacts_VCard::structureProperty($element); - $types = array(); - if(isset($adr['parameters']['TYPE'])) { - if(is_array($adr['parameters']['TYPE'])) { - $types = array_map('htmlspecialchars', $adr['parameters']['TYPE']); - $types = array_map('strtoupper', $types); - } else { - $types = array(strtoupper(htmlspecialchars($adr['parameters']['TYPE']))); - } - } - $tmpl->assign('types', $types, false); - $adr = array_map('htmlspecialchars', $adr['value']); - $tmpl->assign('adr', $adr, false); -} - -$tmpl->assign('id', $id); -$tmpl->assign('adr_types', $adr_types); - -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page, 'checksum'=>$checksum))); diff --git a/apps/contacts/ajax/editname.php b/apps/contacts/ajax/editname.php deleted file mode 100644 index eb55634011..0000000000 --- a/apps/contacts/ajax/editname.php +++ /dev/null @@ -1,34 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -$tmpl = new OCP\Template("contacts", "part.edit_name_dialog"); - -$id = isset($_GET['id'])?$_GET['id']:''; - -if($id) { - $vcard = OC_Contacts_App::getContactVCard($id); - $name = array('', '', '', '', ''); - if($vcard->__isset('N')) { - $property = $vcard->__get('N'); - if($property) { - $name = OC_Contacts_VCard::structureProperty($property); - } - } - $name = array_map('htmlspecialchars', $name['value']); - $tmpl->assign('name', $name, false); - $tmpl->assign('id', $id, false); -} else { - bailOut(OC_Contacts_App::$l10n->t('Contact ID is missing.')); -} -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page))); diff --git a/apps/contacts/ajax/importdialog.php b/apps/contacts/ajax/importdialog.php deleted file mode 100644 index 691522538f..0000000000 --- a/apps/contacts/ajax/importdialog.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -$tmpl = new OCP\Template('contacts', 'part.import'); -$tmpl->assign('path', $_POST['path']); -$tmpl->assign('filename', $_POST['filename']); -$tmpl->printpage(); diff --git a/apps/contacts/ajax/loadcard.php b/apps/contacts/ajax/loadcard.php deleted file mode 100644 index 82501ffd2f..0000000000 --- a/apps/contacts/ajax/loadcard.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); -$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); -$maxUploadFilesize = min($upload_max_filesize, $post_max_size); -$requesttoken = $_GET['requesttoken']; - -$freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace, 0); -$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); -$adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); -$phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); -$email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); -$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP'); -$ims = OC_Contacts_App::getIMOptions(); -$im_protocols = array(); -foreach($ims as $name => $values) { - $im_protocols[$name] = $values['displayname']; -} - -$tmpl = new OCP\Template('contacts', 'part.contact'); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); -$tmpl->assign('requesttoken', $_SERVER['HTTP_REQUESTTOKEN']); -$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); -$tmpl->assign('adr_types', $adr_types); -$tmpl->assign('phone_types', $phone_types); -$tmpl->assign('email_types', $email_types); -$tmpl->assign('impp_types', $impp_types, false); -$tmpl->assign('im_protocols', $im_protocols, false); -$tmpl->assign('requesttoken', $requesttoken); -$tmpl->assign('id', ''); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/loadintro.php b/apps/contacts/ajax/loadintro.php deleted file mode 100644 index 1da08950ca..0000000000 --- a/apps/contacts/ajax/loadintro.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - - -$tmpl = new OCP\Template('contacts', 'part.no_contacts'); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/loghandler.php b/apps/contacts/ajax/loghandler.php deleted file mode 100644 index be4b98c111..0000000000 --- a/apps/contacts/ajax/loghandler.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -function bailOut($msg, $tracelevel=1, $debuglevel=OCP\Util::ERROR) -{ - OCP\JSON::error(array('data' => array('message' => $msg))); - debug($msg, $tracelevel, $debuglevel); - exit(); -} - -function debug($msg, $tracelevel=0, $debuglevel=OCP\Util::DEBUG) -{ - if(PHP_VERSION >= "5.4") { - $call = debug_backtrace(false, $tracelevel+1); - } else { - $call = debug_backtrace(false); - } - error_log('trace: '.print_r($call, true)); - $call = $call[$tracelevel]; - if($debuglevel !== false) { - OCP\Util::writeLog('contacts', - $call['file'].'. Line: '.$call['line'].': '.$msg, - $debuglevel); - } -} diff --git a/apps/contacts/ajax/oc_photo.php b/apps/contacts/ajax/oc_photo.php deleted file mode 100644 index fe37b530f8..0000000000 --- a/apps/contacts/ajax/oc_photo.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -if(!isset($_GET['id'])) { - bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); -} - -if(!isset($_GET['path'])) { - bailOut(OC_Contacts_App::$l10n->t('No photo path was submitted.')); -} - -$localpath = OC_Filesystem::getLocalFile($_GET['path']); -$tmpkey = 'contact-photo-'.$_GET['id']; - -if(!file_exists($localpath)) { - bailOut(OC_Contacts_App::$l10n->t('File doesn\'t exist:').$localpath); -} - -$image = new OC_Image(); -if(!$image) { - bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); -} -if(!$image->loadFromFile($localpath)) { - bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); -} -if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. -} -if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - OCP\Util::writeLog('contacts', - 'ajax/oc_photo.php: Couldn\'t save correct image orientation: '.$localpath, - OCP\Util::DEBUG); -} -if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey))); - exit(); -} else { - bailOut('Couldn\'t save temporary image: '.$tmpkey); -} diff --git a/apps/contacts/ajax/savecrop.php b/apps/contacts/ajax/savecrop.php deleted file mode 100644 index 2483d0f712..0000000000 --- a/apps/contacts/ajax/savecrop.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain; charset=utf-8'); - -require_once 'loghandler.php'; - -$image = null; - -$x1 = (isset($_POST['x1']) && $_POST['x1']) ? $_POST['x1'] : 0; -//$x2 = isset($_POST['x2']) ? $_POST['x2'] : -1; -$y1 = (isset($_POST['y1']) && $_POST['y1']) ? $_POST['y1'] : 0; -//$y2 = isset($_POST['y2']) ? $_POST['y2'] : -1; -$w = (isset($_POST['w']) && $_POST['w']) ? $_POST['w'] : -1; -$h = (isset($_POST['h']) && $_POST['h']) ? $_POST['h'] : -1; -$tmpkey = isset($_POST['tmpkey']) ? $_POST['tmpkey'] : ''; -$id = isset($_POST['id']) ? $_POST['id'] : ''; - -if($tmpkey == '') { - bailOut('Missing key to temporary file.'); -} - -if($id == '') { - bailOut('Missing contact id.'); -} - -OCP\Util::writeLog('contacts', 'savecrop.php: key: '.$tmpkey, OCP\Util::DEBUG); - -$data = OC_Cache::get($tmpkey); -if($data) { - $image = new OC_Image(); - if($image->loadFromdata($data)) { - $w = ($w != -1 ? $w : $image->width()); - $h = ($h != -1 ? $h : $image->height()); - OCP\Util::writeLog('contacts', - 'savecrop.php, x: '.$x1.' y: '.$y1.' w: '.$w.' h: '.$h, - OCP\Util::DEBUG); - if($image->crop($x1, $y1, $w, $h)) { - if(($image->width() <= 200 && $image->height() <= 200) - || $image->resize(200)) { - $vcard = OC_Contacts_App::getContactVCard($id); - if(!$vcard) { - OC_Cache::remove($tmpkey); - bailOut(OC_Contacts_App::$l10n - ->t('Error getting contact object.')); - } - if($vcard->__isset('PHOTO')) { - OCP\Util::writeLog('contacts', - 'savecrop.php: PHOTO property exists.', - OCP\Util::DEBUG); - $property = $vcard->__get('PHOTO'); - if(!$property) { - OC_Cache::remove($tmpkey); - bailOut(OC_Contacts_App::$l10n - ->t('Error getting PHOTO property.')); - } - $property->setValue($image->__toString()); - $property->parameters[] - = new Sabre_VObject_Parameter('ENCODING', 'b'); - $property->parameters[] - = new Sabre_VObject_Parameter('TYPE', $image->mimeType()); - $vcard->__set('PHOTO', $property); - } else { - OCP\Util::writeLog('contacts', - 'savecrop.php: files: Adding PHOTO property.', - OCP\Util::DEBUG); - $vcard->addProperty('PHOTO', - $image->__toString(), array('ENCODING' => 'b', - 'TYPE' => $image->mimeType())); - } - $now = new DateTime; - $vcard->setString('REV', $now->format(DateTime::W3C)); - if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error saving contact.')); - } - OCP\JSON::success(array( - 'data' => array( - 'id' => $id, - 'width' => $image->width(), - 'height' => $image->height(), - 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U') - ) - )); - } else { - bailOut(OC_Contacts_App::$l10n->t('Error resizing image')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('Error cropping image')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('Error creating temporary image')); - } -} else { - bailOut(OC_Contacts_App::$l10n->t('Error finding image: ').$tmpkey); -} - -OC_Cache::remove($tmpkey); diff --git a/apps/contacts/ajax/selectaddressbook.php b/apps/contacts/ajax/selectaddressbook.php deleted file mode 100644 index e5527c8e5f..0000000000 --- a/apps/contacts/ajax/selectaddressbook.php +++ /dev/null @@ -1,24 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$books = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -if(count($books) > 1) { - $addressbooks = array(); - foreach($books as $book) { - $addressbooks[] = array('id' => $book['id'], 'name' => $book['displayname']); - } - $tmpl = new OCP\Template("contacts", "part.selectaddressbook"); - $tmpl->assign('addressbooks', $addressbooks); - $page = $tmpl->fetchPage(); - OCP\JSON::success(array('data' => array( 'type' => 'dialog', 'page' => $page ))); -} else { - OCP\JSON::success(array('data' => array( 'type' => 'result', 'id' => $books[0]['id'] ))); -} \ No newline at end of file diff --git a/apps/contacts/ajax/uploadimport.php b/apps/contacts/ajax/uploadimport.php deleted file mode 100644 index 87032b731a..0000000000 --- a/apps/contacts/ajax/uploadimport.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -$l10n = OC_Contacts_App::$l10n; - -$view = OCP\Files::getStorage('contacts'); -if(!$view->file_exists('imports')) { - $view->mkdir('imports'); -} -$tmpfile = md5(rand()); - -// If it is a Drag'n'Drop transfer it's handled here. -$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false); -if($fn) { - if($view->file_put_contents('/imports/'.$fn, file_get_contents('php://input'))) { - OCP\JSON::success(array('data' => array('file'=>$tmpfile, 'name'=>$fn))); - exit(); - } else { - bailOut($l10n->t('Error uploading contacts to storage.')); - } -} - -// File input transfers are handled here -if (!isset($_FILES['importfile'])) { - OCP\Util::writeLog('contacts', - 'ajax/uploadphoto.php: No file was uploaded. Unknown error.', - OCP\Util::DEBUG); - OCP\JSON::error(array(' - data' => array( - 'message' => 'No file was uploaded. Unknown error' ))); - exit(); -} -$error = $_FILES['importfile']['error']; -if($error !== UPLOAD_ERR_OK) { - $errors = array( - 0=>$l10n->t("There is no error, the file uploaded with success"), - 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>$l10n->t("The uploaded file was only partially uploaded"), - 4=>$l10n->t("No file was uploaded"), - 6=>$l10n->t("Missing a temporary folder") - ); - bailOut($errors[$error]); -} -$file=$_FILES['importfile']; - -if(file_exists($file['tmp_name'])) { - if($view->file_put_contents('/imports/'.$file['name'], file_get_contents($file['tmp_name']))) { - OCP\JSON::success(array('data' => array('file'=>$file['name'], 'name'=>$file['name']))); - } else { - bailOut($l10n->t('Error uploading contacts to storage.')); - } -} else { - bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); -} diff --git a/apps/contacts/ajax/uploadphoto.php b/apps/contacts/ajax/uploadphoto.php deleted file mode 100644 index 34830b291d..0000000000 --- a/apps/contacts/ajax/uploadphoto.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain; charset=utf-8'); -require_once 'loghandler.php'; -$l10n = OC_Contacts_App::$l10n; -// If it is a Drag'n'Drop transfer it's handled here. -$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false); -if ($fn) { - if (!isset($_GET['id'])) { - bailOut($l10n->t('No contact ID was submitted.')); - } - $id = $_GET['id']; - $tmpkey = 'contact-photo-'.md5($fn); - $data = file_get_contents('php://input'); - $image = new OC_Image(); - sleep(1); // Apparently it needs time to load the data. - if($image->loadFromData($data)) { - if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. - } - if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpkey); - } - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array( - 'data' => array( - 'mime'=>$_SERVER['CONTENT_TYPE'], - 'name'=>$fn, - 'id'=>$id, - 'tmp'=>$tmpkey))); - exit(); - } else { - bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); - } - } else { - bailOut($l10n->t('Couldn\'t load temporary image: ').$tmpkey); - } -} - -// Uploads from file dialog are handled here. -if (!isset($_POST['id'])) { - bailOut($l10n->t('No contact ID was submitted.')); -} -if (!isset($_FILES['imagefile'])) { - bailOut($l10n->t('No file was uploaded. Unknown error')); -} - -$error = $_FILES['imagefile']['error']; -if($error !== UPLOAD_ERR_OK) { - $errors = array( - 0=>$l10n->t("There is no error, the file uploaded with success"), - 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>$l10n->t("The uploaded file was only partially uploaded"), - 4=>$l10n->t("No file was uploaded"), - 6=>$l10n->t("Missing a temporary folder") - ); - bailOut($errors[$error]); -} -$file=$_FILES['imagefile']; - -if(file_exists($file['tmp_name'])) { - $tmpkey = 'contact-photo-'.md5(basename($file['tmp_name'])); - $image = new OC_Image(); - if($image->loadFromFile($file['tmp_name'])) { - if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. - } - if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpkey); - } - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array( - 'data' => array( - 'mime'=>$file['type'], - 'size'=>$file['size'], - 'name'=>$file['name'], - 'id'=>$_POST['id'], - 'tmp'=>$tmpkey, - ))); - exit(); - } else { - bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); - } - } else { - bailOut($l10n->t('Couldn\'t load temporary image: ').$file['tmp_name']); - } -} else { - bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); -} diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php deleted file mode 100644 index 102c04705a..0000000000 --- a/apps/contacts/appinfo/app.php +++ /dev/null @@ -1,31 +0,0 @@ - 'contacts_index', - 'order' => 10, - 'href' => OCP\Util::linkTo( 'contacts', 'index.php' ), - 'icon' => OCP\Util::imagePath( 'settings', 'users.svg' ), - 'name' => OC_L10N::get('contacts')->t('Contacts') )); - -OCP\Util::addscript('contacts', 'loader'); -OC_Search::registerProvider('OC_Search_Provider_Contacts'); -OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact'); -OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact'); - diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml deleted file mode 100644 index 1e2e097e49..0000000000 --- a/apps/contacts/appinfo/database.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - *dbname* - true - false - - utf8 - - - - *dbprefix*contacts_addressbooks - - - - - id - integer - 0 - true - 1 - true - 4 - - - - userid - text - - true - 255 - - - - displayname - text - - false - 255 - - - - uri - text - - false - 200 - - - - description - text - false - - - - ctag - integer - 1 - true - true - 4 - - - - active - integer - 1 - true - 4 - - - - -
    - - - - *dbprefix*contacts_cards - - - - - id - integer - 0 - true - 1 - true - 4 - - - - addressbookid - integer - - true - true - 4 - - - - fullname - text - - false - 255 - - - - carddata - text - false - - - - uri - text - - false - 200 - - - - lastmodified - integer - - false - true - 4 - - - - -
    - -
    diff --git a/apps/contacts/appinfo/info.xml b/apps/contacts/appinfo/info.xml deleted file mode 100644 index 74fd6b012d..0000000000 --- a/apps/contacts/appinfo/info.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - contacts - Contacts - AGPL - Jakob Sack - 4 - true - Address book with CardDAV support. - - - - appinfo/remote.php - appinfo/remote.php - - diff --git a/apps/contacts/appinfo/migrate.php b/apps/contacts/appinfo/migrate.php deleted file mode 100644 index 19c960c75a..0000000000 --- a/apps/contacts/appinfo/migrate.php +++ /dev/null @@ -1,70 +0,0 @@ -'contacts_addressbooks', - 'matchcol'=>'userid', - 'matchval'=>$this->uid, - 'idcol'=>'id' - ); - $ids = $this->content->copyRows( $options ); - - $options = array( - 'table'=>'contacts_cards', - 'matchcol'=>'addressbookid', - 'matchval'=>$ids - ); - - // Export tags - $ids2 = $this->content->copyRows( $options ); - - // If both returned some ids then they worked - if(is_array($ids) && is_array($ids2)) { - return true; - } else { - return false; - } - - } - - // Import function for contacts - function import( ) { - switch( $this->appinfo->version ) { - default: - // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( 'SELECT * FROM `contacts_addressbooks` WHERE `userid` LIKE ?' ); - $results = $query->execute( array( $this->olduid ) ); - $idmap = array(); - while( $row = $results->fetchRow() ) { - // Import each addressbook - $addressbookquery = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)' ); - $addressbookquery->execute( array( $this->uid, $row['displayname'], $row['uri'], $row['description'], $row['ctag'] ) ); - // Map the id - $idmap[$row['id']] = OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - // Make the addressbook active - OC_Contacts_Addressbook::setActive($idmap[$row['id']], true); - } - // Now tags - foreach($idmap as $oldid => $newid) { - - $query = $this->content->prepare( 'SELECT * FROM `contacts_cards` WHERE `addressbookid` LIKE ?' ); - $results = $query->execute( array( $oldid ) ); - while( $row = $results->fetchRow() ){ - // Import the contacts - $contactquery = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)' ); - $contactquery->execute( array( $newid, $row['fullname'], $row['carddata'], $row['uri'], $row['lastmodified'] ) ); - } - } - // All done! - break; - } - - return true; - } - -} - -// Load the provider -new OC_Migration_Provider_Contacts( 'contacts' ); \ No newline at end of file diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php deleted file mode 100644 index d8677d7f73..0000000000 --- a/apps/contacts/appinfo/remote.php +++ /dev/null @@ -1,61 +0,0 @@ -. - * - */ - -OCP\App::checkAppEnabled('contacts'); - -if(substr($_SERVER["REQUEST_URI"], 0, strlen(OC_App::getAppWebPath('contacts').'/carddav.php')) == OC_App::getAppWebPath('contacts').'/carddav.php') { - $baseuri = OC_App::getAppWebPath('contacts').'/carddav.php'; -} - -// only need authentication apps -$RUNTIME_APPTYPES=array('authentication'); -OC_App::loadApps($RUNTIME_APPTYPES); - -// Backends -$authBackend = new OC_Connector_Sabre_Auth(); -$principalBackend = new OC_Connector_Sabre_Principal(); -$carddavBackend = new OC_Connector_Sabre_CardDAV(); - -// Root nodes -$principalCollection = new Sabre_CalDAV_Principal_Collection($principalBackend); -$principalCollection->disableListing = true; // Disable listening - -$addressBookRoot = new OC_Connector_Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); -$addressBookRoot->disableListing = true; // Disable listening - -$nodes = array( - $principalCollection, - $addressBookRoot, - ); - -// Fire up server -$server = new Sabre_DAV_Server($nodes); -$server->setBaseUri($baseuri); -// Add plugins -$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud')); -$server->addPlugin(new Sabre_CardDAV_Plugin()); -$server->addPlugin(new Sabre_DAVACL_Plugin()); -$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new OC_Connector_Sabre_CardDAV_VCFExportPlugin()); - -// And off we go! -$server->exec(); diff --git a/apps/contacts/appinfo/update.php b/apps/contacts/appinfo/update.php deleted file mode 100644 index cc00b325e1..0000000000 --- a/apps/contacts/appinfo/update.php +++ /dev/null @@ -1,25 +0,0 @@ -execute(array()); - - // Then get all the active address books. - $stmt = OCP\DB::prepare( 'SELECT `userid`,`configvalue` FROM `*PREFIX*preferences` WHERE `appid`=\'contacts\' AND `configkey`=\'openaddressbooks\'' ); - $result = $stmt->execute(array()); - - // Prepare statement for updating the new 'active' field. - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `active`=? WHERE `id`=? AND `userid`=?' ); - while( $row = $result->fetchRow()) { - $ids = explode(';', $row['configvalue']); - foreach($ids as $id) { - $r = $stmt->execute(array(1, $id, $row['userid'])); - } - } - - // Remove the old preferences. - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `appid`=\'contacts\' AND `configkey`=\'openaddressbooks\'' ); - $result = $stmt->execute(array()); -} diff --git a/apps/contacts/appinfo/version b/apps/contacts/appinfo/version deleted file mode 100644 index 72f9fa8202..0000000000 --- a/apps/contacts/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2.4 \ No newline at end of file diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php deleted file mode 100644 index 264eb30836..0000000000 --- a/apps/contacts/carddav.php +++ /dev/null @@ -1,6 +0,0 @@ - dt { - font-weight: bold; -}*/ -#leftcontent { top: 3.5em !important; padding: 0; margin: 0; } -#leftcontent a { padding: 0 0 0 25px; } -#rightcontent { top: 3.5em !important; padding-top: 5px; } -#leftcontent h3 { cursor: pointer; -moz-transition: background 300ms ease 0s; background: none no-repeat scroll 1em center #eee; border-bottom: 1px solid #ddd; border-top: 1px solid #fff; display: block; max-width: 100%; padding: 0.5em 0.8em; color: #666; text-shadow: 0 1px 0 #f8f8f8; font-size: 1.2em; } -#leftcontent h3:hover,#leftcontent h3:active,#leftcontent h3.active { background-color: #DBDBDB; border-bottom: 1px solid #CCCCCC; border-top: 1px solid #D4D4D4; color: #333333; font-weight: bold; } -#contacts { position: fixed; background: #fff; max-width: 100%; width: 20em; left: 12.5em; top: 3.7em; bottom: 3em; overflow: auto; padding: 0; margin: 0; } -.contacts a { height: 23px; display: block; left: 12.5em; margin: 0 0 0 0; padding: 0 0 0 25px; } -.contacts li.ui-draggable { height: 23px; } -.ui-draggable-dragging { width: 17em; cursor: move; } -.ui-state-hover { border: 1px solid dashed; } -#bottomcontrols { padding: 0; bottom:0px; height:2.8em; width: 20em; margin:0; background:#eee; border-top:1px solid #ccc; position:fixed; -moz-box-shadow: 0 -3px 3px -3px #000; -webkit-box-shadow: 0 -3px 3px -3px #000; box-shadow: 0 -3px 3px -3px #000;} -#bottomcontrols img { margin-top: 0.35em; } -#uploadprogressbar { display: none; padding: 0; bottom: 3em; height:2em; width: 20em; margin:0; background:#eee; border:1px solid #ccc; position:fixed; } -#contacts_newcontact, #bottomcontrols .settings { float: left; margin: 0.2em 0 0 1em; border: 0 none; border-radius: 0; -moz-box-shadow: none; box-shadow: none; outline: 0 none; } -#bottomcontrols .settings { float: right; margin: 0.2em 1em 0 0; } -#actionbar { clear: both; height: 30px;} -#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } -#contacts_downloadcard {position:relative; float:left; background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } -#contacts_propertymenu { clear: left; float:left; max-width: 15em; margin: 2em; } -#contacts_propertymenu_button { position:relative;top:0;left:0; margin: 0; } -#contacts_propertymenu_dropdown { background-color: #fff; position:relative; right:0; overflow:hidden; text-overflow:ellipsis; border: thin solid #1d2d44; box-shadow: 0 3px 5px #bbb; /* -moz-box-shadow:0 0 10px #000; -webkit-box-shadow:0 0 10px #000; box-shadow:0 0 10px #000; -moz-border-radius:0.5em; -webkit-border-radius:0.5em; border-radius:0.5em; -moz-border-radius:0.5em; -webkit-border-radius:0.5em;*/ border-radius: 3px; } -#contacts_propertymenu li { display: block; font-weight: bold; height: 20px; } -#contacts_propertymenu li a { padding: 3px; display: block } -#contacts_propertymenu li:hover { background-color: #1d2d44; } -#contacts_propertymenu li a:hover { color: #fff } -#card { width: auto; font-size: 10px; /*max-width: 70em; border: thin solid lightgray; display: block;*/ } -#firstrun { width: 100%; position: absolute; top: 5em; left: 0; text-align: center; font-weight:bold; font-size:1.5em; color:#777; } -#firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; } - -#card input[type="text"].contacts_property,input[type="email"].contacts_property,input[type="url"].contacts_property { width: 14em; float: left; font-weight: bold; } -.categories { float: left; width: 16em; } -#card input[type="checkbox"].contacts_property, #card input[type="text"], #card input[type="email"], #card input[type="url"], #card input[type="tel"], #card input[type="date"], #card select, #card textarea { background-color: #fefefe; border: 0 !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; } -#card input[type="text"]:hover, #card input[type="text"]:focus, #card input[type="text"]:active, input[type="email"]:hover, #card input[type="url"]:hover, #card input[type="tel"]:hover, #card input[type="date"]:hover, #card input[type="date"], #card input[type="date"]:hover, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="email"]:active, #card input[type="url"]:active, #card input[type="tel"]:active, #card textarea:focus, #card textarea:hover { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #ddd, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; } -#card textarea { width: 80%; min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;} -dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } -.form dt { display: table-cell; clear: left; float: left; width: 7em; margin: 0; padding: 0.8em 0.5em 0 0; text-align:right; text-overflow:ellipsis; o-text-overflow: ellipsis; vertical-align: text-bottom; color: #bbb;/* white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap;*/ } -.form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0px; white-space: nowrap; vertical-align: text-bottom; } -label:hover, dt:hover { color: #333; } -/*::-webkit-input-placeholder { color: #bbb; } -:-moz-placeholder { color: #bbb; } -:-ms-input-placeholder { color: #bbb; }*/ -.droptarget { margin: 0.5em; padding: 0.5em; border: thin solid #ccc; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } -.droppable { margin: 0.5em; padding: 0.5em; border: thin dashed #333; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } -.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; } -.ui-autocomplete-loading { background: url('%webroot%/core/img/loading.gif') right center no-repeat; } -.ui-autocomplete-input { margin-top: 0.5em; } /* Ugly hack */ -.float { float: left; } -.svg { border: inherit; background: inherit; } -.listactions { height: 1em; width:60px; float: left; clear: right; } -.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud, .share { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } -.add:hover,.edit:hover,.delete:hover,.mail:hover, .globe:hover, .upload:hover, .download:hover .cloud:hover { opacity: 1.0 } -.add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; } -.delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } -.edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; } -.share { background:url('%webroot%/core/img/actions/share.svg') no-repeat center; } -.mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } -.upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } -.download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } -.cloud { background:url('%webroot%/core/img/places/picture.svg') no-repeat center; } -/*.globe { background:url('../img/globe.svg') no-repeat center; }*/ -.globe { background:url('%webroot%/core/img/actions/public.svg') no-repeat center; } -.transparent{ opacity: 0.6; } -#edit_name_dialog { padding:0; } -#edit_name_dialog > input { width: 15em; } -#edit_address_dialog { /*width: 30em;*/ } -#edit_address_dialog > input { width: 15em; } -#edit_photo_dialog_img { display: block; min-width: 150; min-height: 200; } -#fn { float: left !important; width: 18em !important; } -#name { /*position: absolute; top: 0px; left: 0px;*/ min-width: 25em; height: 2em; clear: right; display: block; } -#identityprops { /*position: absolute; top: 2.5em; left: 0px;*/ } -#contact_photo { float: left; margin: 1em; } -#contact_identity { min-width: 30em; padding: 0.5em;} -.contactsection { position: relative; float: left; width: 35em; padding: 0.5em; height: auto; } - -#cropbox { margin: auto; } -#contacts_details_photo_wrapper { width: 150px; } -#contacts_details_photo_wrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center center; cursor: wait; } -.contacts_details_photo { border-radius: 0.5em; border: thin solid #bbb; margin: 0.3em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } -.contacts_details_photo:hover { background: #fff; cursor: default; } -#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:22px; padding:0px; background-color:#fff; list-style-type:none; border-radius: 0.5em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; } -#phototools li { display: inline; } -#phototools li a { float:left; cursor:pointer; width:22px; height:22px; opacity: 0.6; } -#phototools li a:hover { opacity: 0.8; } - -/* Address editor */ -#addressdisplay { padding: 0.5em; } -dl.addresscard { background-color: #fff; float: left; width: auto; margin: 0 0.3em 0.3em 0.3em; padding: 0; border: 0; } -dl.addresscard dd {} -dl.addresscard dt { padding: 0.3em; font-weight: bold; clear: both; color: #aaa; } -dl.addresscard dt:hover { color:#777; } -dl.addresscard dd > ul { margin: 0.3em; padding: 0.3em; } -dl.addresscard .action { float: right; } -#address dt { width: 30%; white-space:nowrap; } -#address dd { width: 66%; } -#address input { width: 12em; padding: 0.6em 0.5em 0.4em; } -#address input:-moz-placeholder { color: #aaa; } -#address input::-webkit-input-placeholder { color: #aaa; } -#address input:-ms-input-placeholder { color: #aaa; } -#address input:placeholder { color: #aaa; } -#adr_type {} /* Select */ -#adr_pobox {} -#adr_extended {} -#adr_street {} -#adr_city {} -#adr_region {} -#adr_zipcode {} -#adr_country {} - -#file_upload_form { width: 0; height: 0; } -#file_upload_target, #import_upload_target, #crop_target { display:none; } -#file_upload_start, #import_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1001; width:0; height:0;} -#import_upload_start { width: 20px; height: 20px; margin: 0 0 -24px 0; padding: 0;} -input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; } -.big { font-weight:bold; font-size:1.2em; } -.huge { font-weight:bold; font-size:1.5em; } -.propertycontainer dd { float: left; width: 25em; } -/*.propertylist { clear: none; max-width: 33em; }*/ -.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; display: block; clear: both; } -.propertycontainer[data-element="EMAIL"] > input[type="email"],.propertycontainer[data-element="TEL"] > input[type="text"] { min-width: 12em !important; float: left; } -.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 16px; height: 16px; vertical-align: middle; padding: 0; } -.propertylist li > select { float: left; max-width: 8em; } -.propertylist li > .select_wrapper { float: left; overflow: hidden; color: #bbb; font-size: 0.8em; } -.propertylist li > .select_wrapper select { float: left; overflow: hidden; color: #bbb; } -.propertylist li > .select_wrapper select option { color: #777; } -.propertylist li > .select_wrapper select:hover,.propertylist li > select:focus,.propertylist li > select:active { color: #777; } -.propertylist li > .select_wrapper select.impp { margin-left: -23px; direction: rtl; } -.propertylist li > .select_wrapper select.types { margin-right: -23px; } -.propertylist li > input[type="checkbox"].impp { clear: none; } -.propertylist li > label.xab { display: block; color: #bbb; float:left; clear: both; padding: 0.5em 0 0 2.5em; } -.propertylist li > label.xab:hover { color: #777; } -.typelist[type="button"] { float: left; max-width: 8em; border: 0; background-color: #fff; color: #bbb; box-shadow: none; } /* for multiselect */ -.typelist[type="button"]:hover { color: #777; } /* for multiselect */ -.addresslist { clear: both; font-weight: bold; } -#ninjahelp { position: absolute; bottom: 0; left: 0; right: 0; padding: 1em; margin: 1em; opacity: 0.9; } -#ninjahelp .close { position: absolute; top: 5px; right: 5px; height: 20px; width: 20px; } -#ninjahelp h2, .help-section h3 { width: 100%; font-weight: bold; text-align: center; } -#ninjahelp h2 { font-size: 1.4em; } -.help-section { width: 45%; min-width: 35em; float: left; } -.help-section h3 { font-size: 1.2em; } -.help-section dl { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } -.help-section dt { display: table-cell; clear: left; float: left; width: 35%; margin: 0; padding: 0.2em; text-align: right; text-overflow: ellipsis; vertical-align: text-bottom; font-weight: bold: } -.help-section dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0.2em; white-space: nowrap; vertical-align: text-bottom; } -.contacts-settings dl { width: 100%; } -.addressbooks-settings table { width: 100%; } -.addressbooks-settings .actions { width: 100%; white-space: nowrap; } -.addressbooks-settings .actions * { float: left; } -.addressbooks-settings .actions input.name { width: 5em; } -.addressbooks-settings .actions input.name { width: 7em; } -.addressbooks-settings a.action { opacity: 0.2; } -.addressbooks-settings a.action:hover { opacity: 1; } -.addressbooks-settings td.active, .addressbooks-settings td.action { width: 20px; } - diff --git a/apps/contacts/css/jquery.Jcrop.css b/apps/contacts/css/jquery.Jcrop.css deleted file mode 100644 index a9ba4746e0..0000000000 --- a/apps/contacts/css/jquery.Jcrop.css +++ /dev/null @@ -1,84 +0,0 @@ -/* jquery.Jcrop.css - The code contained in this file is free software under MIT License - Copyright (c)2008-2011 Tapmodo Interactive LLC -*/ - -/* - The outer-most container in a typical Jcrop instance - If you are having difficulty with formatting related to styles - on a parent element, place any fixes here or in a like selector -*/ -.jcrop-holder { - direction: ltr; - text-align: left; -} - -.jcrop-vline, .jcrop-hline { - background: white url('%appswebroot%/contacts/img/Jcrop.gif') top left repeat; - font-size: 0px; - position: absolute; -} - -.jcrop-vline { - height: 100%; - width: 1px !important; -} - -.jcrop-hline { - width: 100%; - height: 1px !important; -} - -.jcrop-vline.right { - right: 0px; -} - -.jcrop-hline.bottom { - bottom: 0px; -} - -.jcrop-handle { - background-color: #333; - border: 1px #eee solid; - font-size: 1px; -} - -.jcrop-tracker { - height: 100%; - -webkit-tap-highlight-color: transparent; /* "turn off" link highlight */ - -webkit-touch-callout: none; /* disable callout, image save panel */ - -webkit-user-select: none; /* disable cut copy paste */ - width: 100%; -} - -/* -*/ - -.jcrop-light .jcrop-vline, .jcrop-light .jcrop-hline { - background: white; - filter: Alpha(opacity=70) !important; - opacity: .70 !important; -} - -.jcrop-light .jcrop-handle { - background-color: black; - border-color: white; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.jcrop-dark .jcrop-vline, .jcrop-dark .jcrop-hline { - background: black; - filter: Alpha(opacity=70) !important; - opacity: 0.70 !important; -} - -.jcrop-dark .jcrop-handle { - background-color: white; - border-color: black; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - diff --git a/apps/contacts/css/jquery.combobox.css b/apps/contacts/css/jquery.combobox.css deleted file mode 100644 index 59294235d2..0000000000 --- a/apps/contacts/css/jquery.combobox.css +++ /dev/null @@ -1,3 +0,0 @@ -.combo-button { background:url('../../../core/img/actions/triangle-s.svg') no-repeat center; margin-left: -1px; float: left; border: none; } -.ui-button-icon-only .ui-button-text { padding: 0.35em; } -.ui-autocomplete-input { margin: 0; padding: 0.48em 0 0.47em 0.45em; } diff --git a/apps/contacts/export.php b/apps/contacts/export.php deleted file mode 100644 index 161ca8047a..0000000000 --- a/apps/contacts/export.php +++ /dev/null @@ -1,38 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -$bookid = isset($_GET['bookid']) ? $_GET['bookid'] : null; -$contactid = isset($_GET['contactid']) ? $_GET['contactid'] : null; -$nl = "\n"; -if(isset($bookid)) { - $addressbook = OC_Contacts_App::getAddressbook($bookid); - //$cardobjects = OC_Contacts_VCard::all($bookid); - header('Content-Type: text/directory'); - header('Content-Disposition: inline; filename=' - . str_replace(' ', '_', $addressbook['displayname']) . '.vcf'); - - $start = 0; - $batchsize = OCP\Config::getUserValue(OCP\User::getUser(), - 'contacts', - 'export_batch_size', 20); - while($cardobjects = OC_Contacts_VCard::all($bookid, $start, $batchsize)){ - foreach($cardobjects as $card) { - echo $card['carddata'] . $nl; - } - $start += $batchsize; - } -}elseif(isset($contactid)) { - $data = OC_Contacts_App::getContactObject($contactid); - header('Content-Type: text/vcard'); - header('Content-Disposition: inline; filename=' - . str_replace(' ', '_', $data['fullname']) . '.vcf'); - echo $data['carddata']; -} diff --git a/apps/contacts/img/Jcrop.gif b/apps/contacts/img/Jcrop.gif deleted file mode 100644 index 72ea7ccb53..0000000000 Binary files a/apps/contacts/img/Jcrop.gif and /dev/null differ diff --git a/apps/contacts/img/contact-new.png b/apps/contacts/img/contact-new.png deleted file mode 100644 index a91f2e620f..0000000000 Binary files a/apps/contacts/img/contact-new.png and /dev/null differ diff --git a/apps/contacts/img/contact-new.svg b/apps/contacts/img/contact-new.svg deleted file mode 100644 index 8322414dac..0000000000 --- a/apps/contacts/img/contact-new.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/globe.svg b/apps/contacts/img/globe.svg deleted file mode 100644 index 4e43cfba10..0000000000 --- a/apps/contacts/img/globe.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/person.png b/apps/contacts/img/person.png deleted file mode 100644 index e88bb5653a..0000000000 Binary files a/apps/contacts/img/person.png and /dev/null differ diff --git a/apps/contacts/img/person.svg b/apps/contacts/img/person.svg deleted file mode 100644 index c4842c5916..0000000000 --- a/apps/contacts/img/person.svg +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/person_large.png b/apps/contacts/img/person_large.png deleted file mode 100644 index 8293df6182..0000000000 Binary files a/apps/contacts/img/person_large.png and /dev/null differ diff --git a/apps/contacts/import.php b/apps/contacts/import.php deleted file mode 100644 index 1986d79f6d..0000000000 --- a/apps/contacts/import.php +++ /dev/null @@ -1,150 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -//check for addressbooks rights or create new one -ob_start(); - -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -session_write_close(); - -$nl = "\n"; - -global $progresskey; -$progresskey = 'contacts.import-' . (isset($_GET['progresskey'])?$_GET['progresskey']:''); - -if (isset($_GET['progress']) && $_GET['progress']) { - echo OC_Cache::get($progresskey); - die; -} - -function writeProgress($pct) { - global $progresskey; - OC_Cache::set($progresskey, $pct, 300); -} -writeProgress('10'); -$view = $file = null; -if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - $view = OCP\Files::getStorage('contacts'); - $file = $view->file_get_contents('/imports/' . $_POST['file']); -} else { - $file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); -} -if(!$file) { - OCP\JSON::error(array('data' => array('message' => 'Import file was empty.'))); - exit(); -} -if(isset($_POST['method']) && $_POST['method'] == 'new') { - $id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), - $_POST['addressbookname']); - if(!$id) { - OCP\JSON::error( - array( - 'data' => array('message' => 'Error creating address book.') - ) - ); - exit(); - } - OC_Contacts_Addressbook::setActive($id, 1); -}else{ - $id = $_POST['id']; - if(!$id) { - OCP\JSON::error( - array( - 'data' => array( - 'message' => 'Error getting the ID of the address book.', - 'file'=>$_POST['file'] - ) - ) - ); - exit(); - } - OC_Contacts_App::getAddressbook($id); // is owner access check -} -//analyse the contacts file -writeProgress('40'); -$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file); -$lines = explode($nl, $file); - -$inelement = false; -$parts = array(); -$card = array(); -foreach($lines as $line){ - if(strtoupper(trim($line)) == 'BEGIN:VCARD') { - $inelement = true; - } elseif (strtoupper(trim($line)) == 'END:VCARD') { - $card[] = $line; - $parts[] = implode($nl, $card); - $card = array(); - $inelement = false; - } - if ($inelement === true && trim($line) != '') { - $card[] = $line; - } -} -//import the contacts -writeProgress('70'); -$imported = 0; -$failed = 0; -if(!count($parts) > 0) { - OCP\JSON::error( - array( - 'data' => array( - 'message' => 'No contacts to import in ' - . $_POST['file'].'. Please check if the file is corrupted.', - 'file'=>$_POST['file'] - ) - ) - ); - if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - if(!$view->unlink('/imports/' . $_POST['file'])) { - OCP\Util::writeLog('contacts', - 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], - OCP\Util::ERROR); - } - } - exit(); -} -foreach($parts as $part){ - $card = OC_VObject::parse($part); - if (!$card) { - $failed += 1; - OCP\Util::writeLog('contacts', - 'Import: skipping card. Error parsing VCard: ' . $part, - OCP\Util::ERROR); - continue; // Ditch cards that can't be parsed by Sabre. - } - try { - OC_Contacts_VCard::add($id, $card); - $imported += 1; - } catch (Exception $e) { - OCP\Util::writeLog('contacts', - 'Error importing vcard: ' . $e->getMessage() . $nl . $card, - OCP\Util::ERROR); - $failed += 1; - } -} -//done the import -writeProgress('100'); -sleep(3); -OC_Cache::remove($progresskey); -if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - if(!$view->unlink('/imports/' . $_POST['file'])) { - OCP\Util::writeLog('contacts', - 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], - OCP\Util::ERROR); - } -} -OCP\JSON::success( - array( - 'data' => array( - 'imported'=>$imported, - 'failed'=>$failed, - 'file'=>$_POST['file'], - ) - ) -); diff --git a/apps/contacts/index.php b/apps/contacts/index.php deleted file mode 100644 index f16d6f5641..0000000000 --- a/apps/contacts/index.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Copyright (c) 2011 Jakob Sack mail@jakobsack.de - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); - -// Get active address books. This creates a default one if none exists. -$ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser()); -$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0 - ? true - : false); // just to check if there are any contacts. -if($has_contacts === false) { - OCP\Util::writeLog('contacts', - 'index.html: No contacts found.', - OCP\Util::DEBUG); -} - -// Load the files we need -OCP\App::setActiveNavigationEntry('contacts_index'); - -// Load a specific user? -$id = isset( $_GET['id'] ) ? $_GET['id'] : null; -$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP'); -$phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); -$email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); -$ims = OC_Contacts_App::getIMOptions(); -$im_protocols = array(); -foreach($ims as $name => $values) { - $im_protocols[$name] = $values['displayname']; -} -$categories = OC_Contacts_App::getCategories(); - -$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); -$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); -$maxUploadFilesize = min($upload_max_filesize, $post_max_size); - -$freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace, 0); -$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); - -OCP\Util::addscript('', 'jquery.multiselect'); -OCP\Util::addscript('', 'oc-vcategories'); -OCP\Util::addscript('contacts', 'contacts'); -OCP\Util::addscript('contacts', 'expanding'); -OCP\Util::addscript('contacts', 'jquery.combobox'); -OCP\Util::addscript('files', 'jquery.fileupload'); -OCP\Util::addscript('contacts', 'jquery.inview'); -OCP\Util::addscript('contacts', 'jquery.Jcrop'); -OCP\Util::addscript('contacts', 'jquery.multi-autocomplete'); -OCP\Util::addStyle('', 'jquery.multiselect'); -OCP\Util::addStyle('contacts', 'jquery.combobox'); -OCP\Util::addStyle('contacts', 'jquery.Jcrop'); -OCP\Util::addStyle('contacts', 'contacts'); - -$tmpl = new OCP\Template( "contacts", "index", "user" ); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize, false); -$tmpl->assign('uploadMaxHumanFilesize', - OCP\Util::humanFileSize($maxUploadFilesize), false); -$tmpl->assign('phone_types', $phone_types, false); -$tmpl->assign('email_types', $email_types, false); -$tmpl->assign('impp_types', $impp_types, false); -$tmpl->assign('categories', $categories, false); -$tmpl->assign('im_protocols', $im_protocols, false); -$tmpl->assign('has_contacts', $has_contacts, false); -$tmpl->assign('id', $id, false); -$tmpl->printPage(); diff --git a/apps/contacts/js/LICENSE.jquery.inview b/apps/contacts/js/LICENSE.jquery.inview deleted file mode 100644 index 1ed340edbe..0000000000 --- a/apps/contacts/js/LICENSE.jquery.inview +++ /dev/null @@ -1,41 +0,0 @@ -Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales - -http://creativecommons.org/licenses/by-nc-sa/2.0/uk/ - -You are free: - - * to copy, distribute, display, and perform the work - * to make derivative works - - -Under the following conditions: - - * Attribution — You must give the original author credit. - Attribute this work: - Information - What does "Attribute this work" mean? - The page you came from contained embedded licensing metadata, - including how the creator wishes to be attributed for re-use. - You can use the HTML here to cite the work. Doing so will - also include metadata on your page so that others can find the - original work as well. - - * Non-Commercial — You may not use this work for commercial - purposes. - * Share Alike — If you alter, transform, or build upon this - work, you may distribute the resulting work only under a - licence identical to this one. - -With the understanding that: - - * Waiver — Any of the above conditions can be waived if you get - permission from the copyright holder. - * Other Rights — In no way are any of the following rights - affected by the license: - o Your fair dealing or fair use rights; - o The author's moral rights; - o Rights other persons may have either in the work itself - or in how the work is used, such as publicity or privacy rights. - * Notice — For any reuse or distribution, you must make clear to - others the licence terms of this work. - diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js deleted file mode 100644 index 09cf26bf7f..0000000000 --- a/apps/contacts/js/contacts.js +++ /dev/null @@ -1,2277 +0,0 @@ -function ucwords (str) { - return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) { - return $1.toUpperCase(); - }); -} - -String.prototype.strip_tags = function(){ - tags = this; - stripped = tags.replace(/<(.|\n)*?>/g, ''); - return stripped; -}; - -OC.Contacts={ - /** - * Arguments: - * message: The text message to show. - * timeout: The timeout in seconds before the notification disappears. Default 10. - * timeouthandler: A function to run on timeout. - * clickhandler: A function to run on click. If a timeouthandler is given it will be cancelled. - * data: An object that will be passed as argument to the timeouthandler and clickhandler functions. - * cancel: If set cancel all ongoing timer events and hide the notification. - */ - notify:function(params) { - var self = this; - if(!self.notifier) { - self.notifier = $('#notification'); - } - if(params.cancel) { - self.notifier.off('click'); - for(var id in self.notifier.data()) { - if($.isNumeric(id)) { - clearTimeout(parseInt(id)); - } - } - self.notifier.text('').fadeOut().removeData(); - return; - } - self.notifier.text(params.message); - self.notifier.fadeIn(); - self.notifier.on('click', function() { $(this).fadeOut();}); - var timer = setTimeout(function() { - if(!self || !self.notifier) { - var self = OC.Contacts; - self.notifier = $('#notification'); - } - self.notifier.fadeOut(); - if(params.timeouthandler && $.isFunction(params.timeouthandler)) { - params.timeouthandler(self.notifier.data(dataid)); - self.notifier.off('click'); - self.notifier.removeData(dataid); - } - }, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000); - var dataid = timer.toString(); - if(params.data) { - self.notifier.data(dataid, params.data); - } - if(params.clickhandler && $.isFunction(params.clickhandler)) { - self.notifier.on('click', function() { - if(!self || !self.notifier) { - var self = OC.Contacts; - self.notifier = $(this); - } - clearTimeout(timer); - self.notifier.off('click'); - params.clickhandler(self.notifier.data(dataid)); - self.notifier.removeData(dataid); - }); - } - }, - notImplemented:function() { - OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented')); - }, - searchOSM:function(obj) { - var adr = OC.Contacts.propertyContainerFor(obj).find('.adr').val(); - if(adr == undefined) { - OC.dialogs.alert(t('contacts', 'Couldn\'t get a valid address.'), t('contacts', 'Error')); - return; - } - // FIXME: I suck at regexp. /Tanghus - var adrarr = adr.split(';'); - var adrstr = ''; - if(adrarr[2].trim() != '') { - adrstr = adrstr + adrarr[2].trim() + ','; - } - if(adrarr[3].trim() != '') { - adrstr = adrstr + adrarr[3].trim() + ','; - } - if(adrarr[4].trim() != '') { - adrstr = adrstr + adrarr[4].trim() + ','; - } - if(adrarr[5].trim() != '') { - adrstr = adrstr + adrarr[5].trim() + ','; - } - if(adrarr[6].trim() != '') { - adrstr = adrstr + adrarr[6].trim(); - } - adrstr = encodeURIComponent(adrstr); - var uri = 'http://open.mapquestapi.com/nominatim/v1/search.php?q=' + adrstr + '&limit=10&addressdetails=1&polygon=1&zoom='; - var newWindow = window.open(uri,'_blank'); - newWindow.focus(); - }, - mailTo:function(obj) { - var adr = OC.Contacts.propertyContainerFor($(obj)).find('input[type="email"]').val().trim(); - if(adr == '') { - OC.dialogs.alert(t('contacts', 'Please enter an email address.'), t('contacts', 'Error')); - return; - } - window.location.href='mailto:' + adr; - }, - propertyContainerFor:function(obj) { - return $(obj).parents('.propertycontainer').first(); - }, - checksumFor:function(obj) { - return $(obj).parents('.propertycontainer').first().data('checksum'); - }, - propertyTypeFor:function(obj) { - return $(obj).parents('.propertycontainer').first().data('element'); - }, - loading:function(obj, state) { - if(state) { - $(obj).addClass('loading'); - } else { - $(obj).removeClass('loading'); - } - }, - showCardDAVUrl:function(username, bookname){ - $('#carddav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(bookname)); - $('#carddav_url').show(); - $('#carddav_url_close').show(); - }, - loadListHandlers:function() { - $('.propertylist li a.delete').unbind('click'); - $('.propertylist li a.delete').unbind('keydown'); - var deleteItem = function(obj) { - obj.tipsy('hide'); - OC.Contacts.Card.deleteProperty(obj, 'list'); - } - $('.propertylist li a.delete, .addresscard .delete').click(function() { deleteItem($(this)) }); - $('.propertylist li a.delete, .addresscard .delete').keydown(function() { deleteItem($(this)) }); - $('.propertylist li a.mail').click(function() { OC.Contacts.mailTo(this) }); - $('.propertylist li a.mail').keydown(function() { OC.Contacts.mailTo(this) }); - $('.addresscard .globe').click(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); }); - $('.addresscard .globe').keydown(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); }); - $('.addresscard .edit').click(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); }); - $('.addresscard .edit').keydown(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); }); - $('.addresscard,.propertylist li,.propertycontainer').hover( - function () { - $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 1.0 }, 200, function() {}); - }, - function () { - $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 0.1 }, 200, function() {}); - } - ); - }, - loadHandlers:function() { - var deleteItem = function(obj) { - obj.tipsy('hide'); - OC.Contacts.Card.deleteProperty(obj, 'single'); - } - var goToUrl = function(obj) { - var url = OC.Contacts.propertyContainerFor(obj).find('#url').val(); - if(url != '') { - var newWindow = window.open(url,'_blank'); - newWindow.focus(); - } - } - - $('#identityprops a.delete').click( function() { deleteItem($(this)) }); - $('#identityprops a.delete').keydown( function() { deleteItem($(this)) }); - $('#categories_value a.edit').click( function() { $(this).tipsy('hide');OCCategories.edit(); } ); - $('#categories_value a.edit').keydown( function() { $(this).tipsy('hide');OCCategories.edit(); } ); - $('#url_value a.globe').click( function() { $(this).tipsy('hide');goToUrl($(this)); } ); - $('#url_value a.globe').keydown( function() { $(this).tipsy('hide');goToUrl($(this)); } ); - $('#fn_select').combobox({ - 'id': 'fn', - 'name': 'value', - 'classes': ['contacts_property', 'nonempty', 'huge', 'tip', 'float'], - 'attributes': {'placeholder': t('contacts', 'Enter name')}, - 'title': t('contacts', 'Format custom, Short name, Full name, Reverse or Reverse with comma')}); - $('#bday').datepicker({ - dateFormat : 'dd-mm-yy' - }); - // Style phone types - $('#phonelist').find('select.contacts_property').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - $('#edit_name').click(function(){OC.Contacts.Card.editName()}); - $('#edit_name').keydown(function(){OC.Contacts.Card.editName()}); - - $('#phototools li a').click(function() { - $(this).tipsy('hide'); - }); - $('#contacts_details_photo_wrapper').hover( - function () { - $('#phototools').slideDown(200); - }, - function () { - $('#phototools').slideUp(200); - } - ); - $('#phototools').hover( - function () { - $(this).removeClass('transparent'); - }, - function () { - $(this).addClass('transparent'); - } - ); - $('#phototools .upload').click(function() { - $('#file_upload_start').trigger('click'); - }); - $('#phototools .cloud').click(function() { - OC.dialogs.filepicker(t('contacts', 'Select photo'), OC.Contacts.Card.cloudPhotoSelected, false, 'image', true); - }); - /* Initialize the photo edit dialog */ - $('#edit_photo_dialog').dialog({ - autoOpen: false, modal: true, height: 'auto', width: 'auto' - }); - $('#edit_photo_dialog' ).dialog( 'option', 'buttons', [ - { - text: "Ok", - click: function() { - OC.Contacts.Card.savePhoto(this); - $(this).dialog('close'); - } - }, - { - text: "Cancel", - click: function() { $(this).dialog('close'); } - } - ] ); - - // Name has changed. Update it and reorder. - $('#fn').change(function(){ - var name = $('#fn').val().strip_tags(); - var item = $('.contacts li[data-id="'+OC.Contacts.Card.id+'"]').detach(); - $(item).find('a').html(name); - OC.Contacts.Card.fn = name; - OC.Contacts.Contacts.insertContact({contact:item}); - OC.Contacts.Contacts.scrollTo(OC.Contacts.Card.id); - }); - - $('#contacts_deletecard').click( function() { OC.Contacts.Card.delayedDelete();return false;} ); - $('#contacts_deletecard').keydown( function(event) { - if(event.which == 13 || event.which == 32) { - OC.Contacts.Card.delayedDelete(); - } - return false; - }); - - $('#contacts_downloadcard').click( function() { OC.Contacts.Card.doExport();return false;} ); - $('#contacts_downloadcard').keydown( function(event) { - if(event.which == 13 || event.which == 32) { - OC.Contacts.Card.doExport(); - } - return false; - }); - - // Profile picture upload handling - // New profile picture selected - $('#file_upload_start').change(function(){ - OC.Contacts.Card.uploadPhoto(this.files); - }); - $('#contacts_details_photo_wrapper').bind('dragover',function(event){ - $(event.target).addClass('droppable'); - event.stopPropagation(); - event.preventDefault(); - }); - $('#contacts_details_photo_wrapper').bind('dragleave',function(event){ - $(event.target).removeClass('droppable'); - }); - $('#contacts_details_photo_wrapper').bind('drop',function(event){ - event.stopPropagation(); - event.preventDefault(); - $(event.target).removeClass('droppable'); - $.fileUpload(event.originalEvent.dataTransfer.files); - }); - - $('#categories').multiple_autocomplete({source: categories}); - $('#contacts_deletecard').tipsy({gravity: 'ne'}); - $('#contacts_downloadcard').tipsy({gravity: 'ne'}); - $('#contacts_propertymenu_button').tipsy(); - $('#contacts_newcontact, #contacts_import, #bottomcontrols .settings').tipsy({gravity: 'sw'}); - - $('body').click(function(e){ - if(!$(e.target).is('#contacts_propertymenu_button')) { - $('#contacts_propertymenu_dropdown').hide(); - } - }); - function propertyMenu(){ - var menu = $('#contacts_propertymenu_dropdown'); - if(menu.is(':hidden')) { - menu.show(); - menu.find('li').first().focus(); - } else { - menu.hide(); - } - } - $('#contacts_propertymenu_button').click(propertyMenu); - $('#contacts_propertymenu_button').keydown(propertyMenu); - function propertyMenuItem(){ - var type = $(this).data('type'); - OC.Contacts.Card.addProperty(type); - $('#contacts_propertymenu_dropdown').hide(); - } - $('#contacts_propertymenu_dropdown a').click(propertyMenuItem); - $('#contacts_propertymenu_dropdown a').keydown(propertyMenuItem); - }, - Card:{ - update:function(params) { // params {cid:int, aid:int} - if(!params) { params = {}; } - $('#contacts li,#contacts h3').removeClass('active'); - console.log('Card, cid: ' + params.cid + ' aid: ' + params.aid); - var newid, bookid, firstitem; - if(!parseInt(params.cid) && !parseInt(params.aid)) { - firstitem = $('#contacts ul').find('li:first-child'); - if(firstitem.length > 0) { - if(firstitem.length > 1) { - firstitem = firstitem.first(); - } - newid = parseInt(firstitem.data('id')); - bookid = parseInt(firstitem.data('bookid')); - } - } else if(!parseInt(params.cid) && parseInt(params.aid)) { - bookid = parseInt(params.aid); - newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); - } else if(parseInt(params.cid) && !parseInt(params.aid)) { - newid = parseInt(params.cid); - var listitem = OC.Contacts.Contacts.getContact(newid); //$('#contacts li[data-id="'+newid+'"]'); - console.log('Is contact in list? ' + listitem.length); - if(listitem.length) { - //bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid')); - bookid = parseInt(OC.Contacts.Contacts.getContact(newid).data('bookid')); - } else { // contact isn't in list yet. - bookid = 'unknown'; - } - } else { - newid = parseInt(params.cid); - bookid = parseInt(params.aid); - } - if(!bookid || !newid) { - bookid = parseInt($('#contacts h3').first().data('id')); - newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); - } - console.log('newid: ' + newid + ' bookid: ' +bookid); - var localLoadContact = function(newid, bookid) { - if($('.contacts li').length > 0) { - $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':newid},function(jsondata){ - if(jsondata.status == 'success'){ - if(bookid == 'unknown') { - bookid = jsondata.data.addressbookid; - var contact = OC.Contacts.Contacts.insertContact({ - contactlist:$('#contacts ul[data-id="'+bookid+'"]'), - data:jsondata.data - }); - } - $('#contacts li[data-id="'+newid+'"],#contacts h3[data-id="'+bookid+'"]').addClass('active'); - $('#contacts ul[data-id="'+bookid+'"]').slideDown(300); - OC.Contacts.Card.loadContact(jsondata.data, bookid); - OC.Contacts.Contacts.scrollTo(newid); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - } - - // Make sure proper DOM is loaded. - if(!$('#card').length && newid) { - console.log('Loading card DOM'); - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{requesttoken:requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - OC.Contacts.loadHandlers(); - localLoadContact(newid, bookid); - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else if(!newid) { - console.log('Loading intro'); - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').data('id',''); - $('#rightcontent').html(jsondata.data.page); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - else { - localLoadContact(newid, bookid); - } - }, - setEnabled:function(enabled) { - console.log('setEnabled', enabled); - $('.contacts_property,.action').each(function () { - $(this).prop('disabled', !enabled); - OC.Contacts.Card.enabled = enabled; - }); - }, - doExport:function() { - document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; - }, - editNew:function(){ // add a new contact - var book = $('#contacts h3.active'); - var permissions = parseInt(book.data('permissions')); - if(permissions == 0 - || permissions & OC.Share.PERMISSION_UPDATE - || permissions & OC.Share.PERMISSION_DELETE) { - with(this) { - delete id; delete fn; delete fullname; delete givname; delete famname; - delete addname; delete honpre; delete honsuf; - } - this.bookid = book.data('id'); - OC.Contacts.Card.add(';;;;;', '', '', true); - } else { - OC.dialogs.alert(t('contacts', 'You do not have permission to add contacts to ') - + book.text() + '. ' + t('contacts', 'Please select one of your own address books.'), t('contacts', 'Permission error')); - } - return false; - }, - add:function(n, fn, aid, isnew){ // add a new contact - console.log('Adding ' + fn); - aid = aid?aid:$('#contacts h3.active').first().data('id'); - var localAddcontact = function(n, fn, aid, isnew) { - $.post(OC.filePath('contacts', 'ajax', 'contact/add.php'), { n: n, fn: fn, aid: aid, isnew: isnew }, - function(jsondata) { - if (jsondata.status == 'success'){ - $('#rightcontent').data('id',jsondata.data.id); - var id = jsondata.data.id; - var aid = jsondata.data.aid; - $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - OC.Contacts.Card.loadContact(jsondata.data, aid); - var item = OC.Contacts.Contacts.insertContact({data:jsondata.data}); - if(isnew) { // add some default properties - OC.Contacts.Card.addProperty('EMAIL'); - OC.Contacts.Card.addProperty('TEL'); - $('#fn').focus(); - } - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - $('#contact_identity').show(); - $('#actionbar').show(); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - - if(!$('#card').length) { - console.log('Loading card DOM'); - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{'requesttoken': requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - OC.Contacts.loadHandlers(); - localAddcontact(n, fn, aid, isnew); - }); - } else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - localAddcontact(n, fn, aid, isnew); - } - }, - delayedDelete:function() { - $('#contacts_deletecard').tipsy('hide'); - var newid = '', bookid; - var curlistitem = OC.Contacts.Contacts.getContact(this.id); - curlistitem.removeClass('active'); - var newlistitem = curlistitem.prev('li'); - if(!newlistitem) { - newlistitem = curlistitem.next('li'); - } - curlistitem.detach(); - if($(newlistitem).is('li')) { - newid = newlistitem.data('id'); - bookid = newlistitem.data('bookid'); - } - $('#rightcontent').data('id', newid); - - OC.Contacts.Contacts.deletionQueue.push(parseInt(this.id)); - if(!window.onbeforeunload) { - window.onbeforeunload = OC.Contacts.Contacts.warnNotDeleted; - } - - with(this) { - delete id; delete fn; delete fullname; delete shortname; delete famname; - delete givname; delete addname; delete honpre; delete honsuf; delete data; - } - - if($('.contacts li').length > 0) { - OC.Contacts.Card.update({cid:newid, aid:bookid}); - } else { - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').html(jsondata.data.page).removeData('id'); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - OC.Contacts.notify({ - data:curlistitem, - message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"', - //timeout:5, - timeouthandler:function(contact) { - console.log('timeout'); - OC.Contacts.Card.doDelete(contact.data('id'), true, function(res) { - if(!res) { - OC.Contacts.Contacts.insertContact({contact:contact}); - } else { - delete contact; - } - }); - }, - clickhandler:function(contact) { - OC.Contacts.Contacts.insertContact({contact:contact}); - OC.Contacts.notify({message:t('contacts', 'Cancelled deletion of: "') + curlistitem.find('a').text() + '"'}); - window.onbeforeunload = null; - } - }); - }, - doDelete:function(id, removeFromQueue, cb) { - var updateQueue = function(id, remove) { - if(removeFromQueue) { - OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)), 1); - } - if(OC.Contacts.Contacts.deletionQueue.length == 0) { - window.onbeforeunload = null; - } - } - - if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) { - console.log('returning'); - updateQueue(id, removeFromQueue); - if(typeof cb == 'function') { - cb(true); - } - return; - } - $.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'), {'id':id},function(jsondata) { - if(jsondata.status == 'error'){ - OC.Contacts.notify({message:jsondata.data.message}); - if(typeof cb == 'function') { - cb(false); - } - } - updateQueue(id, removeFromQueue); - }); - if(typeof cb == 'function') { - cb(true); - } - }, - loadContact:function(jsondata, bookid){ - this.data = jsondata; - this.id = this.data.id; - this.bookid = bookid; - $('#rightcontent').data('id',this.id); - this.populateNameFields(); - this.loadPhoto(); - this.loadMails(); - this.loadPhones(); - this.loadIMs(); - this.loadAddresses(); - this.loadSingleProperties(); - OC.Contacts.loadListHandlers(); - var note = $('#note'); - if(this.data.NOTE) { - note.data('checksum', this.data.NOTE[0]['checksum']); - var textarea = note.find('textarea'); - var txt = this.data.NOTE[0]['value']; - var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5; - textarea.css('min-height', nheight+'em'); - textarea.attr('rows', nheight); - textarea.val(txt); - $('#contact_note').show(); - textarea.expandingTextarea(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide(); - } else { - note.removeData('checksum'); - note.find('textarea').val(''); - $('#contact_note').hide(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show(); - } - var permissions = OC.Contacts.Card.permissions = parseInt($('#contacts ul[data-id="' + bookid + '"]').data('permissions')); - console.log('permissions', permissions); - this.setEnabled(permissions == 0 - || permissions & OC.Share.PERMISSION_UPDATE - || permissions & OC.Share.PERMISSION_DELETE); - }, - loadSingleProperties:function() { - var props = ['BDAY', 'NICKNAME', 'ORG', 'URL', 'CATEGORIES']; - // Clear all elements - $('#ident .propertycontainer').each(function(){ - if(props.indexOf($(this).data('element')) > -1) { - $(this).data('checksum', ''); - $(this).find('input').val(''); - $(this).hide(); - $(this).prev().hide(); - } - }); - for(var prop in props) { - var propname = props[prop]; - if(this.data[propname] != undefined) { - $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().hide(); - var property = this.data[propname][0]; - var value = property['value'], checksum = property['checksum']; - - if(propname == 'BDAY') { - var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); - value = $.datepicker.formatDate('dd-mm-yy', val); - } - var identcontainer = $('#contact_identity'); - identcontainer.find('#'+propname.toLowerCase()).val(value); - identcontainer.find('#'+propname.toLowerCase()+'_value').data('checksum', checksum); - identcontainer.find('#'+propname.toLowerCase()+'_label').show(); - identcontainer.find('#'+propname.toLowerCase()+'_value').show(); - } else { - $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().show(); - } - } - }, - populateNameFields:function() { - var props = ['FN', 'N']; - // Clear all elements - $('#ident .propertycontainer').each(function(){ - if(props.indexOf($(this).data('element')) > -1) { - $(this).data('checksum', ''); - $(this).find('input').val(''); - } - }); - - with(this) { - delete fn; delete fullname; delete givname; delete famname; - delete addname; delete honpre; delete honsuf; - } - - if(this.data.FN) { - this.fn = this.data.FN[0]['value']; - } - else { - this.fn = ''; - } - if(this.data.N == undefined) { - narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P - } else { - narray = this.data.N[0]['value']; - } - this.famname = narray[0] || ''; - this.givname = narray[1] || ''; - this.addname = narray[2] || ''; - this.honpre = narray[3] || ''; - this.honsuf = narray[4] || ''; - if(this.honpre.length > 0) { - this.fullname += this.honpre + ' '; - } - if(this.givname.length > 0) { - this.fullname += ' ' + this.givname; - } - if(this.addname.length > 0) { - this.fullname += ' ' + this.addname; - } - if(this.famname.length > 0) { - this.fullname += ' ' + this.famname; - } - if(this.honsuf.length > 0) { - this.fullname += ', ' + this.honsuf; - } - $('#n').val(narray.join(';')); - $('#fn_select option').remove(); - var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - if(this.data.ORG) { - names[names.length]=this.data.ORG[0].value; - } - $.each(names, function(key, value) { - $('#fn_select') - .append($('') - .text(value)); - }); - $('#fn_select').combobox('value', this.fn); - $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']); - if(this.data.FN) { - $('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']); - } - $('#contact_identity').show(); - }, - hasCategory:function(category) { - if(this.data.CATEGORIES) { - var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/); - for(var c in categories) { - var cat = this.data.CATEGORIES[0]['value'][c]; - if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) { - return true; - } - } - } - return false; - }, - categoriesChanged:function(newcategories) { // Categories added/deleted. - categories = $.map(newcategories, function(v) {return v;}); - $('#categories').multiple_autocomplete('option', 'source', categories); - var categorylist = $('#categories_value').find('input'); - $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':OC.Contacts.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - $('#categories_value').data('checksum', jsondata.data.checksum); - categorylist.val(jsondata.data.value); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - savePropertyInternal:function(name, fields, oldchecksum, checksum) { - // TODO: Add functionality for new fields. - //console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum); - //console.log('savePropertyInternal: ' + this.data[name]); - var multivalue = ['CATEGORIES']; - var params = {}; - var value = multivalue.indexOf(name) != -1 ? new Array() : undefined; - jQuery.each(fields, function(i, field){ - //.substring(11,'parameters[TYPE][]'.indexOf(']')) - if(field.name.substring(0, 5) === 'value') { - if(multivalue.indexOf(name) != -1) { - value.push(field.value); - } else { - value = field.value; - } - } else if(field.name.substring(0, 10) === 'parameters') { - var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']')); - if(!(p in params)) { - params[p] = []; - } - params[p].push(field.value); - } - }); - for(var i in this.data[name]) { - if(this.data[name][i]['checksum'] == oldchecksum) { - this.data[name][i]['checksum'] = checksum; - this.data[name][i]['value'] = value; - this.data[name][i]['parameters'] = params; - } - } - }, - saveProperty:function(obj) { - if(!$(obj).hasClass('contacts_property')) { - return false; - } - if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') { - OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error')); - return false; - } - container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata. - OC.Contacts.loading(obj, true); - var checksum = container.data('checksum'); - var name = container.data('element'); - var fields = container.find('input.contacts_property,select.contacts_property').serializeArray(); - switch(name) { - case 'FN': - var nempty = true; - for(var i in OC.Contacts.Card.data.N[0]['value']) { - if(OC.Contacts.Card.data.N[0]['value'][i] != '') { - nempty = false; - break; - } - } - if(nempty) { - $('#n').val(fields[0].value + ';;;;'); - OC.Contacts.Card.data.N[0]['value'] = Array(fields[0].value, '', '', '', ''); - setTimeout(function() {OC.Contacts.Card.saveProperty($('#n'))}, 500); - } - break; - } - var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize(); - if(q == '' || q == undefined) { - OC.dialogs.alert(t('contacts', 'Couldn\'t serialize elements.'), t('contacts', 'Error')); - OC.Contacts.loading(obj, false); - return false; - } - q = q + '&id=' + this.id + '&name=' + name; - if(checksum != undefined && checksum != '') { // save - q = q + '&checksum=' + checksum; - console.log('Saving: ' + q); - $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'),q,function(jsondata){ - if(!jsondata) { - OC.dialogs.alert(t('contacts', 'Unknown error. Please check logs.'), t('contacts', 'Error')); - OC.Contacts.loading(obj, false); - $(obj).removeAttr('disabled'); - OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); - return false; - } - if(jsondata.status == 'success'){ - container.data('checksum', jsondata.data.checksum); - OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - OC.Contacts.loading(obj, false); - $(obj).removeAttr('disabled'); - return true; - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - OC.Contacts.loading(obj, false); - $(obj).removeAttr('disabled'); - OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); - return false; - } - },'json'); - } else { // add - console.log('Adding: ' + q); - $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'contact/addproperty.php'),q,function(jsondata){ - if(jsondata.status == 'success'){ - container.data('checksum', jsondata.data.checksum); - // TODO: savePropertyInternal doesn't know about new fields - //OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - OC.Contacts.loading(obj, false); - $(obj).removeAttr('disabled'); - return true; - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - OC.Contacts.loading(obj, false); - $(obj).removeAttr('disabled'); - OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); - return false; - } - },'json'); - } - }, - addProperty:function(type) { - if(!this.enabled) { - return; - } - switch (type) { - case 'NOTE': - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#note').find('textarea').expandingTextarea().show().focus(); - $('#contact_note').show(); - break; - case 'EMAIL': - if($('#emaillist>li').length == 1) { - $('#emails').show(); - } - OC.Contacts.Card.addMail(); - break; - case 'TEL': - if($('#phonelist>li').length == 1) { - $('#phones').show(); - } - OC.Contacts.Card.addPhone(); - break; - case 'IMPP': - if($('#imlist>li').length == 1) { - $('#ims').show(); - } - OC.Contacts.Card.addIM(); - break; - case 'ADR': - if($('addresses>dl').length == 1) { - $('#addresses').show(); - } - OC.Contacts.Card.editAddress('new', true); - break; - case 'NICKNAME': - case 'URL': - case 'ORG': - case 'BDAY': - case 'CATEGORIES': - $('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show(); - $('dd[data-element="'+type+'"]').find('input').focus(); - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - break; - } - }, - deleteProperty:function(obj, type) { - console.log('deleteProperty'); - if(!this.enabled) { - return; - } - OC.Contacts.loading(obj, true); - var checksum = OC.Contacts.checksumFor(obj); - if(checksum) { - $.post(OC.filePath('contacts', 'ajax', 'contact/deleteproperty.php'),{'id': this.id, 'checksum': checksum },function(jsondata){ - if(jsondata.status == 'success'){ - if(type == 'list') { - OC.Contacts.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = OC.Contacts.propertyTypeFor(obj); - OC.Contacts.Card.data[proptype] = null; - var othertypes = ['NOTE', 'PHOTO']; - if(othertypes.indexOf(proptype) != -1) { - OC.Contacts.propertyContainerFor(obj).data('checksum', ''); - if(proptype == 'PHOTO') { - OC.Contacts.Contacts.refreshThumbnail(OC.Contacts.Card.id); - OC.Contacts.Card.loadPhoto(); - } else if(proptype == 'NOTE') { - $('#note').find('textarea').val(''); - $('#contact_note').hide(); - OC.Contacts.propertyContainerFor(obj).hide(); - } - } else { - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('dl dd[data-element="'+proptype+'"]').data('checksum', '').find('input').val(''); - } - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - OC.Contacts.loading(obj, false); - } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); - OC.Contacts.loading(obj, false); - } - } - else{ - OC.Contacts.loading(obj, false); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { // Property hasn't been saved so there's nothing to delete. - if(type == 'list') { - OC.Contacts.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = OC.Contacts.propertyTypeFor(obj); - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - OC.Contacts.loading(obj, false); - } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); - } - } - }, - editName:function() { - if(!this.enabled) { - return; - } - var params = {id: this.id}; - /* Initialize the name edit dialog */ - if($('#edit_name_dialog').dialog('isOpen') == true) { - $('#edit_name_dialog').dialog('moveToTop'); - } else { - $.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata) { - if(jsondata.status == 'success') { - $('body').append('
    '); - $('#name_dialog').html(jsondata.data.page).find('#edit_name_dialog' ).dialog({ - modal: true, - closeOnEscape: true, - title: t('contacts', 'Edit name'), - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - OC.Contacts.Card.saveName(this); - $(this).dialog('close'); - }, - 'Cancel':function() { $(this).dialog('close'); } - }, - close: function(event, ui) { - $(this).dialog('destroy').remove(); - $('#name_dialog').remove(); - }, - open: function(event, ui) { - // load 'N' property - maybe :-P - } - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - }, - saveName:function(dlg) { - if(!this.enabled) { - return; - } - //console.log('saveName, id: ' + this.id); - var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags()); - this.famname = n[0]; - this.givname = n[1]; - this.addname = n[2]; - this.honpre = n[3]; - this.honsuf = n[4]; - this.fullname = ''; - - $('#n').val(n.join(';')); - if(n[3].length > 0) { - this.fullname = n[3] + ' '; - } - this.fullname += n[1] + ' ' + n[2] + ' ' + n[0]; - if(n[4].length > 0) { - this.fullname += ', ' + n[4]; - } - - $('#fn_select option').remove(); - //$('#fn_select').combobox('value', this.fn); - var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - var names = new Array(); - for(var name in tmp) { - if(names.indexOf(tmp[name]) == -1) { - names.push(tmp[name]); - } - } - $.each(names, function(key, value) { - $('#fn_select') - .append($('') - .text(value)); - }); - - if(this.id == '') { - var aid = $(dlg).find('#aid').val(); - OC.Contacts.Card.add(n.join(';'), $('#short').text(), aid); - } else { - OC.Contacts.Card.saveProperty($('#n')); - } - }, - loadAddresses:function() { - $('#addresses').hide(); - $('#addresses dl.propertycontainer').remove(); - var addresscontainer = $('#addresses'); - for(var adr in this.data.ADR) { - addresscontainer.find('dl').first().clone().insertAfter($('#addresses dl').last()).show(); - addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer'); - addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); - var adrarray = this.data.ADR[adr]['value']; - var adrtxt = ''; - if(adrarray[0] && adrarray[0].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[0].strip_tags() + '
  • '; - } - if(adrarray[1] && adrarray[1].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[1].strip_tags() + '
  • '; - } - if(adrarray[2] && adrarray[2].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[2].strip_tags() + '
  • '; - } - if((3 in adrarray && 5 in adrarray) && adrarray[3].length > 0 || adrarray[5].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '
  • '; - } - if(adrarray[4] && adrarray[4].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[4].strip_tags() + '
  • '; - } - if(adrarray[6] && adrarray[6].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[6].strip_tags() + '
  • '; - } - addresscontainer.find('dl').last().find('.addresslist').html(adrtxt); - var types = new Array(); - var ttypes = new Array(); - for(var param in this.data.ADR[adr]['parameters']) { - if(param.toUpperCase() == 'TYPE') { - types.push(t('contacts', ucwords(this.data.ADR[adr]['parameters'][param].toLowerCase()))); - ttypes.push(this.data.ADR[adr]['parameters'][param]); - } - } - addresscontainer.find('dl').last().find('.adr_type_label').text(types.join('/')); - addresscontainer.find('dl').last().find('.adr_type').val(ttypes.join(',')); - addresscontainer.find('dl').last().find('.adr').val(adrarray.join(';')); - addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); - } - if(addresscontainer.find('dl').length > 1) { - $('#addresses').show(); - } - return false; - }, - editAddress:function(obj, isnew){ - if(!this.enabled) { - return; - } - var container = undefined; - var params = {id: this.id}; - if(obj === 'new') { - isnew = true; - $('#addresses dl').first().clone(true).insertAfter($('#addresses dl').last()).show(); - container = $('#addresses dl').last(); - container.removeClass('template').addClass('propertycontainer'); - } else { - params['checksum'] = OC.Contacts.checksumFor(obj); - } - /* Initialize the address edit dialog */ - if($('#edit_address_dialog').dialog('isOpen') == true){ - $('#edit_address_dialog').dialog('moveToTop'); - }else{ - $.getJSON(OC.filePath('contacts', 'ajax', 'editaddress.php'),params,function(jsondata){ - if(jsondata.status == 'success'){ - $('body').append('
    '); - $('#address_dialog').html(jsondata.data.page).find('#edit_address_dialog' ).dialog({ - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - if(isnew) { - OC.Contacts.Card.saveAddress(this, $('#addresses dl:last-child').find('input').first(), isnew); - } else { - OC.Contacts.Card.saveAddress(this, obj, isnew); - } - $(this).dialog('close'); - }, - 'Cancel':function() { - $(this).dialog('close'); - if(isnew) { - container.remove(); - } - } - }, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - $('#address_dialog').remove(); - }, - open : function(event, ui) { - $( "#adr_city" ).autocomplete({ - source: function( request, response ) { - $.ajax({ - url: "http://ws.geonames.org/searchJSON", - dataType: "jsonp", - data: { - featureClass: "P", - style: "full", - maxRows: 12, - lang: lang, - name_startsWith: request.term - }, - success: function( data ) { - response( $.map( data.geonames, function( item ) { - return { - label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, - value: item.name, - country: item.countryName - } - })); - } - }); - }, - minLength: 2, - select: function( event, ui ) { - if(ui.item && $('#adr_country').val().trim().length == 0) { - $('#adr_country').val(ui.item.country); - } - }, - open: function() { - $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); - }, - close: function() { - $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); - } - }); - $('#adr_country').autocomplete({ - source: function( request, response ) { - $.ajax({ - url: "http://ws.geonames.org/searchJSON", - dataType: "jsonp", - data: { - /*featureClass: "A",*/ - featureCode: "PCLI", - /*countryBias: "true",*/ - /*style: "full",*/ - lang: lang, - maxRows: 12, - name_startsWith: request.term - }, - success: function( data ) { - response( $.map( data.geonames, function( item ) { - return { - label: item.name, - value: item.name - } - })); - } - }); - }, - minLength: 2, - select: function( event, ui ) { - /*if(ui.item) { - $('#adr_country').val(ui.item.country); - } - log( ui.item ? - "Selected: " + ui.item.label : - "Nothing selected, input was " + this.value);*/ - }, - open: function() { - $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); - }, - close: function() { - $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); - } - }); - } - }); - } else { - alert(jsondata.data.message); - } - }); - } - }, - saveAddress:function(dlg, obj, isnew){ - if(!this.enabled) { - return; - } - if(isnew) { - container = $('#addresses dl').last(); - obj = container.find('input').first(); - } else { - checksum = OC.Contacts.checksumFor(obj); - container = OC.Contacts.propertyContainerFor(obj); - } - var adr = new Array( - $(dlg).find('#adr_pobox').val().strip_tags(), - $(dlg).find('#adr_extended').val().strip_tags(), - $(dlg).find('#adr_street').val().strip_tags(), - $(dlg).find('#adr_city').val().strip_tags(), - $(dlg).find('#adr_region').val().strip_tags(), - $(dlg).find('#adr_zipcode').val().strip_tags(), - $(dlg).find('#adr_country').val().strip_tags() - ); - container.find('.adr').val(adr.join(';')); - container.find('.adr_type').val($(dlg).find('#adr_type').val()); - container.find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); - OC.Contacts.Card.saveProperty($(container).find('input').first()); - var adrtxt = ''; - if(adr[0].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[0] + '
  • '; - } - if(adr[1].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[1] + '
  • '; - } - if(adr[2].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[2] + '
  • '; - } - if(adr[3].length > 0 || adr[5].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[5] + ' ' + adr[3] + '
  • '; - } - if(adr[4].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[4] + '
  • '; - } - if(adr[6].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[6] + '
  • '; - } - container.find('.addresslist').html(adrtxt); - }, - uploadPhoto:function(filelist) { - if(!this.enabled) { - return; - } - if(!filelist) { - OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); - return; - } - var file = filelist[0]; - var target = $('#file_upload_target'); - var form = $('#file_upload_form'); - var totalSize=0; - if(file.size > $('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts', 'Error')); - return; - } else { - target.load(function(){ - var response=jQuery.parseJSON(target.contents().text()); - if(response != undefined && response.status == 'success'){ - OC.Contacts.Card.editPhoto(response.data.id, response.data.tmp); - //alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime); - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - }); - form.submit(); - } - }, - loadPhotoHandlers:function() { - var phototools = $('#phototools'); - phototools.find('li a').tipsy('hide'); - phototools.find('li a').tipsy(); - if(this.data.PHOTO) { - phototools.find('.delete').click(function() { - $(this).tipsy('hide'); - OC.Contacts.Card.deleteProperty($('#contacts_details_photo'), 'single'); - $(this).hide(); - }); - phototools.find('.edit').click(function() { - $(this).tipsy('hide'); - OC.Contacts.Card.editCurrentPhoto(); - }); - phototools.find('.delete').show(); - phototools.find('.edit').show(); - } else { - phototools.find('.delete').hide(); - phototools.find('.edit').hide(); - } - }, - cloudPhotoSelected:function(path){ - $.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),{'path':path,'id':OC.Contacts.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - OC.Contacts.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - loadPhoto:function(){ - var self = this; - var refreshstr = '&refresh='+Math.random(); - $('#phototools li a').tipsy('hide'); - var wrapper = $('#contacts_details_photo_wrapper'); - wrapper.addClass('loading').addClass('wait'); - delete this.photo; - this.photo = new Image(); - $(this.photo).load(function () { - $('img.contacts_details_photo').remove() - $(this).addClass('contacts_details_photo'); - wrapper.css('width', $(this).get(0).width + 10); - wrapper.removeClass('loading').removeClass('wait'); - $(this).insertAfter($('#phototools')).fadeIn(); - }).error(function () { - // notify the user that the image could not be loaded - OC.Contacts.notify({message:t('contacts','Error loading profile picture.')}); - }).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr); - this.loadPhotoHandlers() - }, - editCurrentPhoto:function(){ - if(!this.enabled) { - return; - } - $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - OC.Contacts.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - wrapper.removeClass('wait'); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - editPhoto:function(id, tmpkey){ - if(!this.enabled) { - return; - } - //alert('editPhoto: ' + tmpkey); - $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - if($('#edit_photo_dialog').dialog('isOpen') == true){ - $('#edit_photo_dialog').dialog('moveToTop'); - } else { - $('#edit_photo_dialog').dialog('open'); - } - }, - savePhoto:function() { - if(!this.enabled) { - return; - } - var target = $('#crop_target'); - var form = $('#cropform'); - var wrapper = $('#contacts_details_photo_wrapper'); - var self = this; - wrapper.addClass('wait'); - form.submit(); - target.load(function(){ - var response=jQuery.parseJSON(target.contents().text()); - if(response != undefined && response.status == 'success'){ - // load cropped photo. - self.loadPhoto(); - OC.Contacts.Card.data.PHOTO = true; - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - wrapper.removeClass('wait'); - } - }); - OC.Contacts.Contacts.refreshThumbnail(this.id); - }, - addIM:function() { - //alert('addMail'); - var imlist = $('#imlist'); - imlist.find('li.template:first-child').clone(true).appendTo(imlist).show().find('a .tip').tipsy(); - imlist.find('li.template:last-child').find('select').addClass('contacts_property'); - imlist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); - imlist.find('li:last-child').find('input[type="text"]').focus(); - return false; - }, - loadIMs:function() { - //console.log('loadIMs'); - $('#ims').hide(); - $('#imlist li.propertycontainer').remove(); - var imlist = $('#imlist'); - for(var im in this.data.IMPP) { - this.addIM(); - var curim = imlist.find('li.propertycontainer:last-child'); - if(typeof this.data.IMPP[im].label != 'undefined') { - curim.prepend(''); - } - curim.data('checksum', this.data.IMPP[im]['checksum']) - curim.find('input[type="text"]').val(this.data.IMPP[im]['value'].split(':').pop()); - for(var param in this.data.IMPP[im]['parameters']) { - if(param.toUpperCase() == 'PREF') { - curim.find('input[type="checkbox"]').attr('checked', 'checked') - } - else if(param.toUpperCase() == 'TYPE') { - if(typeof this.data.IMPP[im]['parameters'][param] == 'string') { - var found = false; - var imt = this.data.IMPP[im]['parameters'][param]; - curim.find('select.types option').each(function(){ - if($(this).val().toUpperCase() == imt.toUpperCase()) { - $(this).attr('selected', 'selected'); - found = true; - } - }); - if(!found) { - curim.find('select.type option:last-child').after(''); - } - } else if(typeof this.data.IMPP[im]['parameters'][param] == 'object') { - for(imtype in this.data.IMPP[im]['parameters'][param]) { - var found = false; - var imt = this.data.IMPP[im]['parameters'][param][imtype]; - curim.find('select.types option').each(function(){ - if($(this).val().toUpperCase() == imt.toUpperCase().split(',')) { - $(this).attr('selected', 'selected'); - found = true; - } - }); - if(!found) { - curim.find('select.type option:last-child').after(''); - } - } - } - } - else if(param.toUpperCase() == 'X-SERVICE-TYPE') { - curim.find('select.impp').val(this.data.IMPP[im]['parameters'][param].toLowerCase()); - } - } - } - if($('#imlist li').length > 1) { - $('#ims').show(); - } - return false; - }, - addMail:function() { - var emaillist = $('#emaillist'); - emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy(); - emaillist.find('li.template:last-child').find('select').addClass('contacts_property'); - emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); - emaillist.find('li:last-child').find('input[type="email"]').focus(); - emaillist.find('li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - return false; - }, - loadMails:function() { - $('#emails').hide(); - $('#emaillist li.propertycontainer').remove(); - var emaillist = $('#emaillist'); - for(var mail in this.data.EMAIL) { - this.addMail(); - emaillist.find('li:last-child').find('select').multiselect('destroy'); - var curemail = emaillist.find('li.propertycontainer:last-child'); - if(typeof this.data.EMAIL[mail].label != 'undefined') { - curemail.prepend(''); - } - curemail.data('checksum', this.data.EMAIL[mail]['checksum']) - curemail.find('input[type="email"]').val(this.data.EMAIL[mail]['value']); - for(var param in this.data.EMAIL[mail]['parameters']) { - if(param.toUpperCase() == 'PREF') { - curemail.find('input[type="checkbox"]').attr('checked', 'checked') - } - else if(param.toUpperCase() == 'TYPE') { - for(etype in this.data.EMAIL[mail]['parameters'][param]) { - var found = false; - var et = this.data.EMAIL[mail]['parameters'][param][etype]; - curemail.find('select option').each(function(){ - if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); - found = true; - } - }); - if(!found) { - curemail.find('select option:last-child').after(''); - } - } - } - } - curemail.find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - } - if($('#emaillist li').length > 1) { - $('#emails').show(); - } - $('#emaillist li:last-child').find('input[type="text"]').focus(); - return false; - }, - addPhone:function() { - var phonelist = $('#phonelist'); - phonelist.find('li.template:first-child').clone(true).appendTo(phonelist); //.show(); - phonelist.find('li.template:last-child').find('select').addClass('contacts_property'); - phonelist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); - phonelist.find('li:last-child').find('input[type="text"]').focus(); - phonelist.find('li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - phonelist.find('li:last-child').show(); - return false; - }, - loadPhones:function() { - $('#phones').hide(); - $('#phonelist li.propertycontainer').remove(); - var phonelist = $('#phonelist'); - for(var phone in this.data.TEL) { - this.addPhone(); - var curphone = phonelist.find('li.propertycontainer:last-child'); - if(typeof this.data.TEL[phone].label != 'undefined') { - curphone.prepend(''); - } - curphone.find('select').multiselect('destroy'); - curphone.data('checksum', this.data.TEL[phone]['checksum']) - curphone.find('input[type="text"]').val(this.data.TEL[phone]['value']); - for(var param in this.data.TEL[phone]['parameters']) { - if(param.toUpperCase() == 'PREF') { - curphone.find('input[type="checkbox"]').attr('checked', 'checked'); - } - else if(param.toUpperCase() == 'TYPE') { - for(ptype in this.data.TEL[phone]['parameters'][param]) { - var found = false; - var pt = this.data.TEL[phone]['parameters'][param][ptype]; - curphone.find('select option').each(function() { - //if ($(this).val().toUpperCase() == pt.toUpperCase()) { - if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); - found = true; - } - }); - if(!found) { - curphone.find('select option:last-child').after(''); - } - } - } - } - curphone.find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - } - if(phonelist.find('li').length > 1) { - $('#phones').show(); - } - return false; - }, - }, - Contacts:{ - contacts:{}, - deletionQueue:[], - batchnum:50, - warnNotDeleted:function(e) { - e = e || window.event; - var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.'); - if (e) { - e.returnValue = String(warn); - } - if(OC.Contacts.Contacts.deletionQueue.length > 0) { - setTimeout(OC.Contacts.Contacts.deleteFilesInQueue, 1); - } - return warn; - }, - deleteFilesInQueue:function() { - var queue = OC.Contacts.Contacts.deletionQueue; - if(queue.length > 0) { - OC.Contacts.notify({cancel:true}); - while(queue.length > 0) { - var id = queue.pop(); - if(id) { - OC.Contacts.Card.doDelete(id, false); - } - } - } - }, - getContact:function(id) { - if(!this.contacts[id]) { - this.contacts[id] = $('#contacts li[data-id="'+id+'"]'); - if(!this.contacts[id]) { - self = this; - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - self.contacts[id] = self.insertContact({data:jsondata.data}); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - } - return this.contacts[id]; - }, - drop:function(event, ui) { - var dragitem = ui.draggable, droptarget = $(this); - if(dragitem.is('li')) { - OC.Contacts.Contacts.dropContact(event, dragitem, droptarget); - } else { - OC.Contacts.Contacts.dropAddressbook(event, dragitem, droptarget); - } - }, - dropContact:function(event, dragitem, droptarget) { - if(dragitem.data('bookid') == droptarget.data('id')) { - return false; - } - var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next(); - $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'), - { - id: dragitem.data('id'), - aid: droptarget.data('id') - }, - function(jsondata){ - if(jsondata.status == 'success'){ - dragitem.attr('data-bookid', droptarget.data('id')) - dragitem.data('bookid', droptarget.data('id')); - OC.Contacts.Contacts.insertContact({ - contactlist:droplist, - contact:dragitem.detach() - }); - OC.Contacts.Contacts.scrollTo(dragitem.data('id')); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - dropAddressbook:function(event, dragitem, droptarget) { - if(confirm(t('contacts', 'Do you want to merge these address books?'))) { - if(dragitem.data('bookid') == droptarget.data('id')) { - return false; - } - var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next(); - $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'), - { - id: dragitem.data('id'), - aid: droptarget.data('id'), - isaddressbook: 1 - }, - function(jsondata){ - if(jsondata.status == 'success'){ - OC.Contacts.Contacts.update(); // Easier to refresh the whole bunch. - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - return false; - } - }, - /** - * @params params An object with the properties 'contactlist':a jquery object of the ul to insert into, - * 'contacts':a jquery object of all items in the list and either 'data': an object with the properties - * id, addressbookid and displayname or 'contact': a listitem to be inserted directly. - * If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'. - */ - insertContact:function(params) { - var id, bookid; - if(!params.contactlist) { - // FIXME: Check if contact really exists. - bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); - id = params.data ? params.data.id : params.contact.data('id'); - params.contactlist = $('#contacts ul[data-id="'+bookid+'"]'); - } - if(!params.contacts) { - bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); - id = params.data ? params.data.id : params.contact.data('id'); - params.contacts = $('#contacts ul[data-id="'+bookid+'"] li'); - } - var contact = params.data - ? $('
  • ' - + params.data.displayname+'
  • ') - : params.contact; - var added = false; - var name = params.data ? params.data.displayname.toLowerCase() : contact.find('a').text().toLowerCase(); - if(params.contacts) { - params.contacts.each(function() { - if ($(this).text().toLowerCase() > name) { - $(this).before(contact); - added = true; - return false; - } - }); - } - if(!added || !params.contacts) { - params.contactlist.append(contact); - } - //this.contacts[id] = contact; - return contact; - }, - addAddressbook:function(name, description, cb) { - $.post(OC.filePath('contacts', 'ajax/addressbook', 'add.php'), { name: name, description: description, active: true }, - function(jsondata) { - if(jsondata.status == 'success'){ - if(cb && typeof cb == 'function') { - cb(jsondata.data.addressbook); - } - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - return false; - } - }); - }, - doImport:function(file, aid){ - $.post(OC.filePath('contacts', '', 'import.php'), { id: aid, file: file, fstype: 'OC_FilesystemView' }, - function(jsondata){ - if(jsondata.status != 'success'){ - OC.Contacts.notify({message:jsondata.data.message}); - } - }); - return false; - }, - next:function(reverse) { - var curlistitem = this.getContact(OC.Contacts.Card.id); - var newlistitem = reverse ? curlistitem.prev('li') : curlistitem.next('li'); - if(newlistitem) { - curlistitem.removeClass('active'); - OC.Contacts.Card.update({ - cid:newlistitem.data('id'), - aid:newlistitem.data('bookid') - }); - } - }, - previous:function() { - this.next(true); - }, - nextAddressbook:function(reverse) { - console.log('nextAddressbook', reverse); - var curlistitem = this.getContact(OC.Contacts.Card.id); - var parent = curlistitem.parent('ul'); - var newparent = reverse - ? parent.prevAll('ul').first() - : parent.nextAll('ul').first(); - if(newparent) { - newlistitem = newparent.find('li:first-child'); - if(newlistitem) { - parent.slideUp().prev('h3').removeClass('active'); - newparent.slideDown().prev('h3').addClass('active'); - curlistitem.removeClass('active'); - OC.Contacts.Card.update({ - cid:newlistitem.data('id'), - aid:newlistitem.data('bookid') - }); - } - } - }, - previousAddressbook:function() { - console.log('previousAddressbook'); - this.nextAddressbook(true); - }, - // Reload the contacts list. - update:function(params){ - if(!params) { params = {}; } - if(!params.start) { - if(params.aid) { - $('#contacts h3[data-id="'+params.aid+'"],#contacts ul[data-id="'+params.aid+'"]').remove(); - } else { - $('#contacts').empty(); - } - } - self = this; - console.log('update: ' + params.cid + ' ' + params.aid + ' ' + params.start); - var firstrun = false; - var opts = {}; - opts['startat'] = (params.start?params.start:0); - if(params.aid) { - opts['aid'] = params.aid; - } - $.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'),opts,function(jsondata){ - if(jsondata.status == 'success'){ - var books = jsondata.data.entries; - $.each(books, function(b, book) { - if($('#contacts h3[data-id="'+b+'"]').length == 0) { - firstrun = true; - if($('#contacts h3').length == 0) { - $('#contacts').html('

    ' + book.displayname - + '

    '); - } else { - if(!$('#contacts h3[data-id="' + b + '"]').length) { - var item = $('

    ' - + book.displayname+'

    '); - var added = false; - $('#contacts h3').each(function(){ - if ($(this).text().toLowerCase() > book.displayname.toLowerCase()) { - $(this).before(item).fadeIn('fast'); - added = true; - return false; - } - }); - if(!added) { - $('#contacts').append(item); - } - } - } - $('#contacts h3[data-id="'+b+'"]').on('click', function(event) { - $('#contacts h3').removeClass('active'); - $(this).addClass('active'); - $('#contacts ul[data-id="'+b+'"]').slideToggle(300); - return false; - }); - var accept = 'li:not([data-bookid="'+b+'"]),h3:not([data-id="'+b+'"])'; - $('#contacts h3[data-id="'+b+'"],#contacts ul[data-id="'+b+'"]').droppable({ - drop: OC.Contacts.Contacts.drop, - activeClass: 'ui-state-hover', - accept: accept - }); - } - var contactlist = $('#contacts ul[data-id="'+b+'"]'); - var contacts = $('#contacts ul[data-id="'+b+'"] li'); - for(var c in book.contacts) { - if(book.contacts[c].id == undefined) { continue; } - if(!$('#contacts li[data-id="'+book.contacts[c]['id']+'"]').length) { - var contact = OC.Contacts.Contacts.insertContact({contactlist:contactlist, contacts:contacts, data:book.contacts[c]}); - if(c == self.batchnum-10) { - contact.bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - $(this).unbind(event); - var bookid = $(this).data('bookid'); - var numsiblings = $('.contacts li[data-bookid="'+bookid+'"]').length; - if (isInView && numsiblings >= self.batchnum) { - console.log('This would be a good time to load more contacts.'); - OC.Contacts.Contacts.update({cid:params.cid, aid:bookid, start:$('#contacts li[data-bookid="'+bookid+'"]').length}); - } - }); - } - } - } - }); - if($('#contacts h3').length > 1) { - $('#contacts li,#contacts h3').draggable({ - distance: 10, - revert: 'invalid', - axis: 'y', containment: '#contacts', - scroll: true, scrollSensitivity: 40, - opacity: 0.7, helper: 'clone' - }); - } else { - $('#contacts h3').first().addClass('active'); - } - if(opts['startat'] == 0) { // only update card on first load. - OC.Contacts.Card.update(params); - } - } else { - OC.Contacts.notify({message:t('contacts', 'Error')+': '+jsondata.data.message}); - } - }); - }, - refreshThumbnail:function(id){ - var item = $('.contacts li[data-id="'+id+'"]').find('a'); - item.html(OC.Contacts.Card.fn); - item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat'); - }, - scrollTo:function(id){ - var item = $('#contacts li[data-id="'+id+'"]'); - if(item && $.isNumeric(item.offset().top)) { - console.log('scrollTo ' + parseInt(item.offset().top)); - $('#contacts').animate({ - scrollTop: parseInt(item.offset()).top-40}, 'slow','swing'); - } - } - } -} -$(document).ready(function(){ - - OCCategories.changed = OC.Contacts.Card.categoriesChanged; - OCCategories.app = 'contacts'; - - var ninjahelp = $('#ninjahelp'); - - $('#bottomcontrols .settings').on('click keydown', function() { - try { - ninjahelp.hide(); - OC.appSettings({appid:'contacts', loadJS:true, cache:false}); - } catch(e) { - console.log('error:', e.message); - } - }); - $('#bottomcontrols .import').click(function() { - $('#import_upload_start').trigger('click'); - }); - $('#contacts_newcontact').on('click keydown', OC.Contacts.Card.editNew); - - ninjahelp.find('.close').on('click keydown',function() { - ninjahelp.hide(); - }); - - $(document).on('keyup', function(event) { - if(event.target.nodeName.toUpperCase() != 'BODY' - || $('#contacts li').length == 0 - || !OC.Contacts.Card.id) { - return; - } - //console.log(event.which + ' ' + event.target.nodeName); - /** - * To add: - * Shift-a: add addressbook - * u (85): hide/show leftcontent - * f (70): add field - */ - switch(event.which) { - case 27: // Esc - ninjahelp.hide(); - break; - case 46: // Delete - if(event.shiftKey) { - OC.Contacts.Card.delayedDelete(); - } - break; - case 40: // down - case 74: // j - OC.Contacts.Contacts.next(); - break; - case 65: // a - if(event.shiftKey) { - // add addressbook - OC.Contacts.notImplemented(); - break; - } - OC.Contacts.Card.editNew(); - break; - case 38: // up - case 75: // k - OC.Contacts.Contacts.previous(); - break; - case 34: // PageDown - case 78: // n - // next addressbook - OC.Contacts.Contacts.nextAddressbook(); - break; - case 79: // o - var aid = $('#contacts h3.active').first().data('id'); - if(aid) { - $('#contacts ul[data-id="'+aid+'"]').slideToggle(300); - } - break; - case 33: // PageUp - case 80: // p - // prev addressbook - OC.Contacts.Contacts.previousAddressbook(); - break; - case 82: // r - OC.Contacts.Contacts.update({cid:OC.Contacts.Card.id}); - break; - case 191: // ? - ninjahelp.toggle('fast'); - break; - } - - }); - - //$(window).on('beforeunload', OC.Contacts.Contacts.deleteFilesInQueue); - - // Load a contact. - $('.contacts').keydown(function(event) { - if(event.which == 13 || event.which == 32) { - $('.contacts').click(); - } - }); - $(document).on('click', '#contacts', function(event){ - var $tgt = $(event.target); - if ($tgt.is('li') || $tgt.is('a')) { - var item = $tgt.is('li')?$($tgt):($tgt).parent(); - var id = item.data('id'); - var bookid = item.data('bookid'); - item.addClass('active'); - var oldid = $('#rightcontent').data('id'); - if(oldid != 0){ - var olditem = $('.contacts li[data-id="'+oldid+'"]'); - var oldbookid = olditem.data('bookid'); - olditem.removeClass('active'); - if(oldbookid != bookid) { - $('#contacts h3[data-id="'+oldbookid+'"]').removeClass('active'); - $('#contacts h3[data-id="'+bookid+'"]').addClass('active'); - } - } - $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - OC.Contacts.Card.loadContact(jsondata.data, bookid); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - return false; - }); - - $('.contacts_property').live('change', function(){ - OC.Contacts.Card.saveProperty(this); - }); - - $(function() { - // Upload function for dropped contact photos files. Should go in the Contacts class/object. - $.fileUpload = function(files){ - var file = files[0]; - if(file.size > $('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); - return; - } - if (file.type.indexOf("image") != 0) { - OC.dialogs.alert(t('contacts','Only image files can be used as profile picture.'), t('contacts','Wrong file type')); - return; - } - var xhr = new XMLHttpRequest(); - - if (!xhr.upload) { - OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'), t('contacts', 'Error')) - } - fileUpload = xhr.upload, - xhr.onreadystatechange = function() { - if (xhr.readyState == 4){ - response = $.parseJSON(xhr.responseText); - if(response.status == 'success') { - if(xhr.status == 200) { - OC.Contacts.Card.editPhoto(response.data.id, response.data.tmp); - } else { - OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); - } - } else { - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - } - }; - - fileUpload.onprogress = function(e){ - if (e.lengthComputable){ - var _progress = Math.round((e.loaded * 100) / e.total); - //if (_progress != 100){ - //} - } - }; - xhr.open('POST', OC.filePath('contacts', 'ajax', 'uploadphoto.php')+'?id='+OC.Contacts.Card.id+'&requesttoken='+requesttoken+'&imagefile='+encodeURIComponent(file.name), true); - xhr.setRequestHeader('Cache-Control', 'no-cache'); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('X_FILE_NAME', encodeURIComponent(file.name)); - xhr.setRequestHeader('X-File-Size', file.size); - xhr.setRequestHeader('Content-Type', file.type); - xhr.send(file); - } - }); - - $(document).bind('drop dragover', function (e) { - e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone - }); - - //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) - if(navigator.userAgent.search(/konqueror/i)==-1){ - $('#import_upload_start').attr('multiple','multiple') - } - // Import using jquery.fileupload - $(function() { - var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0; - var aid; - - $('#import_upload_start').fileupload({ - dropZone: $('#contacts'), // restrict dropZone to contacts list. - acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i, - add: function(e, data) { - var files = data.files; - var totalSize=0; - if(files) { - numfiles += files.length; uploadedfiles = 0; - for(var i=0;i$('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - return; - }else{ - if($.support.xhrFileUpload) { - for(var i=0;i 3) { - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - $('#uploadprogressbar').fadeOut(); - OC.dialogs.alert(t('contacts', 'Something went wrong with the upload, please retry.'), t('contacts', 'Error')); - return; - } - setTimeout(function() { // Just to let any uploads finish - importFiles(aid, uploadingFiles); - }, 1000); - } - $('#uploadprogressbar').progressbar('value',50); - var todo = uploadedfiles; - $.each(fileList, function(fileName, data) { - OC.Contacts.Contacts.doImport(fileName, aid); - delete fileList[fileName]; - numfiles -= 1; uploadedfiles -= 1; - $('#uploadprogressbar').progressbar('value',50+(50/(todo-uploadedfiles))); - }) - $('#uploadprogressbar').progressbar('value',100); - $('#uploadprogressbar').fadeOut(); - setTimeout(function() { - OC.Contacts.Contacts.update({aid:aid}); - numfiles = uploadedfiles = retries = aid = 0; - }, 1000); - } - if(!aid) { - // Either selected with filepicker or dropped outside of an address book. - $.getJSON(OC.filePath('contacts', 'ajax', 'selectaddressbook.php'),{},function(jsondata) { - if(jsondata.status == 'success') { - if($('#selectaddressbook_dialog').dialog('isOpen') == true) { - $('#selectaddressbook_dialog').dialog('moveToTop'); - } else { - $('#dialog_holder').html(jsondata.data.page).ready(function($) { - var select_dlg = $('#selectaddressbook_dialog'); - select_dlg.dialog({ - modal: true, height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - aid = select_dlg.find('input:checked').val(); - if(aid == 'new') { - var displayname = select_dlg.find('input.name').val(); - var description = select_dlg.find('input.desc').val(); - if(!displayname.trim()) { - OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error')); - return false; - } - $(this).dialog('close'); - OC.Contacts.Contacts.addAddressbook(displayname, description, function(addressbook) { - aid = addressbook.id; - setTimeout(function() { - importFiles(aid, uploadingFiles); - }, 500); - console.log('aid ' + aid); - }); - } else { - setTimeout(function() { - importFiles(aid, uploadingFiles); - }, 500); - console.log('aid ' + aid); - $(this).dialog('close'); - } - }, - 'Cancel':function() { - $(this).dialog('close'); - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - $('#uploadprogressbar').fadeOut(); - } - }, - close: function(event, ui) { - // TODO: If numfiles != 0 delete tmp files after a timeout. - $(this).dialog('destroy').remove(); - } - }); - }); - } - } else { - $('#uploadprogressbar').fadeOut(); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - // Dropped on an address book or it's list. - setTimeout(function() { // Just to let any uploads finish - importFiles(aid, uploadingFiles); - }, 1000); - } - if(data.dataType != 'iframe ') { - $('#upload input.stop').hide(); - } - } - }) - }); - - OC.Contacts.loadHandlers(); - OC.Contacts.Contacts.update({cid:id}); -}); diff --git a/apps/contacts/js/expanding.js b/apps/contacts/js/expanding.js deleted file mode 100644 index 17139f27ff..0000000000 --- a/apps/contacts/js/expanding.js +++ /dev/null @@ -1,118 +0,0 @@ -// Expanding Textareas -// https://github.com/bgrins/ExpandingTextareas - -(function(factory) { - // Add jQuery via AMD registration or browser globals - if (typeof define === 'function' && define.amd) { - define([ 'jquery' ], factory); - } - else { - factory(jQuery); - } -}(function ($) { - $.expandingTextarea = $.extend({ - autoInitialize: true, - initialSelector: "textarea.expanding", - opts: { - resize: function() { } - } - }, $.expandingTextarea || {}); - - var cloneCSSProperties = [ - 'lineHeight', 'textDecoration', 'letterSpacing', - 'fontSize', 'fontFamily', 'fontStyle', - 'fontWeight', 'textTransform', 'textAlign', - 'direction', 'wordSpacing', 'fontSizeAdjust', - 'wordWrap', - 'borderLeftWidth', 'borderRightWidth', - 'borderTopWidth','borderBottomWidth', - 'paddingLeft', 'paddingRight', - 'paddingTop','paddingBottom', - 'marginLeft', 'marginRight', - 'marginTop','marginBottom', - 'boxSizing', 'webkitBoxSizing', 'mozBoxSizing', 'msBoxSizing' - ]; - - var textareaCSS = { - position: "absolute", - height: "100%", - resize: "none" - }; - - var preCSS = { - visibility: "hidden", - border: "0 solid", - whiteSpace: "pre-wrap" - }; - - var containerCSS = { - position: "relative" - }; - - function resize() { - $(this).closest('.expandingText').find("div").text(this.value + ' '); - $(this).trigger("resize.expanding"); - } - - $.fn.expandingTextarea = function(o) { - - var opts = $.extend({ }, $.expandingTextarea.opts, o); - - if (o === "resize") { - return this.trigger("input.expanding"); - } - - if (o === "destroy") { - this.filter(".expanding-init").each(function() { - var textarea = $(this).removeClass('expanding-init'); - var container = textarea.closest('.expandingText'); - - container.before(textarea).remove(); - textarea - .attr('style', textarea.data('expanding-styles') || '') - .removeData('expanding-styles'); - }); - - return this; - } - - this.filter("textarea").not(".expanding-init").addClass("expanding-init").each(function() { - var textarea = $(this); - - textarea.wrap("
    "); - textarea.after("
    "); - - var container = textarea.parent().css(containerCSS); - var pre = container.find("pre").css(preCSS); - - // Store the original styles in case of destroying. - textarea.data('expanding-styles', textarea.attr('style')); - textarea.css(textareaCSS); - - $.each(cloneCSSProperties, function(i, p) { - var val = textarea.css(p); - - // Only set if different to prevent overriding percentage css values. - if (pre.css(p) !== val) { - pre.css(p, val); - } - }); - - textarea.bind("input.expanding propertychange.expanding", resize); - resize.apply(this); - - if (opts.resize) { - textarea.bind("resize.expanding", opts.resize); - } - }); - - return this; - }; - - $(function () { - if ($.expandingTextarea.autoInitialize) { - $($.expandingTextarea.initialSelector).expandingTextarea(); - } - }); - -})); diff --git a/apps/contacts/js/jquery.Jcrop.js b/apps/contacts/js/jquery.Jcrop.js deleted file mode 100644 index 36f9a0f08f..0000000000 --- a/apps/contacts/js/jquery.Jcrop.js +++ /dev/null @@ -1,1765 +0,0 @@ -/** - * jquery.Jcrop.js v0.9.9 {{{ - * - * jQuery Image Cropping Plugin - released under MIT License - * Author: Kelly Hallman - * http://github.com/tapmodo/Jcrop - * - * }}} - * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{ - * - * 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. - * - * }}} - */ - -(function ($) { - - $.Jcrop = function (obj, opt) { - var options = $.extend({}, $.Jcrop.defaults), - docOffset, lastcurs, ie6mode = false; - - // Internal Methods {{{ - function px(n) { - return parseInt(n, 10) + 'px'; - } - function cssClass(cl) { - return options.baseClass + '-' + cl; - } - function supportsColorFade() { - return $.fx.step.hasOwnProperty('backgroundColor'); - } - function getPos(obj) //{{{ - { - var pos = $(obj).offset(); - return [pos.left, pos.top]; - } - //}}} - function mouseAbs(e) //{{{ - { - return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])]; - } - //}}} - function setOptions(opt) //{{{ - { - if (typeof(opt) !== 'object') opt = {}; - options = $.extend(options, opt); - - $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) { - if (typeof(options[e]) !== 'function') options[e] = function () {}; - }); - } - //}}} - function startDragMode(mode, pos) //{{{ - { - docOffset = getPos($img); - Tracker.setCursor(mode === 'move' ? mode : mode + '-resize'); - - if (mode === 'move') { - return Tracker.activateHandlers(createMover(pos), doneSelect); - } - - var fc = Coords.getFixed(); - var opp = oppLockCorner(mode); - var opc = Coords.getCorner(oppLockCorner(opp)); - - Coords.setPressed(Coords.getCorner(opp)); - Coords.setCurrent(opc); - - Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect); - } - //}}} - function dragmodeHandler(mode, f) //{{{ - { - return function (pos) { - if (!options.aspectRatio) { - switch (mode) { - case 'e': - pos[1] = f.y2; - break; - case 'w': - pos[1] = f.y2; - break; - case 'n': - pos[0] = f.x2; - break; - case 's': - pos[0] = f.x2; - break; - } - } else { - switch (mode) { - case 'e': - pos[1] = f.y + 1; - break; - case 'w': - pos[1] = f.y + 1; - break; - case 'n': - pos[0] = f.x + 1; - break; - case 's': - pos[0] = f.x + 1; - break; - } - } - Coords.setCurrent(pos); - Selection.update(); - }; - } - //}}} - function createMover(pos) //{{{ - { - var lloc = pos; - KeyManager.watchKeys(); - - return function (pos) { - Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); - lloc = pos; - - Selection.update(); - }; - } - //}}} - function oppLockCorner(ord) //{{{ - { - switch (ord) { - case 'n': - return 'sw'; - case 's': - return 'nw'; - case 'e': - return 'nw'; - case 'w': - return 'ne'; - case 'ne': - return 'sw'; - case 'nw': - return 'se'; - case 'se': - return 'nw'; - case 'sw': - return 'ne'; - } - } - //}}} - function createDragger(ord) //{{{ - { - return function (e) { - if (options.disabled) { - return false; - } - if ((ord === 'move') && !options.allowMove) { - return false; - } - - // Fix position of crop area when dragged the very first time. - // Necessary when crop image is in a hidden element when page is loaded. - docOffset = getPos($img); - - btndown = true; - startDragMode(ord, mouseAbs(e)); - e.stopPropagation(); - e.preventDefault(); - return false; - }; - } - //}}} - function presize($obj, w, h) //{{{ - { - var nw = $obj.width(), - nh = $obj.height(); - if ((nw > w) && w > 0) { - nw = w; - nh = (w / $obj.width()) * $obj.height(); - } - if ((nh > h) && h > 0) { - nh = h; - nw = (h / $obj.height()) * $obj.width(); - } - xscale = $obj.width() / nw; - yscale = $obj.height() / nh; - $obj.width(nw).height(nh); - } - //}}} - function unscale(c) //{{{ - { - return { - x: parseInt(c.x * xscale, 10), - y: parseInt(c.y * yscale, 10), - x2: parseInt(c.x2 * xscale, 10), - y2: parseInt(c.y2 * yscale, 10), - w: parseInt(c.w * xscale, 10), - h: parseInt(c.h * yscale, 10) - }; - } - //}}} - function doneSelect(pos) //{{{ - { - var c = Coords.getFixed(); - if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) { - Selection.enableHandles(); - Selection.done(); - } else { - Selection.release(); - } - Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); - } - //}}} - function newSelection(e) //{{{ - { - if (options.disabled) { - return false; - } - if (!options.allowSelect) { - return false; - } - btndown = true; - docOffset = getPos($img); - Selection.disableHandles(); - Tracker.setCursor('crosshair'); - var pos = mouseAbs(e); - Coords.setPressed(pos); - Selection.update(); - Tracker.activateHandlers(selectDrag, doneSelect); - KeyManager.watchKeys(); - - e.stopPropagation(); - e.preventDefault(); - return false; - } - //}}} - function selectDrag(pos) //{{{ - { - Coords.setCurrent(pos); - Selection.update(); - } - //}}} - function newTracker() //{{{ - { - var trk = $('
    ').addClass(cssClass('tracker')); - if ($.browser.msie) { - trk.css({ - opacity: 0, - backgroundColor: 'white' - }); - } - return trk; - } - //}}} - - // }}} - // Initialization {{{ - // Sanitize some options {{{ - if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) { - ie6mode = true; - } - if (typeof(obj) !== 'object') { - obj = $(obj)[0]; - } - if (typeof(opt) !== 'object') { - opt = {}; - } - // }}} - setOptions(opt); - // Initialize some jQuery objects {{{ - // The values are SET on the image(s) for the interface - // If the original image has any of these set, they will be reset - // However, if you destroy() the Jcrop instance the original image's - // character in the DOM will be as you left it. - var img_css = { - border: 'none', - visibility: 'visible', - margin: 0, - padding: 0, - position: 'absolute', - top: 0, - left: 0 - }; - - var $origimg = $(obj), - img_mode = true; - - if (obj.tagName == 'IMG') { - // Fix size of crop image. - // Necessary when crop image is within a hidden element when page is loaded. - if ($origimg[0].width != 0 && $origimg[0].height != 0) { - // Obtain dimensions from contained img element. - $origimg.width($origimg[0].width); - $origimg.height($origimg[0].height); - } else { - // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). - var tempImage = new Image(); - tempImage.src = $origimg[0].src; - $origimg.width(tempImage.width); - $origimg.height(tempImage.height); - } - - var $img = $origimg.clone().removeAttr('id').css(img_css).show(); - - $img.width($origimg.width()); - $img.height($origimg.height()); - $origimg.after($img).hide(); - - } else { - $img = $origimg.css(img_css).show(); - img_mode = false; - if (options.shade === null) { options.shade = true; } - } - - presize($img, options.boxWidth, options.boxHeight); - - var boundx = $img.width(), - boundy = $img.height(), - - - $div = $('
    ').width(boundx).height(boundy).addClass(cssClass('holder')).css({ - position: 'relative', - backgroundColor: options.bgColor - }).insertAfter($origimg).append($img); - - if (options.addClass) { - $div.addClass(options.addClass); - } - - var $img2 = $('
    '), - - $img_holder = $('
    ') - .width('100%').height('100%').css({ - zIndex: 310, - position: 'absolute', - overflow: 'hidden' - }), - - $hdl_holder = $('
    ') - .width('100%').height('100%').css('zIndex', 320), - - $sel = $('
    ') - .css({ - position: 'absolute', - zIndex: 600 - }).dblclick(function(){ - var c = Coords.getFixed(); - options.onDblClick.call(api,c); - }).insertBefore($img).append($img_holder, $hdl_holder); - - if (img_mode) { - - $img2 = $('') - .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy), - - $img_holder.append($img2); - - } - - if (ie6mode) { - $sel.css({ - overflowY: 'hidden' - }); - } - - var bound = options.boundary; - var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({ - position: 'absolute', - top: px(-bound), - left: px(-bound), - zIndex: 290 - }).mousedown(newSelection); - - /* }}} */ - // Set more variables {{{ - var bgcolor = options.bgColor, - bgopacity = options.bgOpacity, - xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true, - btndown, animating, shift_down; - - docOffset = getPos($img); - // }}} - // }}} - // Internal Modules {{{ - // Touch Module {{{ - var Touch = (function () { - // Touch support detection function adapted (under MIT License) - // from code by Jeffrey Sambells - http://github.com/iamamused/ - function hasTouchSupport() { - var support = {}, - events = ['touchstart', 'touchmove', 'touchend'], - el = document.createElement('div'), i; - - try { - for(i=0; i x1 + ox) { - ox -= ox + x1; - } - if (0 > y1 + oy) { - oy -= oy + y1; - } - - if (boundy < y2 + oy) { - oy += boundy - (y2 + oy); - } - if (boundx < x2 + ox) { - ox += boundx - (x2 + ox); - } - - x1 += ox; - x2 += ox; - y1 += oy; - y2 += oy; - } - //}}} - function getCorner(ord) //{{{ - { - var c = getFixed(); - switch (ord) { - case 'ne': - return [c.x2, c.y]; - case 'nw': - return [c.x, c.y]; - case 'se': - return [c.x2, c.y2]; - case 'sw': - return [c.x, c.y2]; - } - } - //}}} - function getFixed() //{{{ - { - if (!options.aspectRatio) { - return getRect(); - } - // This function could use some optimization I think... - var aspect = options.aspectRatio, - min_x = options.minSize[0] / xscale, - - - //min_y = options.minSize[1]/yscale, - max_x = options.maxSize[0] / xscale, - max_y = options.maxSize[1] / yscale, - rw = x2 - x1, - rh = y2 - y1, - rwa = Math.abs(rw), - rha = Math.abs(rh), - real_ratio = rwa / rha, - xx, yy, w, h; - - if (max_x === 0) { - max_x = boundx * 10; - } - if (max_y === 0) { - max_y = boundy * 10; - } - if (real_ratio < aspect) { - yy = y2; - w = rha * aspect; - xx = rw < 0 ? x1 - w : w + x1; - - if (xx < 0) { - xx = 0; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h : h + y1; - } else if (xx > boundx) { - xx = boundx; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h : h + y1; - } - } else { - xx = x2; - h = rwa / aspect; - yy = rh < 0 ? y1 - h : y1 + h; - if (yy < 0) { - yy = 0; - w = Math.abs((yy - y1) * aspect); - xx = rw < 0 ? x1 - w : w + x1; - } else if (yy > boundy) { - yy = boundy; - w = Math.abs(yy - y1) * aspect; - xx = rw < 0 ? x1 - w : w + x1; - } - } - - // Magic %-) - if (xx > x1) { // right side - if (xx - x1 < min_x) { - xx = x1 + min_x; - } else if (xx - x1 > max_x) { - xx = x1 + max_x; - } - if (yy > y1) { - yy = y1 + (xx - x1) / aspect; - } else { - yy = y1 - (xx - x1) / aspect; - } - } else if (xx < x1) { // left side - if (x1 - xx < min_x) { - xx = x1 - min_x; - } else if (x1 - xx > max_x) { - xx = x1 - max_x; - } - if (yy > y1) { - yy = y1 + (x1 - xx) / aspect; - } else { - yy = y1 - (x1 - xx) / aspect; - } - } - - if (xx < 0) { - x1 -= xx; - xx = 0; - } else if (xx > boundx) { - x1 -= xx - boundx; - xx = boundx; - } - - if (yy < 0) { - y1 -= yy; - yy = 0; - } else if (yy > boundy) { - y1 -= yy - boundy; - yy = boundy; - } - - return makeObj(flipCoords(x1, y1, xx, yy)); - } - //}}} - function rebound(p) //{{{ - { - if (p[0] < 0) { - p[0] = 0; - } - if (p[1] < 0) { - p[1] = 0; - } - - if (p[0] > boundx) { - p[0] = boundx; - } - if (p[1] > boundy) { - p[1] = boundy; - } - - return [p[0], p[1]]; - } - //}}} - function flipCoords(x1, y1, x2, y2) //{{{ - { - var xa = x1, - xb = x2, - ya = y1, - yb = y2; - if (x2 < x1) { - xa = x2; - xb = x1; - } - if (y2 < y1) { - ya = y2; - yb = y1; - } - return [Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb)]; - } - //}}} - function getRect() //{{{ - { - var xsize = x2 - x1, - ysize = y2 - y1, - delta; - - if (xlimit && (Math.abs(xsize) > xlimit)) { - x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); - } - if (ylimit && (Math.abs(ysize) > ylimit)) { - y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); - } - - if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) { - y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale); - } - if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) { - x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale); - } - - if (x1 < 0) { - x2 -= x1; - x1 -= x1; - } - if (y1 < 0) { - y2 -= y1; - y1 -= y1; - } - if (x2 < 0) { - x1 -= x2; - x2 -= x2; - } - if (y2 < 0) { - y1 -= y2; - y2 -= y2; - } - if (x2 > boundx) { - delta = x2 - boundx; - x1 -= delta; - x2 -= delta; - } - if (y2 > boundy) { - delta = y2 - boundy; - y1 -= delta; - y2 -= delta; - } - if (x1 > boundx) { - delta = x1 - boundy; - y2 -= delta; - y1 -= delta; - } - if (y1 > boundy) { - delta = y1 - boundy; - y2 -= delta; - y1 -= delta; - } - - return makeObj(flipCoords(x1, y1, x2, y2)); - } - //}}} - function makeObj(a) //{{{ - { - return { - x: a[0], - y: a[1], - x2: a[2], - y2: a[3], - w: a[2] - a[0], - h: a[3] - a[1] - }; - } - //}}} - - return { - flipCoords: flipCoords, - setPressed: setPressed, - setCurrent: setCurrent, - getOffset: getOffset, - moveOffset: moveOffset, - getCorner: getCorner, - getFixed: getFixed - }; - }()); - - //}}} - // Shade Module {{{ - var Shade = (function() { - var enabled = false, - holder = $('
    ').css({ - position: 'absolute', - zIndex: 240, - opacity: 0 - }), - shades = { - top: createShade(), - left: createShade().height(boundy), - right: createShade().height(boundy), - bottom: createShade() - }; - - function resizeShades(w,h) { - shades.left.css({ height: px(h) }); - shades.right.css({ height: px(h) }); - } - function updateAuto() - { - return updateShade(Coords.getFixed()); - } - function updateShade(c) - { - shades.top.css({ - left: px(c.x), - width: px(c.w), - height: px(c.y) - }); - shades.bottom.css({ - top: px(c.y2), - left: px(c.x), - width: px(c.w), - height: px(boundy-c.y2) - }); - shades.right.css({ - left: px(c.x2), - width: px(boundx-c.x2) - }); - shades.left.css({ - width: px(c.x) - }); - } - function createShade() { - return $('
    ').css({ - position: 'absolute', - backgroundColor: options.shadeColor||options.bgColor - }).appendTo(holder); - } - function enableShade() { - if (!enabled) { - enabled = true; - holder.insertBefore($img); - updateAuto(); - Selection.setBgOpacity(1,0,1); - $img2.hide(); - - setBgColor(options.shadeColor||options.bgColor,1); - if (Selection.isAwake()) - { - setOpacity(options.bgOpacity,1); - } - else setOpacity(1,1); - } - } - function setBgColor(color,now) { - colorChangeMacro(getShades(),color,now); - } - function disableShade() { - if (enabled) { - holder.remove(); - $img2.show(); - enabled = false; - if (Selection.isAwake()) { - Selection.setBgOpacity(options.bgOpacity,1,1); - } else { - Selection.setBgOpacity(1,1,1); - Selection.disableHandles(); - } - colorChangeMacro($div,0,1); - } - } - function setOpacity(opacity,now) { - if (enabled) { - if (options.bgFade && !now) { - holder.animate({ - opacity: 1-opacity - },{ - queue: false, - duration: options.fadeTime - }); - } - else holder.css({opacity:1-opacity}); - } - } - function refreshAll() { - options.shade ? enableShade() : disableShade(); - if (Selection.isAwake()) setOpacity(options.bgOpacity); - } - function getShades() { - return holder.children(); - } - - return { - update: updateAuto, - updateRaw: updateShade, - getShades: getShades, - setBgColor: setBgColor, - enable: enableShade, - disable: disableShade, - resize: resizeShades, - refresh: refreshAll, - opacity: setOpacity - }; - }()); - // }}} - // Selection Module {{{ - var Selection = (function () { - var awake, hdep = 370; - var borders = {}; - var handle = {}; - var seehandles = false; - var hhs = options.handleOffset; - - // Private Methods - function insertBorder(type) //{{{ - { - var jq = $('
    ').css({ - position: 'absolute', - opacity: options.borderOpacity - }).addClass(cssClass(type)); - $img_holder.append(jq); - return jq; - } - //}}} - function dragDiv(ord, zi) //{{{ - { - var jq = $('
    ').mousedown(createDragger(ord)).css({ - cursor: ord + '-resize', - position: 'absolute', - zIndex: zi - }).addClass('ord-'+ord); - - if (Touch.support) { - jq.bind('touchstart.jcrop', Touch.createDragger(ord)); - } - - $hdl_holder.append(jq); - return jq; - } - //}}} - function insertHandle(ord) //{{{ - { - var hs = options.handleSize; - return dragDiv(ord, hdep++).css({ - top: px(-hhs + 1), - left: px(-hhs + 1), - opacity: options.handleOpacity - }).width(hs).height(hs).addClass(cssClass('handle')); - } - //}}} - function insertDragbar(ord) //{{{ - { - var s = options.handleSize, - h = s, - w = s, - t = hhs, - l = hhs; - - switch (ord) { - case 'n': - case 's': - w = '100%'; - break; - case 'e': - case 'w': - h = '100%'; - break; - } - - return dragDiv(ord, hdep++).width(w).height(h).css({ - top: px(-t + 1), - left: px(-l + 1) - }); - } - //}}} - function createHandles(li) //{{{ - { - var i; - for (i = 0; i < li.length; i++) { - handle[li[i]] = insertHandle(li[i]); - } - } - //}}} - function moveHandles(c) //{{{ - { - var midvert = Math.round((c.h / 2) - hhs), - midhoriz = Math.round((c.w / 2) - hhs), - north = -hhs + 1, - west = -hhs + 1, - east = c.w - hhs, - south = c.h - hhs, - x, y; - - if (handle.e) { - handle.e.css({ - top: px(midvert), - left: px(east) - }); - handle.w.css({ - top: px(midvert) - }); - handle.s.css({ - top: px(south), - left: px(midhoriz) - }); - handle.n.css({ - left: px(midhoriz) - }); - } - if (handle.ne) { - handle.ne.css({ - left: px(east) - }); - handle.se.css({ - top: px(south), - left: px(east) - }); - handle.sw.css({ - top: px(south) - }); - } - if (handle.b) { - handle.b.css({ - top: px(south) - }); - handle.r.css({ - left: px(east) - }); - } - } - //}}} - function moveto(x, y) //{{{ - { - if (!options.shade) { - $img2.css({ - top: px(-y), - left: px(-x) - }); - } - $sel.css({ - top: px(y), - left: px(x) - }); - } - //}}} - function resize(w, h) //{{{ - { - $sel.width(w).height(h); - } - //}}} - function refresh() //{{{ - { - var c = Coords.getFixed(); - - Coords.setPressed([c.x, c.y]); - Coords.setCurrent([c.x2, c.y2]); - - updateVisible(); - } - //}}} - - // Internal Methods - function updateVisible(select) //{{{ - { - if (awake) { - return update(select); - } - } - //}}} - function update(select) //{{{ - { - var c = Coords.getFixed(); - - resize(c.w, c.h); - moveto(c.x, c.y); - if (options.shade) Shade.updateRaw(c); - - if (seehandles) { - moveHandles(c); - } - if (!awake) { - show(); - } - - if (select) { - options.onSelect.call(api, unscale(c)); - } else { - options.onChange.call(api, unscale(c)); - } - } - //}}} - function setBgOpacity(opacity,force,now) - { - if (!awake && !force) return; - if (options.bgFade && !now) { - $img.animate({ - opacity: opacity - },{ - queue: false, - duration: options.fadeTime - }); - } else { - $img.css('opacity', opacity); - } - } - function show() //{{{ - { - $sel.show(); - - if (options.shade) Shade.opacity(bgopacity); - else setBgOpacity(bgopacity,true); - - awake = true; - } - //}}} - function release() //{{{ - { - disableHandles(); - $sel.hide(); - - if (options.shade) Shade.opacity(1); - else setBgOpacity(1); - - awake = false; - options.onRelease.call(api); - } - //}}} - function showHandles() //{{{ - { - if (seehandles) { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - } - } - //}}} - function enableHandles() //{{{ - { - seehandles = true; - if (options.allowResize) { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - return true; - } - } - //}}} - function disableHandles() //{{{ - { - seehandles = false; - $hdl_holder.hide(); - } - //}}} - function animMode(v) //{{{ - { - if (animating === v) { - disableHandles(); - } else { - enableHandles(); - } - } - //}}} - function done() //{{{ - { - animMode(false); - refresh(); - } - //}}} - /* Insert draggable elements {{{*/ - - // Insert border divs for outline - if (options.drawBorders) { - borders = { - top: insertBorder('hline'), - bottom: insertBorder('hline bottom'), - left: insertBorder('vline'), - right: insertBorder('vline right') - }; - } - - // Insert handles on edges - if (options.dragEdges) { - handle.t = insertDragbar('n'); - handle.b = insertDragbar('s'); - handle.r = insertDragbar('e'); - handle.l = insertDragbar('w'); - } - - // Insert side and corner handles - if (options.sideHandles) { - createHandles(['n', 's', 'e', 'w']); - } - if (options.cornerHandles) { - createHandles(['sw', 'nw', 'ne', 'se']); - } - //}}} - - // This is a hack for iOS5 to support drag/move touch functionality - $(document).bind('touchstart.jcrop-ios',function(e) { - if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation(); - }); - - var $track = newTracker().mousedown(createDragger('move')).css({ - cursor: 'move', - position: 'absolute', - zIndex: 360 - }); - - if (Touch.support) { - $track.bind('touchstart.jcrop', Touch.createDragger('move')); - } - - $img_holder.append($track); - disableHandles(); - - return { - updateVisible: updateVisible, - update: update, - release: release, - refresh: refresh, - isAwake: function () { - return awake; - }, - setCursor: function (cursor) { - $track.css('cursor', cursor); - }, - enableHandles: enableHandles, - enableOnly: function () { - seehandles = true; - }, - showHandles: showHandles, - disableHandles: disableHandles, - animMode: animMode, - setBgOpacity: setBgOpacity, - done: done - }; - }()); - - //}}} - // Tracker Module {{{ - var Tracker = (function () { - var onMove = function () {}, - onDone = function () {}, - trackDoc = options.trackDocument; - - function toFront() //{{{ - { - $trk.css({ - zIndex: 450 - }); - if (Touch.support) { - $(document) - .bind('touchmove.jcrop', trackTouchMove) - .bind('touchend.jcrop', trackTouchEnd); - } - if (trackDoc) { - $(document) - .bind('mousemove.jcrop',trackMove) - .bind('mouseup.jcrop',trackUp); - } - } - //}}} - function toBack() //{{{ - { - $trk.css({ - zIndex: 290 - }); - $(document).unbind('.jcrop'); - } - //}}} - function trackMove(e) //{{{ - { - onMove(mouseAbs(e)); - return false; - } - //}}} - function trackUp(e) //{{{ - { - e.preventDefault(); - e.stopPropagation(); - - if (btndown) { - btndown = false; - - onDone(mouseAbs(e)); - - if (Selection.isAwake()) { - options.onSelect.call(api, unscale(Coords.getFixed())); - } - - toBack(); - onMove = function () {}; - onDone = function () {}; - } - - return false; - } - //}}} - function activateHandlers(move, done) //{{{ - { - btndown = true; - onMove = move; - onDone = done; - toFront(); - return false; - } - //}}} - function trackTouchMove(e) //{{{ - { - e.pageX = e.originalEvent.changedTouches[0].pageX; - e.pageY = e.originalEvent.changedTouches[0].pageY; - return trackMove(e); - } - //}}} - function trackTouchEnd(e) //{{{ - { - e.pageX = e.originalEvent.changedTouches[0].pageX; - e.pageY = e.originalEvent.changedTouches[0].pageY; - return trackUp(e); - } - //}}} - function setCursor(t) //{{{ - { - $trk.css('cursor', t); - } - //}}} - - if (!trackDoc) { - $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp); - } - - $img.before($trk); - return { - activateHandlers: activateHandlers, - setCursor: setCursor - }; - }()); - //}}} - // KeyManager Module {{{ - var KeyManager = (function () { - var $keymgr = $('').css({ - position: 'fixed', - left: '-120px', - width: '12px' - }), - $keywrap = $('
    ').css({ - position: 'absolute', - overflow: 'hidden' - }).append($keymgr); - - function watchKeys() //{{{ - { - if (options.keySupport) { - $keymgr.show(); - $keymgr.focus(); - } - } - //}}} - function onBlur(e) //{{{ - { - $keymgr.hide(); - } - //}}} - function doNudge(e, x, y) //{{{ - { - if (options.allowMove) { - Coords.moveOffset([x, y]); - Selection.updateVisible(true); - } - e.preventDefault(); - e.stopPropagation(); - } - //}}} - function parseKey(e) //{{{ - { - if (e.ctrlKey || e.metaKey) { - return true; - } - shift_down = e.shiftKey ? true : false; - var nudge = shift_down ? 10 : 1; - - switch (e.keyCode) { - case 37: - doNudge(e, -nudge, 0); - break; - case 39: - doNudge(e, nudge, 0); - break; - case 38: - doNudge(e, 0, -nudge); - break; - case 40: - doNudge(e, 0, nudge); - break; - case 27: - if (options.allowSelect) Selection.release(); - break; - case 9: - return true; - } - - return false; - } - //}}} - - if (options.keySupport) { - $keymgr.keydown(parseKey).blur(onBlur); - if (ie6mode || !options.fixedSupport) { - $keymgr.css({ - position: 'absolute', - left: '-20px' - }); - $keywrap.append($keymgr).insertBefore($img); - } else { - $keymgr.insertBefore($img); - } - } - - - return { - watchKeys: watchKeys - }; - }()); - //}}} - // }}} - // API methods {{{ - function setClass(cname) //{{{ - { - $div.removeClass().addClass(cssClass('holder')).addClass(cname); - } - //}}} - function animateTo(a, callback) //{{{ - { - var x1 = parseInt(a[0], 10) / xscale, - y1 = parseInt(a[1], 10) / yscale, - x2 = parseInt(a[2], 10) / xscale, - y2 = parseInt(a[3], 10) / yscale; - - if (animating) { - return; - } - - var animto = Coords.flipCoords(x1, y1, x2, y2), - c = Coords.getFixed(), - initcr = [c.x, c.y, c.x2, c.y2], - animat = initcr, - interv = options.animationDelay, - ix1 = animto[0] - initcr[0], - iy1 = animto[1] - initcr[1], - ix2 = animto[2] - initcr[2], - iy2 = animto[3] - initcr[3], - pcent = 0, - velocity = options.swingSpeed; - - x = animat[0]; - y = animat[1]; - x2 = animat[2]; - y2 = animat[3]; - - Selection.animMode(true); - var anim_timer; - - function queueAnimator() { - window.setTimeout(animator, interv); - } - var animator = (function () { - return function () { - pcent += (100 - pcent) / velocity; - - animat[0] = x + ((pcent / 100) * ix1); - animat[1] = y + ((pcent / 100) * iy1); - animat[2] = x2 + ((pcent / 100) * ix2); - animat[3] = y2 + ((pcent / 100) * iy2); - - if (pcent >= 99.8) { - pcent = 100; - } - if (pcent < 100) { - setSelectRaw(animat); - queueAnimator(); - } else { - Selection.done(); - if (typeof(callback) === 'function') { - callback.call(api); - } - } - }; - }()); - queueAnimator(); - } - //}}} - function setSelect(rect) //{{{ - { - setSelectRaw([parseInt(rect[0], 10) / xscale, parseInt(rect[1], 10) / yscale, parseInt(rect[2], 10) / xscale, parseInt(rect[3], 10) / yscale]); - options.onSelect.call(api, unscale(Coords.getFixed())); - Selection.enableHandles(); - } - //}}} - function setSelectRaw(l) //{{{ - { - Coords.setPressed([l[0], l[1]]); - Coords.setCurrent([l[2], l[3]]); - Selection.update(); - } - //}}} - function tellSelect() //{{{ - { - return unscale(Coords.getFixed()); - } - //}}} - function tellScaled() //{{{ - { - return Coords.getFixed(); - } - //}}} - function setOptionsNew(opt) //{{{ - { - setOptions(opt); - interfaceUpdate(); - } - //}}} - function disableCrop() //{{{ - { - options.disabled = true; - Selection.disableHandles(); - Selection.setCursor('default'); - Tracker.setCursor('default'); - } - //}}} - function enableCrop() //{{{ - { - options.disabled = false; - interfaceUpdate(); - } - //}}} - function cancelCrop() //{{{ - { - Selection.done(); - Tracker.activateHandlers(null, null); - } - //}}} - function destroy() //{{{ - { - $div.remove(); - $origimg.show(); - $(obj).removeData('Jcrop'); - } - //}}} - function setImage(src, callback) //{{{ - { - Selection.release(); - disableCrop(); - var img = new Image(); - img.onload = function () { - var iw = img.width; - var ih = img.height; - var bw = options.boxWidth; - var bh = options.boxHeight; - $img.width(iw).height(ih); - $img.attr('src', src); - $img2.attr('src', src); - presize($img, bw, bh); - boundx = $img.width(); - boundy = $img.height(); - $img2.width(boundx).height(boundy); - $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2)); - $div.width(boundx).height(boundy); - Shade.resize(boundx,boundy); - enableCrop(); - - if (typeof(callback) === 'function') { - callback.call(api); - } - }; - img.src = src; - } - //}}} - function colorChangeMacro($obj,color,now) { - var mycolor = color || options.bgColor; - if (options.bgFade && supportsColorFade() && options.fadeTime && !now) { - $obj.animate({ - backgroundColor: mycolor - }, { - queue: false, - duration: options.fadeTime - }); - } else { - $obj.css('backgroundColor', mycolor); - } - } - function interfaceUpdate(alt) //{{{ - // This method tweaks the interface based on options object. - // Called when options are changed and at end of initialization. - { - if (options.allowResize) { - if (alt) { - Selection.enableOnly(); - } else { - Selection.enableHandles(); - } - } else { - Selection.disableHandles(); - } - - Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); - Selection.setCursor(options.allowMove ? 'move' : 'default'); - - if (options.hasOwnProperty('trueSize')) { - xscale = options.trueSize[0] / boundx; - yscale = options.trueSize[1] / boundy; - } - - if (options.hasOwnProperty('setSelect')) { - setSelect(options.setSelect); - Selection.done(); - delete(options.setSelect); - } - - Shade.refresh(); - - if (options.bgColor != bgcolor) { - colorChangeMacro( - options.shade? Shade.getShades(): $div, - options.shade? - (options.shadeColor || options.bgColor): - options.bgColor - ); - bgcolor = options.bgColor; - } - - if (bgopacity != options.bgOpacity) { - bgopacity = options.bgOpacity; - if (options.shade) Shade.refresh(); - else Selection.setBgOpacity(bgopacity); - } - - xlimit = options.maxSize[0] || 0; - ylimit = options.maxSize[1] || 0; - xmin = options.minSize[0] || 0; - ymin = options.minSize[1] || 0; - - if (options.hasOwnProperty('outerImage')) { - $img.attr('src', options.outerImage); - delete(options.outerImage); - } - - Selection.refresh(); - } - //}}} - //}}} - - if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection); - - $hdl_holder.hide(); - interfaceUpdate(true); - - var api = { - setImage: setImage, - animateTo: animateTo, - setSelect: setSelect, - setOptions: setOptionsNew, - tellSelect: tellSelect, - tellScaled: tellScaled, - setClass: setClass, - - disable: disableCrop, - enable: enableCrop, - cancel: cancelCrop, - release: Selection.release, - destroy: destroy, - - focus: KeyManager.watchKeys, - - getBounds: function () { - return [boundx * xscale, boundy * yscale]; - }, - getWidgetSize: function () { - return [boundx, boundy]; - }, - getScaleFactor: function () { - return [xscale, yscale]; - }, - - ui: { - holder: $div, - selection: $sel - } - }; - - if ($.browser.msie) { - $div.bind('selectstart', function () { - return false; - }); - } - - $origimg.data('Jcrop', api); - return api; - }; - $.fn.Jcrop = function (options, callback) //{{{ - { - var api; - // Iterate over each object, attach Jcrop - this.each(function () { - // If we've already attached to this object - if ($(this).data('Jcrop')) { - // The API can be requested this way (undocumented) - if (options === 'api') return $(this).data('Jcrop'); - // Otherwise, we just reset the options... - else $(this).data('Jcrop').setOptions(options); - } - // If we haven't been attached, preload and attach - else { - if (this.tagName == 'IMG') - $.Jcrop.Loader(this,function(){ - $(this).css({display:'block',visibility:'hidden'}); - api = $.Jcrop(this, options); - if ($.isFunction(callback)) callback.call(api); - }); - else { - $(this).css({display:'block',visibility:'hidden'}); - api = $.Jcrop(this, options); - if ($.isFunction(callback)) callback.call(api); - } - } - }); - - // Return "this" so the object is chainable (jQuery-style) - return this; - }; - //}}} - // $.Jcrop.Loader - basic image loader {{{ - - $.Jcrop.Loader = function(imgobj,success,error){ - var $img = $(imgobj), img = $img[0]; - - function completeCheck(){ - if (img.complete) { - $img.unbind('.jcloader'); - if ($.isFunction(success)) success.call(img); - } - else window.setTimeout(completeCheck,50); - } - - $img - .bind('load.jcloader',completeCheck) - .bind('error.jcloader',function(e){ - $img.unbind('.jcloader'); - if ($.isFunction(error)) error.call(img); - }); - - if (img.complete && $.isFunction(success)){ - $img.unbind('.jcloader'); - success.call(img); - } - }; - - //}}} - // Global Defaults {{{ - $.Jcrop.defaults = { - - // Basic Settings - allowSelect: true, - allowMove: true, - allowResize: true, - - trackDocument: true, - - // Styling Options - baseClass: 'jcrop', - addClass: null, - bgColor: 'black', - bgOpacity: 0.6, - bgFade: false, - borderOpacity: 0.4, - handleOpacity: 0.5, - handleSize: 7, - handleOffset: 5, - - aspectRatio: 0, - keySupport: true, - cornerHandles: true, - sideHandles: true, - drawBorders: true, - dragEdges: true, - fixedSupport: true, - touchSupport: null, - - shade: null, - - boxWidth: 0, - boxHeight: 0, - boundary: 2, - fadeTime: 400, - animationDelay: 20, - swingSpeed: 3, - - minSelect: [0, 0], - maxSize: [0, 0], - minSize: [0, 0], - - // Callbacks / Event Handlers - onChange: function () {}, - onSelect: function () {}, - onDblClick: function () {}, - onRelease: function () {} - }; - - // }}} -}(jQuery)); diff --git a/apps/contacts/js/jquery.Jcrop.min.js b/apps/contacts/js/jquery.Jcrop.min.js deleted file mode 100644 index 0c05d67c22..0000000000 --- a/apps/contacts/js/jquery.Jcrop.min.js +++ /dev/null @@ -1,255 +0,0 @@ -/** - * jquery.Jcrop.min.js v0.9.9 {{{ (build:20120102) - * jQuery Image Cropping Plugin - released under MIT License - * Copyright (c) 2008-2012 Tapmodo Interactive LLC - * https://github.com/tapmodo/Jcrop - */ - -(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,lastcurs,ie6mode=false;function px(n){return parseInt(n,10)+'px';} -function cssClass(cl){return options.baseClass+'-'+cl;} -function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');} -function getPos(obj) -{var pos=$(obj).offset();return[pos.left,pos.top];} -function mouseAbs(e) -{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];} -function setOptions(opt) -{if(typeof(opt)!=='object')opt={};options=$.extend(options,opt);$.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e){if(typeof(options[e])!=='function')options[e]=function(){};});} -function startDragMode(mode,pos) -{docOffset=getPos($img);Tracker.setCursor(mode==='move'?mode:mode+'-resize');if(mode==='move'){return Tracker.activateHandlers(createMover(pos),doneSelect);} -var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);} -function dragmodeHandler(mode,f) -{return function(pos){if(!options.aspectRatio){switch(mode){case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}}else{switch(mode){case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}} -Coords.setCurrent(pos);Selection.update();};} -function createMover(pos) -{var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};} -function oppLockCorner(ord) -{switch(ord){case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';}} -function createDragger(ord) -{return function(e){if(options.disabled){return false;} -if((ord==='move')&&!options.allowMove){return false;} -docOffset=getPos($img);btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};} -function presize($obj,w,h) -{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();} -if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();} -xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);} -function unscale(c) -{return{x:parseInt(c.x*xscale,10),y:parseInt(c.y*yscale,10),x2:parseInt(c.x2*xscale,10),y2:parseInt(c.y2*yscale,10),w:parseInt(c.w*xscale,10),h:parseInt(c.h*yscale,10)};} -function doneSelect(pos) -{var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');} -function newSelection(e) -{if(options.disabled){return false;} -if(!options.allowSelect){return false;} -btndown=true;docOffset=getPos($img);Selection.disableHandles();Tracker.setCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;} -function selectDrag(pos) -{Coords.setCurrent(pos);Selection.update();} -function newTracker() -{var trk=$('
    ').addClass(cssClass('tracker'));if($.browser.msie){trk.css({opacity:0,backgroundColor:'white'});} -return trk;} -if($.browser.msie&&($.browser.version.split('.')[0]==='6')){ie6mode=true;} -if(typeof(obj)!=='object'){obj=$(obj)[0];} -if(typeof(opt)!=='object'){opt={};} -setOptions(opt);var img_css={border:'none',visibility:'visible',margin:0,padding:0,position:'absolute',top:0,left:0};var $origimg=$(obj),img_mode=true;if(obj.tagName=='IMG'){if($origimg[0].width!=0&&$origimg[0].height!=0){$origimg.width($origimg[0].width);$origimg.height($origimg[0].height);}else{var tempImage=new Image();tempImage.src=$origimg[0].src;$origimg.width(tempImage.width);$origimg.height(tempImage.height);} -var $img=$origimg.clone().removeAttr('id').css(img_css).show();$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();}else{$img=$origimg.css(img_css).show();img_mode=false;if(options.shade===null){options.shade=true;}} -presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('
    ').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass);} -var $img2=$('
    '),$img_holder=$('
    ').width('100%').height('100%').css({zIndex:310,position:'absolute',overflow:'hidden'}),$hdl_holder=$('
    ').width('100%').height('100%').css('zIndex',320),$sel=$('
    ').css({position:'absolute',zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c);}).insertBefore($img).append($img_holder,$hdl_holder);if(img_mode){$img2=$('').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder.append($img2);} -if(ie6mode){$sel.css({overflowY:'hidden'});} -var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgcolor=options.bgColor,bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;ix1+ox){ox-=ox+x1;} -if(0>y1+oy){oy-=oy+y1;} -if(boundyboundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}} -if(xx>x1){if(xx-x1max_x){xx=x1+max_x;} -if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xxmax_x){xx=x1-max_x;} -if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}} -if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;} -if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;} -return makeObj(flipCoords(x1,y1,xx,yy));} -function rebound(p) -{if(p[0]<0){p[0]=0;} -if(p[1]<0){p[1]=0;} -if(p[0]>boundx){p[0]=boundx;} -if(p[1]>boundy){p[1]=boundy;} -return[p[0],p[1]];} -function flipCoords(x1,y1,x2,y2) -{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);} -if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit);} -if(ymin/yscale&&(Math.abs(ysize)0)?(y1+ymin/yscale):(y1-ymin/yscale);} -if(xmin/xscale&&(Math.abs(xsize)0)?(x1+xmin/xscale):(x1-xmin/xscale);} -if(x1<0){x2-=x1;x1-=x1;} -if(y1<0){y2-=y1;y1-=y1;} -if(x2<0){x1-=x2;x2-=x2;} -if(y2<0){y1-=y2;y2-=y2;} -if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;} -if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;} -if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;} -if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;} -return makeObj(flipCoords(x1,y1,x2,y2));} -function makeObj(a) -{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};} -return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Shade=(function(){var enabled=false,holder=$('
    ').css({position:'absolute',zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()};function resizeShades(w,h){shades.left.css({height:px(h)});shades.right.css({height:px(h)});} -function updateAuto() -{return updateShade(Coords.getFixed());} -function updateShade(c) -{shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)});shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)});shades.right.css({left:px(c.x2),width:px(boundx-c.x2)});shades.left.css({width:px(c.x)});} -function createShade(){return $('
    ').css({position:'absolute',backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder);} -function enableShade(){if(!enabled){enabled=true;holder.insertBefore($img);updateAuto();Selection.setBgOpacity(1,0,1);$img2.hide();setBgColor(options.shadeColor||options.bgColor,1);if(Selection.isAwake()) -{setOpacity(options.bgOpacity,1);} -else setOpacity(1,1);}} -function setBgColor(color,now){colorChangeMacro(getShades(),color,now);} -function disableShade(){if(enabled){holder.remove();$img2.show();enabled=false;if(Selection.isAwake()){Selection.setBgOpacity(options.bgOpacity,1,1);}else{Selection.setBgOpacity(1,1,1);Selection.disableHandles();} -colorChangeMacro($div,0,1);}} -function setOpacity(opacity,now){if(enabled){if(options.bgFade&&!now){holder.animate({opacity:1-opacity},{queue:false,duration:options.fadeTime});} -else holder.css({opacity:1-opacity});}} -function refreshAll(){options.shade?enableShade():disableShade();if(Selection.isAwake())setOpacity(options.bgOpacity);} -function getShades(){return holder.children();} -return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity};}());var Selection=(function(){var awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;function insertBorder(type) -{var jq=$('
    ').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;} -function dragDiv(ord,zi) -{var jq=$('
    ').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi}).addClass('ord-'+ord);if(Touch.support){jq.bind('touchstart.jcrop',Touch.createDragger(ord));} -$hdl_holder.append(jq);return jq;} -function insertHandle(ord) -{var hs=options.handleSize;return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).width(hs).height(hs).addClass(cssClass('handle'));} -function insertDragbar(ord) -{var s=options.handleSize,h=s,w=s,t=hhs,l=hhs;switch(ord){case'n':case's':w='100%';break;case'e':case'w':h='100%';break;} -return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});} -function createHandles(li) -{var i;for(i=0;i').css({position:'fixed',left:'-120px',width:'12px'}),$keywrap=$('
    ').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys() -{if(options.keySupport){$keymgr.show();$keymgr.focus();}} -function onBlur(e) -{$keymgr.hide();} -function doNudge(e,x,y) -{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible(true);} -e.preventDefault();e.stopPropagation();} -function parseKey(e) -{if(e.ctrlKey||e.metaKey){return true;} -shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:if(options.allowSelect)Selection.release();break;case 9:return true;} -return false;} -if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}} -return{watchKeys:watchKeys};}());function setClass(cname) -{$div.removeClass().addClass(cssClass('holder')).addClass(cname);} -function animateTo(a,callback) -{var x1=parseInt(a[0],10)/xscale,y1=parseInt(a[1],10)/yscale,x2=parseInt(a[2],10)/xscale,y2=parseInt(a[3],10)/yscale;if(animating){return;} -var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x=animat[0];y=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){window.setTimeout(animator,interv);} -var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent>=99.8){pcent=100;} -if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();} -function setSelect(rect) -{setSelectRaw([parseInt(rect[0],10)/xscale,parseInt(rect[1],10)/yscale,parseInt(rect[2],10)/xscale,parseInt(rect[3],10)/yscale]);options.onSelect.call(api,unscale(Coords.getFixed()));Selection.enableHandles();} -function setSelectRaw(l) -{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();} -function tellSelect() -{return unscale(Coords.getFixed());} -function tellScaled() -{return Coords.getFixed();} -function setOptionsNew(opt) -{setOptions(opt);interfaceUpdate();} -function disableCrop() -{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');} -function enableCrop() -{options.disabled=false;interfaceUpdate();} -function cancelCrop() -{Selection.done();Tracker.activateHandlers(null,null);} -function destroy() -{$div.remove();$origimg.show();$(obj).removeData('Jcrop');} -function setImage(src,callback) -{Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);Shade.resize(boundx,boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;} -function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor;if(options.bgFade&&supportsColorFade()&&options.fadeTime&&!now){$obj.animate({backgroundColor:mycolor},{queue:false,duration:options.fadeTime});}else{$obj.css('backgroundColor',mycolor);}} -function interfaceUpdate(alt) -{if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;} -if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);} -Shade.refresh();if(options.bgColor!=bgcolor){colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?(options.shadeColor||options.bgColor):options.bgColor);bgcolor=options.bgColor;} -if(bgopacity!=options.bgOpacity){bgopacity=options.bgOpacity;if(options.shade)Shade.refresh();else Selection.setBgOpacity(bgopacity);} -xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);} -Selection.refresh();} -if(Touch.support)$trk.bind('touchstart.jcrop',Touch.newSelection);$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},ui:{holder:$div,selection:$sel}};if($.browser.msie){$div.bind('selectstart',function(){return false;});} -$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback) -{var api;this.each(function(){if($(this).data('Jcrop')){if(options==='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);} -else{if(this.tagName=='IMG') -$.Jcrop.Loader(this,function(){$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);});else{$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);}}});return this;};$.Jcrop.Loader=function(imgobj,success,error){var $img=$(imgobj),img=$img[0];function completeCheck(){if(img.complete){$img.unbind('.jcloader');if($.isFunction(success))success.call(img);} -else window.setTimeout(completeCheck,50);} -$img.bind('load.jcloader',completeCheck).bind('error.jcloader',function(e){$img.unbind('.jcloader');if($.isFunction(error))error.call(img);});if(img.complete&&$.isFunction(success)){$img.unbind('.jcloader');success.call(img);}};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true,trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:7,handleOffset:5,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}};}(jQuery)); \ No newline at end of file diff --git a/apps/contacts/js/jquery.combobox.js b/apps/contacts/js/jquery.combobox.js deleted file mode 100644 index d9959eb6cd..0000000000 --- a/apps/contacts/js/jquery.combobox.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Inspired by http://jqueryui.com/demos/autocomplete/#combobox - */ - -(function( $ ) { - $.widget('ui.combobox', { - options: { - id: null, - name: null, - showButton: false, - editable: true - }, - _create: function() { - var self = this, - select = this.element.hide(), - selected = select.children(':selected'), - value = selected.val() ? selected.text() : ''; - var input = this.input = $('') - .insertAfter( select ) - .val( value ) - .autocomplete({ - delay: 0, - minLength: 0, - source: function( request, response ) { - var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" ); - response( select.children('option').map(function() { - var text = $( this ).text(); - if ( this.value && ( !request.term || matcher.test(text) ) ) - return { - label: text.replace( - new RegExp( - '(?![^&;]+;)(?!<[^<>]*)(' + - $.ui.autocomplete.escapeRegex(request.term) + - ')(?![^<>]*>)(?![^&;]+;)', 'gi' - ), '$1'), - value: text, - option: this - }; - }) ); - }, - select: function( event, ui ) { - self.input.val($(ui.item.option).text()); - self.input.trigger('change'); - ui.item.option.selected = true; - self._trigger('selected', event, { - item: ui.item.option - }); - }, - change: function( event, ui ) { - if ( !ui.item ) { - var matcher = new RegExp( '^' + $.ui.autocomplete.escapeRegex( $(this).val() ) + '$', 'i' ), - valid = false; - self.input.val($(this).val()); - //self.input.trigger('change'); - select.children('option').each(function() { - if ( $( this ).text().match( matcher ) ) { - this.selected = valid = true; - return false; - } - }); - if ( !self.options['editable'] && !valid ) { - // remove invalid value, as it didn't match anything - $( this ).val( "" ); - select.val( "" ); - input.data('autocomplete').term = ''; - return false; - } - } - } - }) - .addClass('ui-widget ui-widget-content ui-corner-left'); - - input.data('autocomplete')._renderItem = function( ul, item ) { - return $('
  • ') - .data('item.autocomplete', item ) - .append('' + item.label + '') - .appendTo( ul ); - }; - $.each(this.options, function(key, value) { - self._setOption(key, value); - }); - - input.dblclick(function() { - // pass empty string as value to search for, displaying all results - input.autocomplete('search', ''); - }); - - if(this.options['showButton']) { - this.button = $('') - .attr('tabIndex', -1 ) - .attr('title', 'Show All Items') - .insertAfter( input ) - .addClass('svg') - .addClass('action') - .addClass('combo-button') - .click(function() { - // close if already visible - if ( input.autocomplete('widget').is(':visible') ) { - input.autocomplete('close'); - return; - } - - // work around a bug (likely same cause as #5265) - $( this ).blur(); - - // pass empty string as value to search for, displaying all results - input.autocomplete('search', ''); - input.focus(); - }); - } - }, - destroy: function() { - this.input.remove(); - //this.button.remove(); - this.element.show(); - $.Widget.prototype.destroy.call( this ); - }, - value: function(val) { - if(val != undefined) { - this.input.val(val); - } else { - return this.input.val(); - } - }, - _setOption: function( key, value ) { - switch( key ) { - case 'id': - this.options['id'] = value; - this.input.attr('id', value); - break; - case 'name': - this.options['name'] = value; - this.input.attr('name', value); - break; - case 'attributes': - var input = this.input; - $.each(this.options['attributes'], function(key, value) { - input.attr(key, value); - }); - break; - case 'classes': - var input = this.input; - $.each(this.options['classes'], function(key, value) { - input.addClass(value); - }); - break; - case 'editable': - case 'showButton': - this.options[key] = value; - break; - } - // In jQuery UI 1.8, you have to manually invoke the _setOption method from the base widget - $.Widget.prototype._setOption.apply( this, arguments ); - // In jQuery UI 1.9 and above, you use the _super method instead - //this._super( "_setOption", key, value ); - } - }); -})( jQuery ); diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js deleted file mode 100644 index 9687cd8336..0000000000 --- a/apps/contacts/js/jquery.inview.js +++ /dev/null @@ -1,134 +0,0 @@ -/** - * author Christopher Blum - * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/ - * - forked from http://github.com/zuk/jquery.inview/ - */ -(function ($) { - var inviewObjects = {}, viewportSize, viewportOffset, - d = document, w = window, documentElement = d.documentElement, expando = $.expando, isFiring = false, $elements = {}; - - $.event.special.inview = { - add: function(data) { - var inviewObject = { data: data, $element: $(this) } - inviewObjects[data.guid + "-" + this[expando]] = inviewObject; - var selector = inviewObject.data.selector, - $element = inviewObject.$element; - var hash = parseInt(getHash( data.guid + this[expando])); - $elements[hash] = selector ? $element.find(selector) : $element; - }, - - remove: function(data) { - try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} - try { - var hash = parseInt(getHash(data.guid + this[expando])); - delete($elements[hash]); - } catch (e){} - } - }; - - - function getHash(str){ - str = str+''; - var hash = 0; - if (str.length == 0) return hash; - for (i = 0; i < str.length; i++) { - char = str.charCodeAt(i); - hash = ((hash<<5)-hash)+char; - hash = hash & hash; // Convert to 32bit integer - } - return Math.abs(hash); - } - - function getViewportSize() { - var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; - - // if this is correct then return it. iPad has compat Mode, so will - // go into check clientHeight/clientWidth (which has the wrong value). - if (!size.height) { - mode = d.compatMode; - if (mode || !$.support.boxModel) { // IE, Gecko - domObject = mode === 'CSS1Compat' ? - documentElement : // Standards - d.body; // Quirks - size = { - height: domObject.clientHeight, - width: domObject.clientWidth - }; - } - } - - return size; - } - - function getViewportOffset() { - return { - top: w.pageYOffset || documentElement.scrollTop || (d.body?d.body.scrollTop:0), - left: w.pageXOffset || documentElement.scrollLeft || (d.body?d.body.scrollLeft:0) - }; - } - - function checkInView() { - if (isFiring){ - return; - } - isFiring = true; - viewportSize = viewportSize || getViewportSize(); - viewportOffset = viewportOffset || getViewportOffset(); - - for (var i in $elements) { - if (isNaN(parseInt(i))) { - continue; - } - - var $element = $($elements[i]), - elementSize = { height: $element.height(), width: $element.width() }, - elementOffset = $element.offset(), - inView = $element.data('inview'), - visiblePartX, - visiblePartY, - visiblePartsMerged; - - // Don't ask me why because I haven't figured out yet: - // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5. - // Even though it sounds weird: - // It seems that the execution of this function is interferred by the onresize/onscroll event - // where viewportOffset and viewportSize are unset - if (!viewportOffset || !viewportSize) { - isFiring = false; - return; - } - - if (elementOffset.top + elementSize.height > viewportOffset.top && - elementOffset.top < viewportOffset.top + viewportSize.height && - elementOffset.left + elementSize.width > viewportOffset.left && - elementOffset.left < viewportOffset.left + viewportSize.width) { - visiblePartX = (viewportOffset.left > elementOffset.left ? - 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ? - 'left' : 'both'); - visiblePartY = (viewportOffset.top > elementOffset.top ? - 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ? - 'top' : 'both'); - visiblePartsMerged = visiblePartX + "-" + visiblePartY; - if (!inView || inView !== visiblePartsMerged) { - $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]); - } - } else if (inView) { - $element.data('inview', false).trigger('inview', [false]); - } - } - isFiring = false; - } - - $(w).bind("scroll resize", function() { - viewportSize = viewportOffset = null; - }); - - // Use setInterval in order to also make sure this captures elements within - // "overflow:scroll" elements or elements that appeared in the dom tree due to - // dom manipulation and reflow - // old: $(window).scroll(checkInView); - // - // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays - // intervals while the user scrolls. Therefore the inview event might fire a bit late there - setInterval(checkInView, 250); -})(jQuery); \ No newline at end of file diff --git a/apps/contacts/js/jquery.inview.txt b/apps/contacts/js/jquery.inview.txt deleted file mode 100644 index c53dbd1d97..0000000000 --- a/apps/contacts/js/jquery.inview.txt +++ /dev/null @@ -1,15 +0,0 @@ -jQuery.inview is licensed Attribution-Non-Commercial-Share Alike 2.0 but the -conditions has been waived by the author in the following tweet: - -https://twitter.com/#!/ChristopherBlum/status/148382899887013888 - -Saying: - -Thomas Tanghus @tanghus 18 Dec. 2011 - -@ChristopherBlum Hi. Is it OK if I use https://github.com/protonet/jquery.inview in ownCloud? Preferably under an AGPL license ;-) owncloud.org - - -Christopher Blum Christopher Blum @ChristopherBlum 18 Dec. 2011 - -@tanghus Feel free to! :) diff --git a/apps/contacts/js/jquery.multi-autocomplete.js b/apps/contacts/js/jquery.multi-autocomplete.js deleted file mode 100644 index 5516a74b03..0000000000 --- a/apps/contacts/js/jquery.multi-autocomplete.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Inspired by http://jqueryui.com/demos/autocomplete/#multiple - */ - -(function( $ ) { - $.widget('ui.multiple_autocomplete', { - _create: function() { - var self = this; - function split( val ) { - return val.split( /,\s*/ ); - } - function extractLast( term ) { - return split( term ).pop(); - } - function showOptions() { - if(!self.element.autocomplete('widget').is(':visible') && self.element.val().trim() == '') { - self.element.autocomplete('search', ''); - } - } - //console.log('_create: ' + this.options['id']); - this.element.bind('click', function( event ) { - showOptions(); - }); - this.element.bind('input', function( event ) { - showOptions(); - }); - this.element.bind('blur', function( event ) { - var tmp = self.element.val().trim(); - if(tmp[tmp.length-1] == ',') { - self.element.val(tmp.substring(0, tmp.length-1)); - } else { - self.element.val(tmp); - } - if(self.element.val().trim() != '') { - self.element.trigger('change'); // Changes wasn't saved when only using the dropdown. - } - }); - this.element.bind( "keydown", function( event ) { - if ( event.keyCode === $.ui.keyCode.TAB && - $( this ).data( "autocomplete" ).menu.active ) { - event.preventDefault(); - } - }) - .autocomplete({ - minLength: 0, - source: function( request, response ) { - // delegate back to autocomplete, but extract the last term - response( $.ui.autocomplete.filter( - self.options.source, extractLast( request.term ) ) ); - }, - focus: function() { - // prevent value inserted on focus - return false; - }, - select: function( event, ui ) { - var terms = split( this.value ); - // remove the current input - terms.pop(); - // add the selected item - terms.push( ui.item.value ); - // add placeholder to get the comma-and-space at the end - terms.push( "" ); - this.value = terms.join( ", " ); - return false; - } - }); - /*this.button = $( "" ) - .attr( "tabIndex", -1 ) - .attr( "title", "Show All Items" ) - .insertAfter( this.element ) - .addClass('svg') - .addClass('action') - .addClass('combo-button') - .click(function() { - // close if already visible - if ( self.element.autocomplete( "widget" ).is( ":visible" ) ) { - self.element.autocomplete( "close" ); - return; - } - - // work around a bug (likely same cause as #5265) - $( this ).blur(); - - var tmp = self.element.val().trim(); - if(tmp[tmp.length-1] != ',') { - self.element.val(tmp+', '); - } - // pass empty string as value to search for, displaying all results - self.element.autocomplete( "search", "" ); - self.element.focus(); - });*/ - }, - }); -})( jQuery ); diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js deleted file mode 100644 index 3b1f407048..0000000000 --- a/apps/contacts/js/loader.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -Contacts_Import={ - importdialog: function(filename){ - var path = $('#dir').val(); - $('body').append('
    '); - $('#contacts_import').load(OC.filePath('contacts', 'ajax', 'importdialog.php'), {filename:filename, path:path}, function(){Contacts_Import.initdialog(filename);}); - }, - initdialog: function(filename){ - $('#contacts_import_dialog').dialog({ - width : 500, - close : function() { - $(this).dialog('destroy').remove(); - $('#contacts_import').remove(); - } - }); - $('#import_done_button').click(function(){ - $('#contacts_import_dialog').dialog('destroy').remove(); - $('#contacts_import').remove(); - }); - $('#progressbar').progressbar({value: 0}); - $('#startimport').click(function(){ - var filename = $('#filename').val(); - var path = $('#path').val(); - var method = 'old'; - var addressbookid = $('#contacts option:selected').val(); - if($('#contacts option:selected').val() == 'newaddressbook'){ - var method = 'new'; - var addressbookname = $('#newaddressbook').val(); - var addressbookname = $.trim(addressbookname); - if(addressbookname == ''){ - $('#newaddressbook').css('background-color', '#FF2626'); - $('#newaddressbook').focus(function(){ - $('#newaddressbook').css('background-color', '#F8F8F8'); - }); - return false; - } - } - $('#newaddressbook').attr('readonly', 'readonly'); - $('#contacts').attr('disabled', 'disabled'); - var progresskey = $('#progresskey').val(); - $.post(OC.filePath('contacts', '', 'import.php') + '?progresskey='+progresskey, {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){ - if(jsondata.status == 'success'){ - $('#progressbar').progressbar('option', 'value', 100); - $('#import_done').find('p').html(t('contacts', 'Result: ') + jsondata.data.imported + t('contacts', ' imported, ') + jsondata.data.failed + t('contacts', ' failed.')); - } else { - $('#import_done').find('p').html(jsondata.message); - } - $('#import_done').show().find('p').addClass('bold'); - $('#progressbar').fadeOut('slow'); - }); - $('#form_container').css('display', 'none'); - $('#progressbar_container').css('display', 'block'); - window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500); - }); - $('#contacts').change(function(){ - if($('#contacts option:selected').val() == 'newaddressbook'){ - $('#newaddressbookform').slideDown('slow'); - }else{ - $('#newaddressbookform').slideUp('slow'); - } - }); - }, - getimportstatus: function(progresskey){ - $.get(OC.filePath('contacts', '', 'import.php') + '?progress=1&progresskey=' + progresskey, function(percent){ - $('#progressbar').progressbar('option', 'value', parseInt(percent)); - if(percent < 100){ - window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500); - }else{ - $('#import_done').css('display', 'block'); - } - }); - } -} -$(document).ready(function(){ - if(typeof FileActions !== 'undefined'){ - FileActions.register('text/vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog); - FileActions.setDefault('text/vcard','importaddressbook'); - FileActions.register('text/x-vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog); - FileActions.setDefault('text/x-vcard','importaddressbook'); - }; -}); \ No newline at end of file diff --git a/apps/contacts/js/settings.js b/apps/contacts/js/settings.js deleted file mode 100644 index 69cf473e06..0000000000 --- a/apps/contacts/js/settings.js +++ /dev/null @@ -1,196 +0,0 @@ -OC.Contacts = OC.Contacts || {}; -OC.Contacts.Settings = OC.Contacts.Settings || { - init:function() { - this.Addressbook.adrsettings = $('.addressbooks-settings').first(); - this.Addressbook.adractions = $('#contacts-settings').find('div.actions'); - console.log('actions: ' + this.Addressbook.adractions.length); - OC.Share.loadIcons('addressbook'); - }, - Addressbook:{ - showActions:function(act) { - this.adractions.children().hide(); - this.adractions.children('.'+act.join(',.')).show(); - }, - doActivate:function(id, tgt) { - var active = tgt.is(':checked'); - console.log('doActivate: ', id, active); - $.post(OC.filePath('contacts', 'ajax', 'addressbook/activate.php'), {id: id, active: Number(active)}, function(jsondata) { - if (jsondata.status == 'success'){ - if(!active) { - $('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove(); - } else { - OC.Contacts.Contacts.update(); - } - } else { - console.log('Error:', jsondata.data.message); - OC.Contacts.notify(t('contacts', 'Error') + ': ' + jsondata.data.message); - tgt.checked = !active; - } - }); - }, - doDelete:function(id) { - console.log('doDelete: ', id); - var check = confirm('Do you really want to delete this address book?'); - if(check == false){ - return false; - } else { - $.post(OC.filePath('contacts', 'ajax', 'addressbook/delete.php'), { id: id}, function(jsondata) { - if (jsondata.status == 'success'){ - $('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove(); - $('.addressbooks-settings tr[data-id="'+id+'"]').remove() - OC.Contacts.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - }, - doEdit:function(id) { - console.log('doEdit: ', id); - this.showActions(['active', 'name', 'description', 'save', 'cancel']); - var name = this.adrsettings.find('[data-id="'+id+'"]').find('.name').text(); - var description = this.adrsettings.find('[data-id="'+id+'"]').find('.description').text(); - var active = this.adrsettings.find('[data-id="'+id+'"]').find(':checkbox').is(':checked'); - console.log('name, desc', name, description); - this.adractions.find('.active').prop('checked', active); - this.adractions.find('.name').val(name); - this.adractions.find('.description').val(description); - this.adractions.data('id', id); - }, - doSave:function() { - var name = this.adractions.find('.name').val(); - var description = this.adractions.find('.description').val(); - var active = this.adractions.find('.active').is(':checked'); - var id = this.adractions.data('id'); - console.log('doSave:', id, name, description, active); - - if(name.length == 0) { - OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error')); - return false; - } - var url; - if (id == 'new'){ - url = OC.filePath('contacts', 'ajax', 'addressbook/add.php'); - }else{ - url = OC.filePath('contacts', 'ajax', 'addressbook/update.php'); - } - self = this; - $.post(url, { id: id, name: name, active: Number(active), description: description }, - function(jsondata){ - if(jsondata.status == 'success'){ - self.showActions(['new',]); - self.adractions.removeData('id'); - active = Boolean(Number(jsondata.data.addressbook.active)); - if(id == 'new') { - self.adrsettings.find('table') - .append('' - + '' - + ''+jsondata.data.addressbook.displayname+'' - + ''+jsondata.data.addressbook.description+'' - + '' - + '' - + '' - + '' - + '' - + ''); - } else { - var row = self.adrsettings.find('tr[data-id="'+id+'"]'); - row.find('td.active').find('input:checkbox').prop('checked', active); - row.find('td.name').text(jsondata.data.addressbook.displayname); - row.find('td.description').text(jsondata.data.addressbook.description); - } - OC.Contacts.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - showLink:function(id, row, link) { - console.log('row:', row.length); - row.next('tr.link').remove(); - var linkrow = $('' - + '').insertAfter(row); - linkrow.find('input').focus().select(); - linkrow.find('button').click(function() { - $(this).parents('tr').first().remove(); - }); - }, - showCardDAV:function(id) { - console.log('showCardDAV: ', id); - var row = this.adrsettings.find('tr[data-id="'+id+'"]'); - this.showLink(id, row, totalurl+'/'+encodeURIComponent(oc_current_user)); - }, - showVCF:function(id) { - console.log('showVCF: ', id); - var row = this.adrsettings.find('tr[data-id="'+id+'"]'); - var link = totalurl+'/'+encodeURIComponent(oc_current_user)+'/'+encodeURIComponent(row.data('uri'))+'?export'; - console.log(link); - this.showLink(id, row, link); - } - } -}; - - -$(document).ready(function() { - OC.Contacts.Settings.init(); - - var moreless = $('#contacts-settings').find('.moreless').first(); - moreless.keydown(function(event) { - if(event.which == 13 || event.which == 32) { - moreless.click(); - } - }); - moreless.on('click', function(event) { - event.preventDefault(); - if(OC.Contacts.Settings.Addressbook.adrsettings.is(':visible')) { - OC.Contacts.Settings.Addressbook.adrsettings.slideUp(); - OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').hide(); - moreless.text(t('contacts', 'More...')); - } else { - OC.Contacts.Settings.Addressbook.adrsettings.slideDown(); - OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').show(); - moreless.text(t('contacts', 'Less...')); - } - }); - - OC.Contacts.Settings.Addressbook.adrsettings.keydown(function(event) { - if(event.which == 13 || event.which == 32) { - OC.Contacts.Settings.Addressbook.adrsettings.click(); - } - }); - - - OC.Contacts.Settings.Addressbook.adrsettings.on('click', function(event){ - $('.tipsy').remove(); - var tgt = $(event.target); - if(tgt.is('a') || tgt.is(':checkbox')) { - var id = tgt.parents('tr').first().data('id'); - if(!id) { - return; - } - if(tgt.is(':checkbox')) { - OC.Contacts.Settings.Addressbook.doActivate(id, tgt); - } else if(tgt.is('a')) { - if(tgt.hasClass('edit')) { - OC.Contacts.Settings.Addressbook.doEdit(id); - } else if(tgt.hasClass('delete')) { - OC.Contacts.Settings.Addressbook.doDelete(id); - } else if(tgt.hasClass('globe')) { - OC.Contacts.Settings.Addressbook.showCardDAV(id); - } else if(tgt.hasClass('cloud')) { - OC.Contacts.Settings.Addressbook.showVCF(id); - } - } - } else if(tgt.is('button')) { - event.preventDefault(); - if(tgt.hasClass('save')) { - OC.Contacts.Settings.Addressbook.doSave(); - } else if(tgt.hasClass('cancel')) { - OC.Contacts.Settings.Addressbook.showActions(['new']); - } else if(tgt.hasClass('new')) { - OC.Contacts.Settings.Addressbook.doEdit('new'); - } - } - }); -}); diff --git a/apps/contacts/l10n/.gitkeep b/apps/contacts/l10n/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/contacts/l10n/ar.php b/apps/contacts/l10n/ar.php deleted file mode 100644 index 2b28d6ca6d..0000000000 --- a/apps/contacts/l10n/ar.php +++ /dev/null @@ -1,44 +0,0 @@ - "خطء خلال توقيف كتاب العناوين.", -"Error updating addressbook." => "خطء خلال تعديل كتاب العناوين", -"There was an error adding the contact." => "خطء خلال اضافة معرفه جديده.", -"Cannot add empty property." => "لا يمكنك اضافه صفه خاليه.", -"At least one of the address fields has to be filled out." => "يجب ملء على الاقل خانه واحده من العنوان.", -"Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة.", -"Contacts" => "المعارف", -"This is not your addressbook." => "هذا ليس دفتر عناوينك.", -"Contact could not be found." => "لم يتم العثور على الشخص.", -"Work" => "الوظيفة", -"Home" => "البيت", -"Mobile" => "الهاتف المحمول", -"Text" => "معلومات إضافية", -"Voice" => "صوت", -"Fax" => "الفاكس", -"Video" => "الفيديو", -"Pager" => "الرنان", -"Birthday" => "تاريخ الميلاد", -"Contact" => "معرفه", -"Add Contact" => "أضف شخص ", -"Addressbooks" => "كتب العناوين", -"Organization" => "المؤسسة", -"Delete" => "حذف", -"Preferred" => "مفضل", -"Phone" => "الهاتف", -"Email" => "البريد الالكتروني", -"Address" => "عنوان", -"Download contact" => "انزال المعرفه", -"Delete contact" => "امحي المعرفه", -"Type" => "نوع", -"PO Box" => "العنوان البريدي", -"Extended" => "إضافة", -"City" => "المدينة", -"Region" => "المنطقة", -"Zipcode" => "رقم المنطقة", -"Country" => "البلد", -"Addressbook" => "كتاب العناوين", -"Download" => "انزال", -"Edit" => "تعديل", -"New Address Book" => "كتاب عناوين جديد", -"Save" => "حفظ", -"Cancel" => "الغاء" -); diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php deleted file mode 100644 index 5a8b0e018c..0000000000 --- a/apps/contacts/l10n/ca.php +++ /dev/null @@ -1,229 +0,0 @@ - "Error en (des)activar la llibreta d'adreces.", -"id is not set." => "no s'ha establert la id.", -"Cannot update addressbook with an empty name." => "No es pot actualitzar la llibreta d'adreces amb un nom buit", -"Error updating addressbook." => "Error en actualitzar la llibreta d'adreces.", -"No ID provided" => "No heu facilitat cap ID", -"Error setting checksum." => "Error en establir la suma de verificació.", -"No categories selected for deletion." => "No heu seleccionat les categories a eliminar.", -"No address books found." => "No s'han trobat llibretes d'adreces.", -"No contacts found." => "No s'han trobat contactes.", -"There was an error adding the contact." => "S'ha produït un error en afegir el contacte.", -"element name is not set." => "no s'ha establert el nom de l'element.", -"Could not parse contact: " => "No s'ha pogut processar el contacte:", -"Cannot add empty property." => "No es pot afegir una propietat buida.", -"At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.", -"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:", -"Missing IM parameter." => "Falta el paràmetre IM.", -"Unknown IM: " => "IM desconegut:", -"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.", -"Missing ID" => "Falta la ID", -"Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"", -"checksum is not set." => "no s'ha establert la suma de verificació.", -"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:", -"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.", -"No contact ID was submitted." => "No s'ha tramès cap ID de contacte.", -"Error reading contact photo." => "Error en llegir la foto del contacte.", -"Error saving temporary file." => "Error en desar el fitxer temporal.", -"The loading photo is not valid." => "La foto carregada no és vàlida.", -"Contact ID is missing." => "falta la ID del contacte.", -"No photo path was submitted." => "No heu tramès el camí de la foto.", -"File doesn't exist:" => "El fitxer no existeix:", -"Error loading image." => "Error en carregar la imatge.", -"Error getting contact object." => "Error en obtenir l'objecte contacte.", -"Error getting PHOTO property." => "Error en obtenir la propietat PHOTO.", -"Error saving contact." => "Error en desar el contacte.", -"Error resizing image" => "Error en modificar la mida de la imatge", -"Error cropping image" => "Error en retallar la imatge", -"Error creating temporary image" => "Error en crear la imatge temporal", -"Error finding image: " => "Error en trobar la imatge:", -"Error uploading contacts to storage." => "Error en carregar contactes a l'emmagatzemament.", -"There is no error, the file uploaded with success" => "No hi ha errors, el fitxer s'ha carregat correctament", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer carregat supera la directiva upload_max_filesize de php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", -"The uploaded file was only partially uploaded" => "El fitxer només s'ha carregat parcialment", -"No file was uploaded" => "No s'ha carregat cap fitxer", -"Missing a temporary folder" => "Falta un fitxer temporal", -"Couldn't save temporary image: " => "No s'ha pogut desar la imatge temporal: ", -"Couldn't load temporary image: " => "No s'ha pogut carregar la imatge temporal: ", -"No file was uploaded. Unknown error" => "No s'ha carregat cap fitxer. Error desconegut", -"Contacts" => "Contactes", -"Sorry, this functionality has not been implemented yet" => "Aquesta funcionalitat encara no està implementada", -"Not implemented" => "No implementada", -"Couldn't get a valid address." => "No s'ha pogut obtenir una adreça vàlida.", -"Error" => "Error", -"You do not have permission to add contacts to " => "No teniu permisos per afegir contactes a ", -"Please select one of your own address books." => "Seleccioneu una de les vostres llibretes d'adreces", -"Permission error" => "Error de permisos", -"This property has to be non-empty." => "Aquesta propietat no pot ser buida.", -"Couldn't serialize elements." => "No s'han pogut serialitzar els elements.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org", -"Edit name" => "Edita el nom", -"No files selected for upload." => "No s'han seleccionat fitxers per a la pujada.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor.", -"Error loading profile picture." => "Error en carregar la imatge de perfil.", -"Select type" => "Seleccioneu un tipus", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Heu marcat eliminar alguns contactes, però encara no s'han eliminat. Espereu mentre s'esborren.", -"Do you want to merge these address books?" => "Voleu fusionar aquestes llibretes d'adreces?", -"Result: " => "Resultat: ", -" imported, " => " importat, ", -" failed." => " fallada.", -"Displayname cannot be empty." => "El nom a mostrar no pot ser buit", -"Addressbook not found: " => "No s'ha trobat la llibreta d'adreces: ", -"This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces", -"Contact could not be found." => "No s'ha trobat el contacte.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Feina", -"Home" => "Casa", -"Other" => "Altres", -"Mobile" => "Mòbil", -"Text" => "Text", -"Voice" => "Veu", -"Message" => "Missatge", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Paginador", -"Internet" => "Internet", -"Birthday" => "Aniversari", -"Business" => "Negocis", -"Call" => "Trucada", -"Clients" => "Clients", -"Deliverer" => "Emissari", -"Holidays" => "Vacances", -"Ideas" => "Idees", -"Journey" => "Viatge", -"Jubilee" => "Aniversari", -"Meeting" => "Reunió", -"Personal" => "Personal", -"Projects" => "Projectes", -"Questions" => "Preguntes", -"{name}'s Birthday" => "Aniversari de {name}", -"Contact" => "Contacte", -"You do not have the permissions to edit this contact." => "No teniu permisos per editar aquest contacte", -"You do not have the permissions to delete this contact." => "No teniu permisos per esborrar aquest contacte", -"Add Contact" => "Afegeix un contacte", -"Import" => "Importa", -"Settings" => "Configuració", -"Addressbooks" => "Llibretes d'adreces", -"Close" => "Tanca", -"Keyboard shortcuts" => "Dreceres de teclat", -"Navigation" => "Navegació", -"Next contact in list" => "Següent contacte de la llista", -"Previous contact in list" => "Contacte anterior de la llista", -"Expand/collapse current addressbook" => "Expandeix/col·lapsa la llibreta d'adreces", -"Next addressbook" => "Llibreta d'adreces següent", -"Previous addressbook" => "Llibreta d'adreces anterior", -"Actions" => "Accions", -"Refresh contacts list" => "Carrega de nou la llista de contactes", -"Add new contact" => "Afegeix un contacte nou", -"Add new addressbook" => "Afegeix una llibreta d'adreces nova", -"Delete current contact" => "Esborra el contacte", -"Drop photo to upload" => "Elimina la foto a carregar", -"Delete current photo" => "Elimina la foto actual", -"Edit current photo" => "Edita la foto actual", -"Upload new photo" => "Carrega una foto nova", -"Select photo from ownCloud" => "Selecciona una foto de ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma", -"Edit name details" => "Edita detalls del nom", -"Organization" => "Organització", -"Delete" => "Suprimeix", -"Nickname" => "Sobrenom", -"Enter nickname" => "Escriviu el sobrenom", -"Web site" => "Adreça web", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Vés a la web", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grups", -"Separate groups with commas" => "Separeu els grups amb comes", -"Edit groups" => "Edita els grups", -"Preferred" => "Preferit", -"Please specify a valid email address." => "Especifiqueu una adreça de correu electrònic correcta", -"Enter email address" => "Escriviu una adreça de correu electrònic", -"Mail to address" => "Envia per correu electrònic a l'adreça", -"Delete email address" => "Elimina l'adreça de correu electrònic", -"Enter phone number" => "Escriviu el número de telèfon", -"Delete phone number" => "Elimina el número de telèfon", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Elimina IM", -"View on map" => "Visualitza al mapa", -"Edit address details" => "Edita els detalls de l'adreça", -"Add notes here." => "Afegiu notes aquí.", -"Add field" => "Afegeix un camp", -"Phone" => "Telèfon", -"Email" => "Correu electrònic", -"Instant Messaging" => "Missatgeria instantània", -"Address" => "Adreça", -"Note" => "Nota", -"Download contact" => "Baixa el contacte", -"Delete contact" => "Suprimeix el contacte", -"The temporary image has been removed from cache." => "La imatge temporal ha estat eliminada de la memòria de cau.", -"Edit address" => "Edita l'adreça", -"Type" => "Tipus", -"PO Box" => "Adreça postal", -"Street address" => "Adreça", -"Street and number" => "Carrer i número", -"Extended" => "Addicional", -"Apartment number etc." => "Número d'apartament, etc.", -"City" => "Ciutat", -"Region" => "Comarca", -"E.g. state or province" => "p. ex. Estat o província ", -"Zipcode" => "Codi postal", -"Postal code" => "Codi postal", -"Country" => "País", -"Addressbook" => "Llibreta d'adreces", -"Hon. prefixes" => "Prefix honorífic:", -"Miss" => "Srta", -"Ms" => "Sra", -"Mr" => "Sr", -"Sir" => "Senyor", -"Mrs" => "Sra", -"Dr" => "Dr", -"Given name" => "Nom específic", -"Additional names" => "Noms addicionals", -"Family name" => "Nom de familia", -"Hon. suffixes" => "Sufix honorífic:", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importa un fitxer de contactes", -"Please choose the addressbook" => "Escolliu la llibreta d'adreces", -"create a new addressbook" => "crea una llibreta d'adreces nova", -"Name of new addressbook" => "Nom de la nova llibreta d'adreces", -"Importing contacts" => "S'estan important contactes", -"You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.", -"Add contact" => "Afegeix un contacte", -"Select Address Books" => "Selecccioneu llibretes d'adreces", -"Enter name" => "Escriviu un nom", -"Enter description" => "Escriviu una descripció", -"CardDAV syncing addresses" => "Adreces de sincronització CardDAV", -"more info" => "més informació", -"Primary address (Kontact et al)" => "Adreça primària (Kontact i al)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Mostra l'enllaç CardDav", -"Show read-only VCF link" => "Mostra l'enllaç VCF només de lectura", -"Share" => "Comparteix", -"Download" => "Baixa", -"Edit" => "Edita", -"New Address Book" => "Nova llibreta d'adreces", -"Name" => "Nom", -"Description" => "Descripció", -"Save" => "Desa", -"Cancel" => "Cancel·la", -"More..." => "Més..." -); diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php deleted file mode 100644 index cae9ae0c40..0000000000 --- a/apps/contacts/l10n/cs_CZ.php +++ /dev/null @@ -1,229 +0,0 @@ - "Chyba při (de)aktivaci adresáře.", -"id is not set." => "id neni nastaveno.", -"Cannot update addressbook with an empty name." => "Nelze aktualizovat adresář s prázdným jménem.", -"Error updating addressbook." => "Chyba při aktualizaci adresáře.", -"No ID provided" => "ID nezadáno", -"Error setting checksum." => "Chyba při nastavování kontrolního součtu.", -"No categories selected for deletion." => "Žádné kategorie nebyly vybrány k smazání.", -"No address books found." => "Žádný adresář nenalezen.", -"No contacts found." => "Žádné kontakty nenalezeny.", -"There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.", -"element name is not set." => "jméno elementu není nastaveno.", -"Could not parse contact: " => "Nelze analyzovat kontakty", -"Cannot add empty property." => "Nelze přidat prazdný údaj.", -"At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů", -"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ", -"Missing IM parameter." => "Chybějící parametr IM", -"Unknown IM: " => "Neznámý IM:", -"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Missing ID" => "Chybí ID", -"Error parsing VCard for ID: \"" => "Chyba při parsování VCard pro ID: \"", -"checksum is not set." => "kontrolní součet není nastaven.", -"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Něco se pokazilo. ", -"No contact ID was submitted." => "Nebylo nastaveno ID kontaktu.", -"Error reading contact photo." => "Chyba při načítání fotky kontaktu.", -"Error saving temporary file." => "Chyba při ukládání dočasného souboru.", -"The loading photo is not valid." => "Načítaná fotka je vadná.", -"Contact ID is missing." => "Chybí ID kontaktu.", -"No photo path was submitted." => "Žádná fotka nebyla nahrána.", -"File doesn't exist:" => "Soubor neexistuje:", -"Error loading image." => "Chyba při načítání obrázku.", -"Error getting contact object." => "Chyba při převzetí objektu kontakt.", -"Error getting PHOTO property." => "Chyba při získávání fotky.", -"Error saving contact." => "Chyba při ukládání kontaktu.", -"Error resizing image" => "Chyba při změně velikosti obrázku.", -"Error cropping image" => "Chyba při osekávání obrázku.", -"Error creating temporary image" => "Chyba při vytváření dočasného obrázku.", -"Error finding image: " => "Chyba při hledání obrázku:", -"Error uploading contacts to storage." => "Chyba při nahrávání kontaktů do úložiště.", -"There is no error, the file uploaded with success" => "Nevyskytla se žádná chyba, soubor byl úspěšně nahrán", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahrávaný soubor překračuje nastavení upload_max_filesize directive v php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný soubor překračuje nastavení MAX_FILE_SIZE z voleb HTML formuláře", -"The uploaded file was only partially uploaded" => "Nahrávaný soubor se nahrál pouze z části", -"No file was uploaded" => "Žádný soubor nebyl nahrán", -"Missing a temporary folder" => "Chybí dočasný adresář", -"Couldn't save temporary image: " => "Nemohu uložit dočasný obrázek: ", -"Couldn't load temporary image: " => "Nemohu načíst dočasný obrázek: ", -"No file was uploaded. Unknown error" => "Soubor nebyl odeslán. Neznámá chyba", -"Contacts" => "Kontakty", -"Sorry, this functionality has not been implemented yet" => "Bohužel, tato funkce nebyla ještě implementována.", -"Not implemented" => "Neimplementováno", -"Couldn't get a valid address." => "Nelze získat platnou adresu.", -"Error" => "Chyba", -"You do not have permission to add contacts to " => "Nemáte práva přidat kontakt do", -"Please select one of your own address books." => "Prosím vyberte jeden z vašich adresářů", -"Permission error" => "Chyba přístupových práv", -"This property has to be non-empty." => "Tento parametr nemuže zůstat nevyplněn.", -"Couldn't serialize elements." => "Prvky nelze převést..", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' voláno bez argumentu. Prosím oznamte chybu na bugs.owncloud.org", -"Edit name" => "Upravit jméno", -"No files selected for upload." => "Žádné soubory nebyly vybrány k nahrání.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost.", -"Error loading profile picture." => "Chyba při otevírání obrázku profilu", -"Select type" => "Vybrat typ", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Některé kontakty jsou označeny ke smazání. Počkete prosím na dokončení operace.", -"Do you want to merge these address books?" => "Chcete spojit tyto adresáře?", -"Result: " => "Výsledek: ", -" imported, " => "importováno v pořádku,", -" failed." => "neimportováno.", -"Displayname cannot be empty." => "Zobrazované jméno nemůže zůstat prázdné.", -"Addressbook not found: " => "Adresář nenalezen:", -"This is not your addressbook." => "Toto není Váš adresář.", -"Contact could not be found." => "Kontakt nebyl nalezen.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Pracovní", -"Home" => "Domácí", -"Other" => "Ostatní", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Hlas", -"Message" => "Zpráva", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Narozeniny", -"Business" => "Pracovní", -"Call" => "Volat", -"Clients" => "Klienti", -"Deliverer" => "Dodavatel", -"Holidays" => "Prázdniny", -"Ideas" => "Nápady", -"Journey" => "Cestování", -"Jubilee" => "Jubileum", -"Meeting" => "Schůzka", -"Personal" => "Osobní", -"Projects" => "Projekty", -"Questions" => "Dotazy", -"{name}'s Birthday" => "Narozeniny {name}", -"Contact" => "Kontakt", -"You do not have the permissions to edit this contact." => "Nemáte práva editovat tento kontakt", -"You do not have the permissions to delete this contact." => "Nemáte práva smazat tento kontakt", -"Add Contact" => "Přidat kontakt", -"Import" => "Import", -"Settings" => "Nastavení", -"Addressbooks" => "Adresáře", -"Close" => "Zavřít", -"Keyboard shortcuts" => "Klávesoví zkratky", -"Navigation" => "Navigace", -"Next contact in list" => "Následující kontakt v seznamu", -"Previous contact in list" => "Předchozí kontakt v seznamu", -"Expand/collapse current addressbook" => "Rozbalit/sbalit aktuální Adresář", -"Next addressbook" => "Následující Adresář", -"Previous addressbook" => "Předchozí Adresář", -"Actions" => "Akce", -"Refresh contacts list" => "Občerstvit seznam kontaktů", -"Add new contact" => "Přidat kontakt", -"Add new addressbook" => "Předat nový Adresář", -"Delete current contact" => "Odstranit aktuální kontakt", -"Drop photo to upload" => "Přetáhněte sem fotku pro její nahrání", -"Delete current photo" => "Smazat současnou fotku", -"Edit current photo" => "Upravit současnou fotku", -"Upload new photo" => "Nahrát novou fotku", -"Select photo from ownCloud" => "Vybrat fotku z ownCloudu", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami", -"Edit name details" => "Upravit podrobnosti jména", -"Organization" => "Organizace", -"Delete" => "Odstranit", -"Nickname" => "Přezdívka", -"Enter nickname" => "Zadejte přezdívku", -"Web site" => "Web", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Přejít na web", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupiny", -"Separate groups with commas" => "Oddělte skupiny čárkami", -"Edit groups" => "Upravit skupiny", -"Preferred" => "Preferovaný", -"Please specify a valid email address." => "Prosím zadejte platnou e-mailovou adresu", -"Enter email address" => "Zadat e-mailovou adresu", -"Mail to address" => "Odeslat na adresu", -"Delete email address" => "Smazat e-mail", -"Enter phone number" => "Zadat telefoní číslo", -"Delete phone number" => "Smazat telefoní číslo", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Smazat IM", -"View on map" => "Zobrazit na mapě", -"Edit address details" => "Upravit podrobnosti adresy", -"Add notes here." => "Zde můžete připsat poznámky.", -"Add field" => "Přidat políčko", -"Phone" => "Telefon", -"Email" => "Email", -"Instant Messaging" => "Instant Messaging", -"Address" => "Adresa", -"Note" => "Poznámka", -"Download contact" => "Stáhnout kontakt", -"Delete contact" => "Odstranit kontakt", -"The temporary image has been removed from cache." => "Obrázek byl odstraněn z dočasné paměti.", -"Edit address" => "Upravit adresu", -"Type" => "Typ", -"PO Box" => "PO box", -"Street address" => "Ulice", -"Street and number" => "Ulice a číslo", -"Extended" => "Rozšířené", -"Apartment number etc." => "Byt číslo atd.", -"City" => "Město", -"Region" => "Kraj", -"E.g. state or province" => "Např. stát nebo okres", -"Zipcode" => "PSČ", -"Postal code" => "PSČ", -"Country" => "Země", -"Addressbook" => "Adresář", -"Hon. prefixes" => "Tituly před", -"Miss" => "Slečna", -"Ms" => "Ms", -"Mr" => "Pan", -"Sir" => "Sir", -"Mrs" => "Paní", -"Dr" => "Dr", -"Given name" => "Křestní jméno", -"Additional names" => "Další jména", -"Family name" => "Příjmení", -"Hon. suffixes" => "Tituly za", -"J.D." => "JUDr.", -"M.D." => "MUDr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "ml.", -"Sn." => "st.", -"Import a contacts file" => "Importovat soubor kontaktů", -"Please choose the addressbook" => "Prosím zvolte adresář", -"create a new addressbook" => "vytvořit nový adresář", -"Name of new addressbook" => "Jméno nového adresáře", -"Importing contacts" => "Importování kontaktů", -"You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.", -"Add contact" => "Přidat kontakt", -"Select Address Books" => "Vybrat Adresář", -"Enter name" => "Vložte jméno", -"Enter description" => "Vložte popis", -"CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:", -"more info" => "víc informací", -"Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Zobrazit odklaz CardDAV:", -"Show read-only VCF link" => "Zobrazit odkaz VCF pouze pro čtení", -"Share" => "Sdílet", -"Download" => "Stažení", -"Edit" => "Editovat", -"New Address Book" => "Nový adresář", -"Name" => "Název", -"Description" => "Popis", -"Save" => "Uložit", -"Cancel" => "Storno", -"More..." => "Více..." -); diff --git a/apps/contacts/l10n/da.php b/apps/contacts/l10n/da.php deleted file mode 100644 index 97c5f1307c..0000000000 --- a/apps/contacts/l10n/da.php +++ /dev/null @@ -1,158 +0,0 @@ - "Fejl ved (de)aktivering af adressebogen", -"id is not set." => "Intet ID medsendt.", -"Cannot update addressbook with an empty name." => "Kan ikke opdatére adressebogen med et tomt navn.", -"Error updating addressbook." => "Fejl ved opdatering af adressebog", -"No ID provided" => "Intet ID medsendt", -"Error setting checksum." => "Kunne ikke sætte checksum.", -"No categories selected for deletion." => "Der ikke valgt nogle grupper at slette.", -"No address books found." => "Der blev ikke fundet nogen adressebøger.", -"No contacts found." => "Der blev ikke fundet nogen kontaktpersoner.", -"There was an error adding the contact." => "Der opstod en fejl ved tilføjelse af kontaktpersonen.", -"element name is not set." => "Elementnavnet er ikke medsendt.", -"Cannot add empty property." => "Kan ikke tilføje en egenskab uden indhold.", -"At least one of the address fields has to be filled out." => "Der skal udfyldes mindst et adressefelt.", -"Trying to add duplicate property: " => "Kan ikke tilføje overlappende element.", -"Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.", -"Missing ID" => "Manglende ID", -"Error parsing VCard for ID: \"" => "Kunne ikke indlæse VCard med ID'et: \"", -"checksum is not set." => "Checksum er ikke medsendt.", -"Information about vCard is incorrect. Please reload the page: " => "Informationen om dette VCard stemmer ikke. Genindlæs venligst siden: ", -"Something went FUBAR. " => "Noget gik grueligt galt. ", -"No contact ID was submitted." => "Ingen ID for kontakperson medsendt.", -"Error reading contact photo." => "Kunne ikke indlæse foto for kontakperson.", -"Error saving temporary file." => "Kunne ikke gemme midlertidig fil.", -"The loading photo is not valid." => "Billedet under indlæsning er ikke gyldigt.", -"Contact ID is missing." => "Kontaktperson ID mangler.", -"No photo path was submitted." => "Der blev ikke medsendt en sti til fotoet.", -"File doesn't exist:" => "Filen eksisterer ikke:", -"Error loading image." => "Kunne ikke indlæse billede.", -"Error getting contact object." => "Fejl ved indlæsning af kontaktpersonobjektet.", -"Error getting PHOTO property." => "Fejl ved indlæsning af PHOTO feltet.", -"Error saving contact." => "Kunne ikke gemme kontaktpersonen.", -"Error resizing image" => "Kunne ikke ændre billedets størrelse", -"Error cropping image" => "Kunne ikke beskære billedet", -"Error creating temporary image" => "Kunne ikke oprette midlertidigt billede", -"Error finding image: " => "Kunne ikke finde billedet: ", -"Error uploading contacts to storage." => "Kunne ikke uploade kontaktepersoner til midlertidig opbevaring.", -"There is no error, the file uploaded with success" => "Der skete ingen fejl, filen blev succesfuldt uploadet", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uploadede fil er større end upload_max_filesize indstillingen i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uploadede fil overstiger MAX_FILE_SIZE indstilingen, som specificeret i HTML formularen", -"The uploaded file was only partially uploaded" => "Filen blev kun delvist uploadet.", -"No file was uploaded" => "Ingen fil uploadet", -"Missing a temporary folder" => "Manglende midlertidig mappe.", -"Couldn't save temporary image: " => "Kunne ikke gemme midlertidigt billede: ", -"Couldn't load temporary image: " => "Kunne ikke indlæse midlertidigt billede", -"No file was uploaded. Unknown error" => "Ingen fil blev uploadet. Ukendt fejl.", -"Contacts" => "Kontaktpersoner", -"Sorry, this functionality has not been implemented yet" => "Denne funktion er desværre ikke implementeret endnu", -"Not implemented" => "Ikke implementeret", -"Couldn't get a valid address." => "Kunne ikke finde en gyldig adresse.", -"Error" => "Fejl", -"This property has to be non-empty." => "Dette felt må ikke være tomt.", -"Couldn't serialize elements." => "Kunne ikke serialisere elementerne.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' kaldet uden typeargument. Indrapporter fejl på bugs.owncloud.org", -"Edit name" => "Rediger navn", -"No files selected for upload." => "Der er ikke valgt nogen filer at uploade.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Dr.", -"Select type" => "Vælg type", -"Result: " => "Resultat:", -" imported, " => " importeret ", -" failed." => " fejl.", -"This is not your addressbook." => "Dette er ikke din adressebog.", -"Contact could not be found." => "Kontaktperson kunne ikke findes.", -"Work" => "Arbejde", -"Home" => "Hjemme", -"Mobile" => "Mobil", -"Text" => "SMS", -"Voice" => "Telefonsvarer", -"Message" => "Besked", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Personsøger", -"Internet" => "Internet", -"Birthday" => "Fødselsdag", -"{name}'s Birthday" => "{name}s fødselsdag", -"Contact" => "Kontaktperson", -"Add Contact" => "Tilføj kontaktperson", -"Import" => "Importer", -"Addressbooks" => "Adressebøger", -"Close" => "Luk", -"Drop photo to upload" => "Drop foto for at uploade", -"Delete current photo" => "Slet nuværende foto", -"Edit current photo" => "Rediger nuværende foto", -"Upload new photo" => "Upload nyt foto", -"Select photo from ownCloud" => "Vælg foto fra ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn først med komma", -"Edit name details" => "Rediger navnedetaljer.", -"Organization" => "Organisation", -"Delete" => "Slet", -"Nickname" => "Kaldenavn", -"Enter nickname" => "Indtast kaldenavn", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Opdel gruppenavne med kommaer", -"Edit groups" => "Rediger grupper", -"Preferred" => "Foretrukken", -"Please specify a valid email address." => "Indtast venligst en gyldig email-adresse.", -"Enter email address" => "Indtast email-adresse", -"Mail to address" => "Send mail til adresse", -"Delete email address" => "Slet email-adresse", -"Enter phone number" => "Indtast telefonnummer", -"Delete phone number" => "Slet telefonnummer", -"View on map" => "Vis på kort", -"Edit address details" => "Rediger adresse detaljer", -"Add notes here." => "Tilføj noter her.", -"Add field" => "Tilføj element", -"Phone" => "Telefon", -"Email" => "Email", -"Address" => "Adresse", -"Note" => "Note", -"Download contact" => "Download kontaktperson", -"Delete contact" => "Slet kontaktperson", -"The temporary image has been removed from cache." => "Det midlertidige billede er ikke længere tilgængeligt.", -"Edit address" => "Rediger adresse", -"Type" => "Type", -"PO Box" => "Postboks", -"Extended" => "Udvidet", -"City" => "By", -"Region" => "Region", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Addressbook" => "Adressebog", -"Hon. prefixes" => "Foranstillede titler", -"Miss" => "Frøken", -"Ms" => "Fru", -"Mr" => "Hr.", -"Sir" => "Sir", -"Mrs" => "Fru", -"Dr" => "Dr.", -"Given name" => "Fornavn", -"Additional names" => "Mellemnavne", -"Family name" => "Efternavn", -"Hon. suffixes" => "Efterstillede titler", -"J.D." => "Cand. Jur.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importer fil med kontaktpersoner", -"Please choose the addressbook" => "Vælg venligst adressebog", -"create a new addressbook" => "Opret ny adressebog", -"Name of new addressbook" => "Navn på ny adressebog", -"Importing contacts" => "Importerer kontaktpersoner", -"You have no contacts in your addressbook." => "Du har ingen kontaktpersoner i din adressebog.", -"Add contact" => "Tilføj kontaktpeson.", -"CardDAV syncing addresses" => "CardDAV synkroniserings adresse", -"more info" => "mere info", -"Primary address (Kontact et al)" => "Primær adresse (Kontak m. fl.)", -"iOS/OS X" => "iOS/OS X", -"Download" => "Download", -"Edit" => "Rediger", -"New Address Book" => "Ny adressebog", -"Save" => "Gem", -"Cancel" => "Fortryd" -); diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php deleted file mode 100644 index c2e8884fc2..0000000000 --- a/apps/contacts/l10n/de.php +++ /dev/null @@ -1,229 +0,0 @@ - "(De-)Aktivierung des Adressbuches fehlgeschlagen", -"id is not set." => "ID ist nicht angegeben.", -"Cannot update addressbook with an empty name." => "Adressbuch kann nicht mir leeren Namen aktualisiert werden.", -"Error updating addressbook." => "Adressbuch aktualisieren fehlgeschlagen.", -"No ID provided" => "Keine ID angegeben", -"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.", -"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.", -"No address books found." => "Keine Adressbücher gefunden.", -"No contacts found." => "Keine Kontakte gefunden.", -"There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen.", -"element name is not set." => "Kein Name für das Element angegeben.", -"Could not parse contact: " => "Konnte folgenden Kontakt nicht verarbeiten:", -"Cannot add empty property." => "Feld darf nicht leer sein.", -"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.", -"Trying to add duplicate property: " => "Versuche doppelte Eigenschaft hinzuzufügen: ", -"Missing IM parameter." => "IM-Parameter fehlt.", -"Unknown IM: " => "IM unbekannt:", -"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisieren Sie die Seite.", -"Missing ID" => "Fehlende ID", -"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"", -"checksum is not set." => "Keine Prüfsumme angegeben.", -"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ", -"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ", -"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.", -"Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.", -"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.", -"The loading photo is not valid." => "Das Kontaktfoto ist fehlerhaft.", -"Contact ID is missing." => "Keine Kontakt-ID angegeben.", -"No photo path was submitted." => "Kein Foto-Pfad übermittelt.", -"File doesn't exist:" => "Datei existiert nicht: ", -"Error loading image." => "Fehler beim Laden des Bildes.", -"Error getting contact object." => "Fehler beim Abruf des Kontakt-Objektes.", -"Error getting PHOTO property." => "Fehler beim Abrufen der PHOTO-Eigenschaft.", -"Error saving contact." => "Fehler beim Speichern des Kontaktes.", -"Error resizing image" => "Fehler bei der Größenänderung des Bildes", -"Error cropping image" => "Fehler beim Zuschneiden des Bildes", -"Error creating temporary image" => "Fehler beim Erstellen des temporären Bildes", -"Error finding image: " => "Fehler beim Suchen des Bildes: ", -"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen.", -"There is no error, the file uploaded with success" => "Alles bestens, Datei erfolgreich übertragen.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer, als durch die upload_max_filesize Direktive in php.ini erlaubt", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer, als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist", -"The uploaded file was only partially uploaded" => "Datei konnte nur teilweise übertragen werden", -"No file was uploaded" => "Keine Datei konnte übertragen werden.", -"Missing a temporary folder" => "Kein temporärer Ordner vorhanden", -"Couldn't save temporary image: " => "Konnte das temporäre Bild nicht speichern:", -"Couldn't load temporary image: " => "Konnte das temporäre Bild nicht laden:", -"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler", -"Contacts" => "Kontakte", -"Sorry, this functionality has not been implemented yet" => "Diese Funktion steht leider noch nicht zur Verfügung", -"Not implemented" => "Nicht verfügbar", -"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen.", -"Error" => "Fehler", -"You do not have permission to add contacts to " => "Sie besitzen nicht die erforderlichen Rechte, um Kontakte hinzuzufügen", -"Please select one of your own address books." => "Bitte wählen Sie eines Ihrer Adressbücher aus.", -"Permission error" => "Berechtigungsfehler", -"This property has to be non-empty." => "Dieses Feld darf nicht leer sein.", -"Couldn't serialize elements." => "Konnte Elemente nicht serialisieren", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melden Sie dies auf bugs.owncloud.org", -"Edit name" => "Name ändern", -"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.", -"Error loading profile picture." => "Fehler beim Laden des Profilbildes.", -"Select type" => "Wähle Typ", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen markiert Kontakte wurden noch nicht gelöscht. Bitte warten.", -"Do you want to merge these address books?" => "Möchten Sie diese Adressbücher zusammenführen?", -"Result: " => "Ergebnis: ", -" imported, " => " importiert, ", -" failed." => " fehlgeschlagen.", -"Displayname cannot be empty." => "Der Anzeigename darf nicht leer sein.", -"Addressbook not found: " => "Adressbuch nicht gefunden:", -"This is not your addressbook." => "Dies ist nicht Ihr Adressbuch.", -"Contact could not be found." => "Kontakt konnte nicht gefunden werden.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Arbeit", -"Home" => "Zuhause", -"Other" => "Andere", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Anruf", -"Message" => "Mitteilung", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Geburtstag", -"Business" => "Geschäftlich", -"Call" => "Anruf", -"Clients" => "Kunden", -"Deliverer" => "Lieferant", -"Holidays" => "Feiertage", -"Ideas" => "Ideen", -"Journey" => "Reise", -"Jubilee" => "Jubiläum", -"Meeting" => "Besprechung", -"Personal" => "Persönlich", -"Projects" => "Projekte", -"Questions" => "Fragen", -"{name}'s Birthday" => "Geburtstag von {name}", -"Contact" => "Kontakt", -"You do not have the permissions to edit this contact." => "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakt zu bearbeiten.", -"You do not have the permissions to delete this contact." => "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakte zu löschen.", -"Add Contact" => "Kontakt hinzufügen", -"Import" => "Importieren", -"Settings" => "Einstellungen", -"Addressbooks" => "Adressbücher", -"Close" => "Schließen", -"Keyboard shortcuts" => "Tastaturbefehle", -"Navigation" => "Navigation", -"Next contact in list" => "Nächster Kontakt aus der Liste", -"Previous contact in list" => "Vorheriger Kontakt aus der Liste", -"Expand/collapse current addressbook" => "Ausklappen/Einklappen des Adressbuches", -"Next addressbook" => "Nächstes Adressbuch", -"Previous addressbook" => "Vorheriges Adressbuch", -"Actions" => "Aktionen", -"Refresh contacts list" => "Kontaktliste neu laden", -"Add new contact" => "Neuen Kontakt hinzufügen", -"Add new addressbook" => "Neues Adressbuch hinzufügen", -"Delete current contact" => "Aktuellen Kontakt löschen", -"Drop photo to upload" => "Ziehen Sie ein Foto zum Hochladen hierher", -"Delete current photo" => "Derzeitiges Foto löschen", -"Edit current photo" => "Foto ändern", -"Upload new photo" => "Neues Foto hochladen", -"Select photo from ownCloud" => "Foto aus der ownCloud auswählen", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts oder Rückwärts mit Komma", -"Edit name details" => "Name ändern", -"Organization" => "Organisation", -"Delete" => "Löschen", -"Nickname" => "Spitzname", -"Enter nickname" => "Spitzname angeben", -"Web site" => "Webseite", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Webseite aufrufen", -"dd-mm-yyyy" => "dd.mm.yyyy", -"Groups" => "Gruppen", -"Separate groups with commas" => "Gruppen mit Komma getrennt", -"Edit groups" => "Gruppen editieren", -"Preferred" => "Bevorzugt", -"Please specify a valid email address." => "Bitte eine gültige E-Mail-Adresse angeben.", -"Enter email address" => "E-Mail-Adresse angeben", -"Mail to address" => "E-Mail an diese Adresse schreiben", -"Delete email address" => "E-Mail-Adresse löschen", -"Enter phone number" => "Telefonnummer angeben", -"Delete phone number" => "Telefonnummer löschen", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "IM löschen", -"View on map" => "Auf Karte anzeigen", -"Edit address details" => "Adressinformationen ändern", -"Add notes here." => "Füge hier Notizen ein.", -"Add field" => "Feld hinzufügen", -"Phone" => "Telefon", -"Email" => "E-Mail", -"Instant Messaging" => "Instant Messaging", -"Address" => "Adresse", -"Note" => "Notiz", -"Download contact" => "Kontakt herunterladen", -"Delete contact" => "Kontakt löschen", -"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.", -"Edit address" => "Adresse ändern", -"Type" => "Typ", -"PO Box" => "Postfach", -"Street address" => "Straßenanschrift", -"Street and number" => "Straße und Nummer", -"Extended" => "Erweitert", -"Apartment number etc." => "Wohnungsnummer usw.", -"City" => "Stadt", -"Region" => "Region", -"E.g. state or province" => "Z.B. Staat oder Bezirk", -"Zipcode" => "Postleitzahl", -"Postal code" => "PLZ", -"Country" => "Land", -"Addressbook" => "Adressbuch", -"Hon. prefixes" => "Höflichkeitspräfixe", -"Miss" => "Frau", -"Ms" => "Frau", -"Mr" => "Herr", -"Sir" => "Herr", -"Mrs" => "Frau", -"Dr" => "Dr.", -"Given name" => "Vorname", -"Additional names" => "Zusätzliche Namen", -"Family name" => "Familienname", -"Hon. suffixes" => "Höflichkeitssuffixe", -"J.D." => "Dr. Jur.", -"M.D." => "Dr. med.", -"D.O." => "DGOM", -"D.C." => "MChiro", -"Ph.D." => "Dr.", -"Esq." => "Hochwohlgeborenen", -"Jr." => "Jr.", -"Sn." => "Senior", -"Import a contacts file" => "Kontaktdatei importieren", -"Please choose the addressbook" => "Bitte Adressbuch auswählen", -"create a new addressbook" => "Neues Adressbuch erstellen", -"Name of new addressbook" => "Name des neuen Adressbuchs", -"Importing contacts" => "Kontakte werden importiert", -"You have no contacts in your addressbook." => "Sie haben keine Kontakte im Adressbuch.", -"Add contact" => "Kontakt hinzufügen", -"Select Address Books" => "Wähle Adressbuch", -"Enter name" => "Name eingeben", -"Enter description" => "Beschreibung eingeben", -"CardDAV syncing addresses" => "CardDAV Sync-Adressen", -"more info" => "mehr Informationen", -"Primary address (Kontact et al)" => "Primäre Adresse (für Kontakt o.ä.)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "CardDav-Link anzeigen", -"Show read-only VCF link" => "Schreibgeschützten VCF-Link anzeigen", -"Share" => "Teilen", -"Download" => "Herunterladen", -"Edit" => "Bearbeiten", -"New Address Book" => "Neues Adressbuch", -"Name" => "Name", -"Description" => "Beschreibung", -"Save" => "Speichern", -"Cancel" => "Abbrechen", -"More..." => "Mehr..." -); diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php deleted file mode 100644 index a50dd81e5d..0000000000 --- a/apps/contacts/l10n/el.php +++ /dev/null @@ -1,229 +0,0 @@ - "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων", -"id is not set." => "δεν ορίστηκε id", -"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα", -"Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.", -"No ID provided" => "Δε δόθηκε ID", -"Error setting checksum." => "Λάθος κατά τον ορισμό checksum ", -"No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή", -"No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων", -"No contacts found." => "Δεν βρέθηκαν επαφές", -"There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.", -"element name is not set." => "δεν ορίστηκε όνομα στοιχείου", -"Could not parse contact: " => "Δε αναγνώστηκε η επαφή", -"Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.", -"At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.", -"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:", -"Missing IM parameter." => "Λείπει IM παράμετρος.", -"Unknown IM: " => "Άγνωστο IM:", -"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.", -"Missing ID" => "Λείπει ID", -"Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"", -"checksum is not set." => "δε ορίστηκε checksum ", -"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα: ", -"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο. ", -"No contact ID was submitted." => "Δε υπεβλήθει ID επαφής", -"Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής", -"Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου", -"The loading photo is not valid." => "Η φορτωμένη φωτογραφία δεν είναι έγκυρη", -"Contact ID is missing." => "Λείπει ID επαφής", -"No photo path was submitted." => "Δε δόθηκε διαδρομή εικόνας", -"File doesn't exist:" => "Το αρχείο δεν υπάρχει:", -"Error loading image." => "Σφάλμα φόρτωσης εικόνας", -"Error getting contact object." => "Σφάλμα κατά τη λήψη αντικειμένου επαφής", -"Error getting PHOTO property." => "Σφάλμα κατά τη λήψη ιδιοτήτων ΦΩΤΟΓΡΑΦΙΑΣ.", -"Error saving contact." => "Σφάλμα κατά την αποθήκευση επαφής.", -"Error resizing image" => "Σφάλμα κατά την αλλαγή μεγέθους εικόνας", -"Error cropping image" => "Σφάλμα κατά την περικοπή εικόνας", -"Error creating temporary image" => "Σφάλμα κατά την δημιουργία προσωρινής εικόνας", -"Error finding image: " => "Σφάλμα κατά την εύρεση της εικόνας: ", -"Error uploading contacts to storage." => "Σφάλμα κατά την αποθήκευση επαφών", -"There is no error, the file uploaded with success" => "Δεν υπάρχει σφάλμα, το αρχείο ανέβηκε με επιτυχία ", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το μέγεθος του αρχείου ξεπερνάει το upload_max_filesize του php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην HTML φόρμα", -"The uploaded file was only partially uploaded" => "Το αρχείο ανέβηκε μερικώς", -"No file was uploaded" => "Δεν ανέβηκε κάποιο αρχείο", -"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος", -"Couldn't save temporary image: " => "Δεν ήταν δυνατή η αποθήκευση της προσωρινής εικόνας: ", -"Couldn't load temporary image: " => "Δεν ήταν δυνατή η φόρτωση της προσωρινής εικόνας: ", -"No file was uploaded. Unknown error" => "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα", -"Contacts" => "Επαφές", -"Sorry, this functionality has not been implemented yet" => "Λυπούμαστε, αυτή η λειτουργία δεν έχει υλοποιηθεί ακόμα", -"Not implemented" => "Δεν έχει υλοποιηθεί", -"Couldn't get a valid address." => "Αδυναμία λήψης έγκυρης διεύθυνσης", -"Error" => "Σφάλμα", -"You do not have permission to add contacts to " => "Δεν έχετε επαρκή δικαιώματα για προσθέσετε επαφές στο ", -"Please select one of your own address books." => "Παρακαλούμε επιλέξτε ένα από τα δικάς σας βιβλία διευθύνσεων.", -"Permission error" => "Σφάλμα δικαιωμάτων", -"This property has to be non-empty." => "Το πεδίο δεν πρέπει να είναι άδειο.", -"Couldn't serialize elements." => "Αδύνατο να μπουν σε σειρά τα στοιχεία", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org", -"Edit name" => "Αλλαγή ονόματος", -"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.", -"Error loading profile picture." => "Σφάλμα στην φόρτωση εικόνας προφίλ.", -"Select type" => "Επιλογή τύπου", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.", -"Do you want to merge these address books?" => "Επιθυμείτε να συγχωνεύσετε αυτά τα δύο βιβλία διευθύνσεων?", -"Result: " => "Αποτέλεσμα: ", -" imported, " => " εισάγεται,", -" failed." => " απέτυχε.", -"Displayname cannot be empty." => "Το όνομα προβολής δεν μπορεί να είναι κενό. ", -"Addressbook not found: " => "Το βιβλίο διευθύνσεων δεν βρέθηκε:", -"This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.", -"Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Εργασία", -"Home" => "Σπίτι", -"Other" => "Άλλο", -"Mobile" => "Κινητό", -"Text" => "Κείμενο", -"Voice" => "Ομιλία", -"Message" => "Μήνυμα", -"Fax" => "Φαξ", -"Video" => "Βίντεο", -"Pager" => "Βομβητής", -"Internet" => "Διαδίκτυο", -"Birthday" => "Γενέθλια", -"Business" => "Επιχείρηση", -"Call" => "Κάλεσε", -"Clients" => "Πελάτες", -"Deliverer" => "Προμηθευτής", -"Holidays" => "Διακοπές", -"Ideas" => "Ιδέες", -"Journey" => "Ταξίδι", -"Jubilee" => "Ιωβηλαίο", -"Meeting" => "Συνάντηση", -"Personal" => "Προσωπικό", -"Projects" => "Έργα", -"Questions" => "Ερωτήσεις", -"{name}'s Birthday" => "{name} έχει Γενέθλια", -"Contact" => "Επαφή", -"You do not have the permissions to edit this contact." => "Δεν διαθέτε επαρκή δικαιώματα για την επεξεργασία αυτής της επαφής.", -"You do not have the permissions to delete this contact." => "Δεν διαθέτε επαρκή δικαιώματα για την διαγραφή αυτής της επαφής.", -"Add Contact" => "Προσθήκη επαφής", -"Import" => "Εισαγωγή", -"Settings" => "Ρυθμίσεις", -"Addressbooks" => "Βιβλία διευθύνσεων", -"Close" => "Κλείσιμο ", -"Keyboard shortcuts" => "Συντομεύσεις πλητρολογίου", -"Navigation" => "Πλοήγηση", -"Next contact in list" => "Επόμενη επαφή στη λίστα", -"Previous contact in list" => "Προηγούμενη επαφή στη λίστα", -"Expand/collapse current addressbook" => "Ανάπτυξη/σύμπτυξη τρέχοντος βιβλίου διευθύνσεων", -"Next addressbook" => "Επόμενο βιβλίο διευθύνσεων", -"Previous addressbook" => "Προηγούμενο βιβλίο διευθύνσεων", -"Actions" => "Ενέργειες", -"Refresh contacts list" => "Ανανέωσε τη λίστα επαφών", -"Add new contact" => "Προσθήκη νέας επαφής", -"Add new addressbook" => "Προσθήκη νέου βιβλίου επαφών", -"Delete current contact" => "Διαγραφή τρέχουσας επαφής", -"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα", -"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας", -"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας", -"Upload new photo" => "Ανέβασε νέα φωτογραφία", -"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα", -"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος", -"Organization" => "Οργανισμός", -"Delete" => "Διαγραφή", -"Nickname" => "Παρατσούκλι", -"Enter nickname" => "Εισάγετε παρατσούκλι", -"Web site" => "Ιστότοπος", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Πήγαινε στον ιστότοπο", -"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ", -"Groups" => "Ομάδες", -"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ", -"Edit groups" => "Επεξεργασία ομάδων", -"Preferred" => "Προτιμώμενο", -"Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", -"Enter email address" => "Εισήγαγε διεύθυνση ηλεκτρονικού ταχυδρομείου", -"Mail to address" => "Αποστολή σε διεύθυνση", -"Delete email address" => "Διαγραφή διεύθυνση email", -"Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου", -"Delete phone number" => "Διέγραψε αριθμό τηλεφώνου", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Διαγραφή IM", -"View on map" => "Προβολή στο χάρτη", -"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης", -"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ", -"Add field" => "Προσθήκη πεδίου", -"Phone" => "Τηλέφωνο", -"Email" => "Email", -"Instant Messaging" => "Άμεσα μυνήματα", -"Address" => "Διεύθυνση", -"Note" => "Σημείωση", -"Download contact" => "Λήψη επαφής", -"Delete contact" => "Διαγραφή επαφής", -"The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.", -"Edit address" => "Επεξεργασία διεύθυνσης", -"Type" => "Τύπος", -"PO Box" => "Ταχ. Θυρίδα", -"Street address" => "Διεύθυνση οδού", -"Street and number" => "Οδός και αριθμός", -"Extended" => "Εκτεταμένη", -"Apartment number etc." => "Αριθμός διαμερίσματος", -"City" => "Πόλη", -"Region" => "Περιοχή", -"E.g. state or province" => "Π.χ. Πολιτεία ή επαρχεία", -"Zipcode" => "Τ.Κ.", -"Postal code" => "Ταχυδρομικός Κωδικός", -"Country" => "Χώρα", -"Addressbook" => "Βιβλίο διευθύνσεων", -"Hon. prefixes" => "προθέματα", -"Miss" => "Δις", -"Ms" => "Κα", -"Mr" => "Κα", -"Sir" => "Σερ", -"Mrs" => "Κα", -"Dr" => "Δρ.", -"Given name" => "Όνομα", -"Additional names" => "Επιπλέον ονόματα", -"Family name" => "Επώνυμο", -"Hon. suffixes" => "καταλήξεις", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Εισαγωγή αρχείου επαφών", -"Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων", -"create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων", -"Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων", -"Importing contacts" => "Εισαγωγή επαφών", -"You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων", -"Add contact" => "Προσθήκη επαφής", -"Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων", -"Enter name" => "Εισαγωγή ονόματος", -"Enter description" => "Εισαγωγή περιγραφής", -"CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ", -"more info" => "περισσότερες πληροφορίες", -"Primary address (Kontact et al)" => "Κύρια διεύθυνση", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Εμφάνιση συνδέσμου CardDav", -"Show read-only VCF link" => "Εμφάνιση συνδέσμου VCF μόνο για ανάγνωση", -"Share" => "Μοιράσου", -"Download" => "Λήψη", -"Edit" => "Επεξεργασία", -"New Address Book" => "Νέο βιβλίο διευθύνσεων", -"Name" => "Όνομα", -"Description" => "Περιγραφή", -"Save" => "Αποθήκευση", -"Cancel" => "Ακύρωση", -"More..." => "Περισσότερα..." -); diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php deleted file mode 100644 index e4eb06db2a..0000000000 --- a/apps/contacts/l10n/eo.php +++ /dev/null @@ -1,190 +0,0 @@ - "Eraro dum (mal)aktivigo de adresaro.", -"id is not set." => "identigilo ne agordiĝis.", -"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.", -"Error updating addressbook." => "Eraro dum ĝisdatigo de adresaro.", -"No ID provided" => "Neniu identigilo proviziĝis.", -"Error setting checksum." => "Eraro dum agordado de kontrolsumo.", -"No categories selected for deletion." => "Neniu kategorio elektiĝis por forigi.", -"No address books found." => "Neniu adresaro troviĝis.", -"No contacts found." => "Neniu kontakto troviĝis.", -"There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.", -"element name is not set." => "eronomo ne agordiĝis.", -"Could not parse contact: " => "Ne eblis analizi kontakton:", -"Cannot add empty property." => "Ne eblas aldoni malplenan propraĵon.", -"At least one of the address fields has to be filled out." => "Almenaŭ unu el la adreskampoj necesas pleniĝi.", -"Trying to add duplicate property: " => "Provante aldoni duobligitan propraĵon:", -"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.", -"Missing ID" => "Mankas identigilo", -"Error parsing VCard for ID: \"" => "Eraro dum analizo de VCard por identigilo:", -"checksum is not set." => "kontrolsumo ne agordiĝis.", -"Information about vCard is incorrect. Please reload the page: " => "Informo pri vCard malĝustas. Bonvolu reŝargi la paĝon:", -"Something went FUBAR. " => "Io FUBAR-is.", -"No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.", -"Error reading contact photo." => "Eraro dum lego de kontakta foto.", -"Error saving temporary file." => "Eraro dum konservado de provizora dosiero.", -"The loading photo is not valid." => "La alŝutata foto ne validas.", -"Contact ID is missing." => "Kontaktidentigilo mankas.", -"No photo path was submitted." => "Neniu vojo al foto sendiĝis.", -"File doesn't exist:" => "Dosiero ne ekzistas:", -"Error loading image." => "Eraro dum ŝargado de bildo.", -"Error getting contact object." => "Eraro dum ekhaviĝis kontakta objekto.", -"Error getting PHOTO property." => "Eraro dum ekhaviĝis la propraĵon PHOTO.", -"Error saving contact." => "Eraro dum konserviĝis kontakto.", -"Error resizing image" => "Eraro dum aligrandiĝis bildo", -"Error cropping image" => "Eraro dum stuciĝis bildo.", -"Error creating temporary image" => "Eraro dum kreiĝis provizora bildo.", -"Error finding image: " => "Eraro dum serĉo de bildo: ", -"Error uploading contacts to storage." => "Eraro dum alŝutiĝis kontaktoj al konservejo.", -"There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "La alŝutita dosiero transpasas la preskribon upload_max_filesize en php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La alŝutita dosiero transpasas la preskribon MAX_FILE_SIZE kiu specifiĝis en la HTML-formularo", -"The uploaded file was only partially uploaded" => "la alŝutita dosiero nur parte alŝutiĝis", -"No file was uploaded" => "Neniu dosiero alŝutiĝis.", -"Missing a temporary folder" => "Mankas provizora dosierujo.", -"Couldn't save temporary image: " => "Ne eblis konservi provizoran bildon: ", -"Couldn't load temporary image: " => "Ne eblis ŝargi provizoran bildon: ", -"No file was uploaded. Unknown error" => "Neniu dosiero alŝutiĝis. Nekonata eraro.", -"Contacts" => "Kontaktoj", -"Sorry, this functionality has not been implemented yet" => "Pardonu, ĉi tiu funkcio ankoraŭ ne estas realigita.", -"Not implemented" => "Ne disponebla", -"Couldn't get a valid address." => "Ne eblis ekhavi validan adreson.", -"Error" => "Eraro", -"This property has to be non-empty." => "Ĉi tiu propraĵo devas ne esti malplena.", -"Couldn't serialize elements." => "Ne eblis seriigi erojn.", -"Edit name" => "Redakti nomon", -"No files selected for upload." => "Neniu dosiero elektita por alŝuto.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "La dosiero, kiun vi provas alŝuti, transpasas la maksimuman grandon por dosieraj alŝutoj en ĉi tiu servilo.", -"Select type" => "Elektu tipon", -"Result: " => "Rezulto: ", -" imported, " => " enportoj, ", -" failed." => "malsukcesoj.", -"Addressbook not found: " => "Adresaro ne troviĝis:", -"This is not your addressbook." => "Ĉi tiu ne estas via adresaro.", -"Contact could not be found." => "Ne eblis trovi la kontakton.", -"Work" => "Laboro", -"Home" => "Hejmo", -"Other" => "Alia", -"Mobile" => "Poŝtelefono", -"Text" => "Teksto", -"Voice" => "Voĉo", -"Message" => "Mesaĝo", -"Fax" => "Fakso", -"Video" => "Videaĵo", -"Pager" => "Televokilo", -"Internet" => "Interreto", -"Birthday" => "Naskiĝotago", -"Business" => "Negoco", -"Call" => "Voko", -"Clients" => "Klientoj", -"Deliverer" => "Liveranto", -"Holidays" => "Ferioj", -"Ideas" => "Ideoj", -"Journey" => "Vojaĝo", -"Jubilee" => "Jubileo", -"Meeting" => "Kunveno", -"Personal" => "Persona", -"Projects" => "Projektoj", -"Questions" => "Demandoj", -"{name}'s Birthday" => "Naskiĝtago de {name}", -"Contact" => "Kontakto", -"Add Contact" => "Aldoni kontakton", -"Import" => "Enporti", -"Settings" => "Agordo", -"Addressbooks" => "Adresaroj", -"Close" => "Fermi", -"Keyboard shortcuts" => "Fulmoklavoj", -"Navigation" => "Navigado", -"Next contact in list" => "Jena kontakto en la listo", -"Previous contact in list" => "Maljena kontakto en la listo", -"Next addressbook" => "Jena adresaro", -"Previous addressbook" => "Maljena adresaro", -"Actions" => "Agoj", -"Refresh contacts list" => "Refreŝigi la kontaktoliston", -"Add new contact" => "Aldoni novan kontakton", -"Add new addressbook" => "Aldoni novan adresaron", -"Delete current contact" => "Forigi la nunan kontakton", -"Drop photo to upload" => "Demeti foton por alŝuti", -"Delete current photo" => "Forigi nunan foton", -"Edit current photo" => "Redakti nunan foton", -"Upload new photo" => "Alŝuti novan foton", -"Select photo from ownCloud" => "Elekti foton el ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo", -"Edit name details" => "Redakti detalojn de nomo", -"Organization" => "Organizaĵo", -"Delete" => "Forigi", -"Nickname" => "Kromnomo", -"Enter nickname" => "Enigu kromnomon", -"Web site" => "TTT-ejo", -"http://www.somesite.com" => "http://www.iuejo.com", -"Go to web site" => "Iri al TTT-ejon", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Grupoj", -"Separate groups with commas" => "Disigi grupojn per komoj", -"Edit groups" => "Redakti grupojn", -"Preferred" => "Preferata", -"Please specify a valid email address." => "Bonvolu specifi validan retpoŝtadreson.", -"Enter email address" => "Enigi retpoŝtadreson", -"Mail to address" => "Retpoŝtmesaĝo al adreso", -"Delete email address" => "Forigi retpoŝþadreson", -"Enter phone number" => "Enigi telefonnumeron", -"Delete phone number" => "Forigi telefonnumeron", -"View on map" => "Vidi en mapo", -"Edit address details" => "Redakti detalojn de adreso", -"Add notes here." => "Aldoni notojn ĉi tie.", -"Add field" => "Aldoni kampon", -"Phone" => "Telefono", -"Email" => "Retpoŝtadreso", -"Address" => "Adreso", -"Note" => "Noto", -"Download contact" => "Elŝuti kontakton", -"Delete contact" => "Forigi kontakton", -"The temporary image has been removed from cache." => "La provizora bildo estas forigita de la kaŝmemoro.", -"Edit address" => "Redakti adreson", -"Type" => "Tipo", -"PO Box" => "Abonkesto", -"Street address" => "Stratadreso", -"Street and number" => "Strato kaj numero", -"Extended" => "Etendita", -"City" => "Urbo", -"Region" => "Regiono", -"Zipcode" => "Poŝtokodo", -"Postal code" => "Poŝtkodo", -"Country" => "Lando", -"Addressbook" => "Adresaro", -"Hon. prefixes" => "Honoraj antaŭmetaĵoj", -"Miss" => "f-ino", -"Ms" => "s-ino", -"Mr" => "s-ro", -"Sir" => "s-ro", -"Mrs" => "s-ino", -"Dr" => "d-ro", -"Given name" => "Persona nomo", -"Additional names" => "Pliaj nomoj", -"Family name" => "Familia nomo", -"Hon. suffixes" => "Honoraj postmetaĵoj", -"Import a contacts file" => "Enporti kontaktodosieron", -"Please choose the addressbook" => "Bonvolu elekti adresaron", -"create a new addressbook" => "krei novan adresaron", -"Name of new addressbook" => "Nomo de nova adresaro", -"Importing contacts" => "Enportante kontaktojn", -"You have no contacts in your addressbook." => "Vi ne havas kontaktojn en via adresaro", -"Add contact" => "Aldoni kontakton", -"Select Address Books" => "Elektu adresarojn", -"Enter name" => "Enigu nomon", -"Enter description" => "Enigu priskribon", -"CardDAV syncing addresses" => "adresoj por CardDAV-sinkronigo", -"more info" => "pli da informo", -"Primary address (Kontact et al)" => "Ĉefa adreso (por Kontakt kaj aliaj)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Montri CardDav-ligilon", -"Show read-only VCF link" => "Montri nur legeblan VCF-ligilon", -"Download" => "Elŝuti", -"Edit" => "Redakti", -"New Address Book" => "Nova adresaro", -"Name" => "Nomo", -"Description" => "Priskribo", -"Save" => "Konservi", -"Cancel" => "Nuligi", -"More..." => "Pli..." -); diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php deleted file mode 100644 index 543bda3036..0000000000 --- a/apps/contacts/l10n/es.php +++ /dev/null @@ -1,208 +0,0 @@ - "Error al (des)activar libreta de direcciones.", -"id is not set." => "no se ha puesto ninguna ID.", -"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.", -"Error updating addressbook." => "Error al actualizar la libreta de direcciones.", -"No ID provided" => "No se ha proporcionado una ID", -"Error setting checksum." => "Error al establecer la suma de verificación.", -"No categories selected for deletion." => "No se seleccionaron categorías para borrar.", -"No address books found." => "No se encontraron libretas de direcciones.", -"No contacts found." => "No se encontraron contactos.", -"There was an error adding the contact." => "Se ha producido un error al añadir el contacto.", -"element name is not set." => "no se ha puesto ningún nombre de elemento.", -"Cannot add empty property." => "No se puede añadir una propiedad vacía.", -"At least one of the address fields has to be filled out." => "Al menos uno de los campos de direcciones se tiene que rellenar.", -"Trying to add duplicate property: " => "Intentando añadir una propiedad duplicada: ", -"Missing IM parameter." => "Falta un parámetro del MI.", -"Unknown IM: " => "MI desconocido:", -"Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.", -"Missing ID" => "Falta la ID", -"Error parsing VCard for ID: \"" => "Error al analizar el VCard para la ID: \"", -"checksum is not set." => "no se ha puesto ninguna suma de comprobación.", -"Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recarga la página:", -"Something went FUBAR. " => "Plof. Algo ha fallado.", -"No contact ID was submitted." => "No se ha mandado ninguna ID de contacto.", -"Error reading contact photo." => "Error leyendo fotografía del contacto.", -"Error saving temporary file." => "Error al guardar archivo temporal.", -"The loading photo is not valid." => "La foto que se estaba cargando no es válida.", -"Contact ID is missing." => "Falta la ID del contacto.", -"No photo path was submitted." => "No se ha introducido la ruta de la foto.", -"File doesn't exist:" => "Archivo inexistente:", -"Error loading image." => "Error cargando imagen.", -"Error getting contact object." => "Fallo al coger el contacto.", -"Error getting PHOTO property." => "Fallo al coger las propiedades de la foto .", -"Error saving contact." => "Fallo al salvar un contacto", -"Error resizing image" => "Fallo al cambiar de tamaño una foto", -"Error cropping image" => "Fallo al cortar el tamaño de la foto", -"Error creating temporary image" => "Fallo al crear la foto temporal", -"Error finding image: " => "Fallo al encontrar la imagen", -"Error uploading contacts to storage." => "Error al subir contactos al almacenamiento.", -"There is no error, the file uploaded with success" => "No hay ningún error, el archivo se ha subido con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo subido sobrepasa la directiva upload_max_filesize de php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo subido sobrepasa la directiva MAX_FILE_SIZE especificada en el formulario HTML", -"The uploaded file was only partially uploaded" => "El archivo se ha subido parcialmente", -"No file was uploaded" => "No se ha subido ningún archivo", -"Missing a temporary folder" => "Falta la carpeta temporal", -"Couldn't save temporary image: " => "Fallo no pudo salvar a una imagen temporal", -"Couldn't load temporary image: " => "Fallo no pudo cargara de una imagen temporal", -"No file was uploaded. Unknown error" => "Fallo no se subió el fichero", -"Contacts" => "Contactos", -"Sorry, this functionality has not been implemented yet" => "Perdón esta función no esta aún implementada", -"Not implemented" => "No esta implementada", -"Couldn't get a valid address." => "Fallo : no hay dirección valida", -"Error" => "Fallo", -"This property has to be non-empty." => "Este campo no puede estar vacío.", -"Couldn't serialize elements." => "Fallo no podido ordenar los elementos", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "La propiedad de \"borrar\" se llamado sin argumentos envia fallos a\nbugs.owncloud.org", -"Edit name" => "Edita el Nombre", -"No files selected for upload." => "No hay ficheros seleccionados para subir", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fichero que quieres subir excede el tamaño máximo permitido en este servidor.", -"Select type" => "Selecciona el tipo", -"Result: " => "Resultado :", -" imported, " => "Importado.", -" failed." => "Fallo.", -"This is not your addressbook." => "Esta no es tu agenda de contactos.", -"Contact could not be found." => "No se ha podido encontrar el contacto.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "Google Talk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Trabajo", -"Home" => "Particular", -"Other" => "Otro", -"Mobile" => "Móvil", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensaje", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Localizador", -"Internet" => "Internet", -"Birthday" => "Cumpleaños", -"Business" => "Negocio", -"Call" => "Llamada", -"Clients" => "Clientes", -"Holidays" => "Vacaciones", -"Ideas" => "Ideas", -"Journey" => "Jornada", -"Meeting" => "Reunión", -"Personal" => "Personal", -"Projects" => "Proyectos", -"Questions" => "Preguntas", -"{name}'s Birthday" => "Cumpleaños de {name}", -"Contact" => "Contacto", -"Add Contact" => "Añadir contacto", -"Import" => "Importar", -"Settings" => "Configuración", -"Addressbooks" => "Libretas de direcciones", -"Close" => "Cierra.", -"Keyboard shortcuts" => "Atajos de teclado", -"Navigation" => "Navegación", -"Next contact in list" => "Siguiente contacto en la lista", -"Previous contact in list" => "Anterior contacto en la lista", -"Actions" => "Acciones", -"Refresh contacts list" => "Refrescar la lista de contactos", -"Add new contact" => "Añadir un nuevo contacto", -"Add new addressbook" => "Añadir nueva libreta de direcciones", -"Delete current contact" => "Eliminar contacto actual", -"Drop photo to upload" => "Suelta una foto para subirla", -"Delete current photo" => "Eliminar fotografía actual", -"Edit current photo" => "Editar fotografía actual", -"Upload new photo" => "Subir nueva fotografía", -"Select photo from ownCloud" => "Seleccionar fotografía desde ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma", -"Edit name details" => "Editar los detalles del nombre", -"Organization" => "Organización", -"Delete" => "Borrar", -"Nickname" => "Alias", -"Enter nickname" => "Introduce un alias", -"Web site" => "Sitio Web", -"http://www.somesite.com" => "http://www.unsitio.com", -"Go to web site" => "Ir al sitio Web", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grupos", -"Separate groups with commas" => "Separa los grupos con comas", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor especifica una dirección de correo electrónico válida.", -"Enter email address" => "Introduce una dirección de correo electrónico", -"Mail to address" => "Enviar por correo a la dirección", -"Delete email address" => "Eliminar dirección de correo electrónico", -"Enter phone number" => "Introduce un número de teléfono", -"Delete phone number" => "Eliminar número de teléfono", -"Instant Messenger" => "Mensajero instantáneo", -"View on map" => "Ver en el mapa", -"Edit address details" => "Editar detalles de la dirección", -"Add notes here." => "Añade notas aquí.", -"Add field" => "Añadir campo", -"Phone" => "Teléfono", -"Email" => "Correo electrónico", -"Instant Messaging" => "Mensajería instantánea", -"Address" => "Dirección", -"Note" => "Nota", -"Download contact" => "Descargar contacto", -"Delete contact" => "Eliminar contacto", -"The temporary image has been removed from cache." => "La foto temporal se ha borrado del cache.", -"Edit address" => "Editar dirección", -"Type" => "Tipo", -"PO Box" => "Código postal", -"Street and number" => "Calle y número", -"Extended" => "Extendido", -"Apartment number etc." => "Número del apartamento, etc.", -"City" => "Ciudad", -"Region" => "Región", -"E.g. state or province" => "Ej: región o provincia", -"Zipcode" => "Código postal", -"Postal code" => "Código postal", -"Country" => "País", -"Addressbook" => "Libreta de direcciones", -"Hon. prefixes" => "Prefijos honoríficos", -"Miss" => "Srta", -"Ms" => "Sra.", -"Mr" => "Sr.", -"Sir" => "Señor", -"Mrs" => "Sra", -"Dr" => "Dr", -"Given name" => "Nombre", -"Additional names" => "Nombres adicionales", -"Family name" => "Apellido", -"Hon. suffixes" => "Sufijos honoríficos", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Dr", -"Esq." => "Don", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importar archivo de contactos", -"Please choose the addressbook" => "Por favor escoge la agenda", -"create a new addressbook" => "crear una nueva agenda", -"Name of new addressbook" => "Nombre de la nueva agenda", -"Importing contacts" => "Importando contactos", -"You have no contacts in your addressbook." => "No hay contactos en tu agenda.", -"Add contact" => "Añadir contacto", -"Enter name" => "Introducir nombre", -"Enter description" => "Introducir descripción", -"CardDAV syncing addresses" => "Sincronizando direcciones", -"more info" => "más información", -"Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Share" => "Compartir", -"Download" => "Descargar", -"Edit" => "Editar", -"New Address Book" => "Nueva libreta de direcciones", -"Name" => "Nombre", -"Description" => "Descripción", -"Save" => "Guardar", -"Cancel" => "Cancelar", -"More..." => "Más..." -); diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php deleted file mode 100644 index ea0f80ec51..0000000000 --- a/apps/contacts/l10n/et_EE.php +++ /dev/null @@ -1,155 +0,0 @@ - "Viga aadressiraamatu (de)aktiveerimisel.", -"id is not set." => "ID on määramata.", -"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.", -"Error updating addressbook." => "Viga aadressiraamatu uuendamisel.", -"No ID provided" => "ID-d pole sisestatud", -"Error setting checksum." => "Viga kontrollsumma määramisel.", -"No categories selected for deletion." => "Kustutamiseks pole valitud ühtegi kategooriat.", -"No address books found." => "Ei leitud ühtegi aadressiraamatut.", -"No contacts found." => "Ühtegi kontakti ei leitud.", -"There was an error adding the contact." => "Konktakti lisamisel tekkis viga.", -"element name is not set." => "elemendi nime pole määratud.", -"Cannot add empty property." => "Tühja omadust ei saa lisada.", -"At least one of the address fields has to be filled out." => "Vähemalt üks aadressiväljadest peab olema täidetud.", -"Trying to add duplicate property: " => "Proovitakse lisada topeltomadust: ", -"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.", -"Missing ID" => "Puudub ID", -"Error parsing VCard for ID: \"" => "Viga VCard-ist ID parsimisel: \"", -"checksum is not set." => "kontrollsummat pole määratud.", -"Information about vCard is incorrect. Please reload the page: " => "vCard info pole korrektne. Palun lae lehekülg uuesti: ", -"Something went FUBAR. " => "Midagi läks tõsiselt metsa.", -"No contact ID was submitted." => "Kontakti ID-d pole sisestatud.", -"Error reading contact photo." => "Viga kontakti foto lugemisel.", -"Error saving temporary file." => "Viga ajutise faili salvestamisel.", -"The loading photo is not valid." => "Laetav pilt pole korrektne pildifail.", -"Contact ID is missing." => "Kontakti ID puudub.", -"No photo path was submitted." => "Foto asukohta pole määratud.", -"File doesn't exist:" => "Faili pole olemas:", -"Error loading image." => "Viga pildi laadimisel.", -"Error getting contact object." => "Viga kontakti objekti hankimisel.", -"Error getting PHOTO property." => "Viga PHOTO omaduse hankimisel.", -"Error saving contact." => "Viga kontakti salvestamisel.", -"Error resizing image" => "Viga pildi suuruse muutmisel", -"Error cropping image" => "Viga pildi lõikamisel", -"Error creating temporary image" => "Viga ajutise pildi loomisel", -"Error finding image: " => "Viga pildi leidmisel: ", -"Error uploading contacts to storage." => "Viga kontaktide üleslaadimisel kettale.", -"There is no error, the file uploaded with success" => "Ühtegi tõrget polnud, fail on üles laetud", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Üleslaetud fail ületab php.ini failis määratud upload_max_filesize suuruse", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Üleslaetud fail ületab MAX_FILE_SIZE suuruse, mis on HTML vormi jaoks määratud", -"The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt", -"No file was uploaded" => "Ühtegi faili ei laetud üles", -"Missing a temporary folder" => "Ajutiste failide kaust puudub", -"Couldn't save temporary image: " => "Ajutise pildi salvestamine ebaõnnestus: ", -"Couldn't load temporary image: " => "Ajutise pildi laadimine ebaõnnestus: ", -"No file was uploaded. Unknown error" => "Ühtegi faili ei laetud üles. Tundmatu viga", -"Contacts" => "Kontaktid", -"Sorry, this functionality has not been implemented yet" => "Vabandust, aga see funktsioon pole veel valmis", -"Not implemented" => "Pole implementeeritud", -"Couldn't get a valid address." => "Kehtiva aadressi hankimine ebaõnnestus", -"Error" => "Viga", -"This property has to be non-empty." => "See omadus ei tohi olla tühi.", -"Edit name" => "Muuda nime", -"No files selected for upload." => "Üleslaadimiseks pole faile valitud.", -"Select type" => "Vali tüüp", -"Result: " => "Tulemus: ", -" imported, " => " imporditud, ", -" failed." => " ebaõnnestus.", -"This is not your addressbook." => "See pole sinu aadressiraamat.", -"Contact could not be found." => "Kontakti ei leitud.", -"Work" => "Töö", -"Home" => "Kodu", -"Mobile" => "Mobiil", -"Text" => "Tekst", -"Voice" => "Hääl", -"Message" => "Sõnum", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Piipar", -"Internet" => "Internet", -"Birthday" => "Sünnipäev", -"{name}'s Birthday" => "{name} sünnipäev", -"Contact" => "Kontakt", -"Add Contact" => "Lisa kontakt", -"Import" => "Impordi", -"Addressbooks" => "Aadressiraamatud", -"Close" => "Sule", -"Drop photo to upload" => "Lohista üleslaetav foto siia", -"Delete current photo" => "Kustuta praegune foto", -"Edit current photo" => "Muuda praegust pilti", -"Upload new photo" => "Lae üles uus foto", -"Select photo from ownCloud" => "Vali foto ownCloudist", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega", -"Edit name details" => "Muuda nime üksikasju", -"Organization" => "Organisatsioon", -"Delete" => "Kustuta", -"Nickname" => "Hüüdnimi", -"Enter nickname" => "Sisesta hüüdnimi", -"dd-mm-yyyy" => "dd.mm.yyyy", -"Groups" => "Grupid", -"Separate groups with commas" => "Eralda grupid komadega", -"Edit groups" => "Muuda gruppe", -"Preferred" => "Eelistatud", -"Please specify a valid email address." => "Palun sisesta korrektne e-posti aadress.", -"Enter email address" => "Sisesta e-posti aadress", -"Mail to address" => "Kiri aadressile", -"Delete email address" => "Kustuta e-posti aadress", -"Enter phone number" => "Sisesta telefoninumber", -"Delete phone number" => "Kustuta telefoninumber", -"View on map" => "Vaata kaardil", -"Edit address details" => "Muuda aaressi infot", -"Add notes here." => "Lisa märkmed siia.", -"Add field" => "Lisa väli", -"Phone" => "Telefon", -"Email" => "E-post", -"Address" => "Aadress", -"Note" => "Märkus", -"Download contact" => "Lae kontakt alla", -"Delete contact" => "Kustuta kontakt", -"The temporary image has been removed from cache." => "Ajutine pilt on puhvrist eemaldatud.", -"Edit address" => "Muuda aadressi", -"Type" => "Tüüp", -"PO Box" => "Postkontori postkast", -"Extended" => "Laiendatud", -"City" => "Linn", -"Region" => "Piirkond", -"Zipcode" => "Postiindeks", -"Country" => "Riik", -"Addressbook" => "Aadressiraamat", -"Hon. prefixes" => "Eesliited", -"Miss" => "Preili", -"Ms" => "Pr", -"Mr" => "Hr", -"Sir" => "Härra", -"Mrs" => "Proua", -"Dr" => "Dr", -"Given name" => "Eesnimi", -"Additional names" => "Lisanimed", -"Family name" => "Perekonnanimi", -"Hon. suffixes" => "Järelliited", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Senior.", -"Import a contacts file" => "Impordi kontaktifail", -"Please choose the addressbook" => "Palun vali aadressiraamat", -"create a new addressbook" => "loo uus aadressiraamat", -"Name of new addressbook" => "Uue aadressiraamatu nimi", -"Importing contacts" => "Kontaktide importimine", -"You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.", -"Add contact" => "Lisa kontakt", -"CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid", -"more info" => "lisainfo", -"Primary address (Kontact et al)" => "Peamine aadress", -"iOS/OS X" => "iOS/OS X", -"Download" => "Lae alla", -"Edit" => "Muuda", -"New Address Book" => "Uus aadressiraamat", -"Save" => "Salvesta", -"Cancel" => "Loobu" -); diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php deleted file mode 100644 index 56a4812670..0000000000 --- a/apps/contacts/l10n/eu.php +++ /dev/null @@ -1,169 +0,0 @@ - "Errore bat egon da helbide-liburua (des)gaitzen", -"id is not set." => "IDa ez da ezarri.", -"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.", -"Error updating addressbook." => "Errore bat egon da helbide liburua eguneratzen.", -"No ID provided" => "Ez da IDrik eman", -"Error setting checksum." => "Errorea kontrol-batura ezartzean.", -"No categories selected for deletion." => "Ez dira ezabatzeko kategoriak hautatu.", -"No address books found." => "Ez da helbide libururik aurkitu.", -"No contacts found." => "Ez da kontakturik aurkitu.", -"There was an error adding the contact." => "Errore bat egon da kontaktua gehitzerakoan", -"element name is not set." => "elementuaren izena ez da ezarri.", -"Could not parse contact: " => "Ezin izan da kontaktua analizatu:", -"Cannot add empty property." => "Ezin da propieta hutsa gehitu.", -"At least one of the address fields has to be filled out." => "Behintzat helbide eremuetako bat bete behar da.", -"Trying to add duplicate property: " => "Propietate bikoiztuta gehitzen saiatzen ari zara:", -"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", -"Missing ID" => "ID falta da", -"Error parsing VCard for ID: \"" => "Errorea VCard analizatzean hurrengo IDrako: \"", -"checksum is not set." => "Kontrol-batura ezarri gabe dago.", -"Information about vCard is incorrect. Please reload the page: " => "vCard honen informazioa ez da zuzena.Mezedez birkargatu orria:", -"No contact ID was submitted." => "Ez da kontaktuaren IDrik eman.", -"Error reading contact photo." => "Errore bat izan da kontaktuaren argazkia igotzerakoan.", -"Error saving temporary file." => "Errore bat izan da aldi bateko fitxategia gordetzerakoan.", -"The loading photo is not valid." => "Kargatzen ari den argazkia ez da egokia.", -"Contact ID is missing." => "Kontaktuaren IDa falta da.", -"No photo path was submitted." => "Ez da argazkiaren bide-izenik eman.", -"File doesn't exist:" => "Fitxategia ez da existitzen:", -"Error loading image." => "Errore bat izan da irudia kargatzearkoan.", -"Error getting contact object." => "Errore bat izan da kontaktu objetua lortzean.", -"Error getting PHOTO property." => "Errore bat izan da PHOTO propietatea lortzean.", -"Error saving contact." => "Errore bat izan da kontaktua gordetzean.", -"Error resizing image" => "Errore bat izan da irudiaren tamaina aldatzean", -"Error cropping image" => "Errore bat izan da irudia mozten", -"Error creating temporary image" => "Errore bat izan da aldi bateko irudia sortzen", -"Error finding image: " => "Ezin izan da irudia aurkitu:", -"Error uploading contacts to storage." => "Errore bat egon da kontaktuak biltegira igotzerakoan.", -"There is no error, the file uploaded with success" => "Ez da errorerik egon, fitxategia ongi igo da", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Igotako fitxategia php.ini fitxategiko upload_max_filesize direktiba baino handiagoa da", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Igotako fitxategia HTML formularioan zehaztutako MAX_FILE_SIZE direktiba baino handidagoa da.", -"The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat bakarrik igo da", -"No file was uploaded" => "Ez da fitxategirik igo", -"Missing a temporary folder" => "Aldi bateko karpeta falta da", -"Couldn't save temporary image: " => "Ezin izan da aldi bateko irudia gorde:", -"Couldn't load temporary image: " => "Ezin izan da aldi bateko irudia kargatu:", -"No file was uploaded. Unknown error" => "Ez da fitxategirik igo. Errore ezezaguna", -"Contacts" => "Kontaktuak", -"Sorry, this functionality has not been implemented yet" => "Barkatu, aukera hau ez da oriandik inplementatu", -"Not implemented" => "Inplementatu gabe", -"Couldn't get a valid address." => "Ezin izan da eposta baliagarri bat hartu.", -"Error" => "Errorea", -"This property has to be non-empty." => "Propietate hau ezin da hutsik egon.", -"Couldn't serialize elements." => "Ezin izan dira elementuak serializatu.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' argumenturik gabe deitu da. Mezedez abisatu bugs.owncloud.org-en", -"Edit name" => "Editatu izena", -"No files selected for upload." => "Ez duzu igotzeko fitxategirik hautatu.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Igo nahi duzun fitxategia zerbitzariak onartzen duen tamaina baino handiagoa da.", -"Select type" => "Hautatu mota", -"Result: " => "Emaitza:", -" imported, " => " inportatua, ", -" failed." => "huts egin du.", -"This is not your addressbook." => "Hau ez da zure helbide liburua.", -"Contact could not be found." => "Ezin izan da kontaktua aurkitu.", -"Work" => "Lana", -"Home" => "Etxea", -"Other" => "Bestelakoa", -"Mobile" => "Mugikorra", -"Text" => "Testua", -"Voice" => "Ahotsa", -"Message" => "Mezua", -"Fax" => "Fax-a", -"Video" => "Bideoa", -"Pager" => "Bilagailua", -"Internet" => "Internet", -"Birthday" => "Jaioteguna", -"Call" => "Deia", -"Clients" => "Bezeroak", -"Holidays" => "Oporrak", -"Ideas" => "Ideiak", -"Journey" => "Bidaia", -"Meeting" => "Bilera", -"Personal" => "Pertsonala", -"Projects" => "Proiektuak", -"Questions" => "Galderak", -"{name}'s Birthday" => "{name}ren jaioteguna", -"Contact" => "Kontaktua", -"Add Contact" => "Gehitu kontaktua", -"Import" => "Inportatu", -"Settings" => "Ezarpenak", -"Addressbooks" => "Helbide Liburuak", -"Close" => "Itxi", -"Keyboard shortcuts" => "Teklatuaren lasterbideak", -"Navigation" => "Nabigazioa", -"Next contact in list" => "Hurrengoa kontaktua zerrendan", -"Previous contact in list" => "Aurreko kontaktua zerrendan", -"Expand/collapse current addressbook" => "Zabaldu/tolestu uneko helbide-liburua", -"Actions" => "Ekintzak", -"Refresh contacts list" => "Gaurkotu kontaktuen zerrenda", -"Add new contact" => "Gehitu kontaktu berria", -"Add new addressbook" => "Gehitu helbide-liburu berria", -"Delete current contact" => "Ezabatu uneko kontaktuak", -"Drop photo to upload" => "Askatu argazkia igotzeko", -"Delete current photo" => "Ezabatu oraingo argazkia", -"Edit current photo" => "Editatu oraingo argazkia", -"Upload new photo" => "Igo argazki berria", -"Select photo from ownCloud" => "Hautatu argazki bat ownCloudetik", -"Edit name details" => "Editatu izenaren zehaztasunak", -"Organization" => "Erakundea", -"Delete" => "Ezabatu", -"Nickname" => "Ezizena", -"Enter nickname" => "Sartu ezizena", -"Web site" => "Web orria", -"http://www.somesite.com" => "http://www.webgunea.com", -"Go to web site" => "Web orrira joan", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Taldeak", -"Separate groups with commas" => "Banatu taldeak komekin", -"Edit groups" => "Editatu taldeak", -"Preferred" => "Hobetsia", -"Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat", -"Enter email address" => "Sartu eposta helbidea", -"Mail to address" => "Bidali helbidera", -"Delete email address" => "Ezabatu eposta helbidea", -"Enter phone number" => "Sartu telefono zenbakia", -"Delete phone number" => "Ezabatu telefono zenbakia", -"View on map" => "Ikusi mapan", -"Edit address details" => "Editatu helbidearen zehaztasunak", -"Add notes here." => "Gehitu oharrak hemen.", -"Add field" => "Gehitu eremua", -"Phone" => "Telefonoa", -"Email" => "Eposta", -"Address" => "Helbidea", -"Note" => "Oharra", -"Download contact" => "Deskargatu kontaktua", -"Delete contact" => "Ezabatu kontaktua", -"The temporary image has been removed from cache." => "Aldi bateko irudia cachetik ezabatu da.", -"Edit address" => "Editatu helbidea", -"Type" => "Mota", -"PO Box" => "Posta kutxa", -"Street address" => "Kalearen helbidea", -"Street and number" => "Kalea eta zenbakia", -"Extended" => "Hedatua", -"Apartment number etc." => "Etxe zenbakia eab.", -"City" => "Hiria", -"Region" => "Eskualdea", -"Zipcode" => "Posta kodea", -"Postal code" => "Posta kodea", -"Country" => "Herrialdea", -"Addressbook" => "Helbide-liburua", -"Import a contacts file" => "Inporatu kontaktuen fitxategia", -"Please choose the addressbook" => "Mesedez, aukeratu helbide liburua", -"create a new addressbook" => "sortu helbide liburu berria", -"Name of new addressbook" => "Helbide liburuaren izena", -"Importing contacts" => "Kontaktuak inportatzen", -"You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.", -"Add contact" => "Gehitu kontaktua", -"Select Address Books" => "Hautatu helbide-liburuak", -"Enter name" => "Sartu izena", -"Enter description" => "Sartu deskribapena", -"CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak", -"more info" => "informazio gehiago", -"Primary address (Kontact et al)" => "Helbide nagusia", -"iOS/OS X" => "iOS/OS X", -"Download" => "Deskargatu", -"Edit" => "Editatu", -"New Address Book" => "Helbide-liburu berria", -"Save" => "Gorde", -"Cancel" => "Ezeztatu" -); diff --git a/apps/contacts/l10n/fa.php b/apps/contacts/l10n/fa.php deleted file mode 100644 index 8029cd201e..0000000000 --- a/apps/contacts/l10n/fa.php +++ /dev/null @@ -1,158 +0,0 @@ - "خطا در (غیر) فعال سازی کتابچه نشانه ها", -"id is not set." => "شناسه تعیین نشده", -"Cannot update addressbook with an empty name." => "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید", -"Error updating addressbook." => "خطا در هنگام بروزرسانی کتابچه نشانی ها", -"No ID provided" => "هیچ شناسه ای ارائه نشده", -"Error setting checksum." => "خطا در تنظیم checksum", -"No categories selected for deletion." => "هیچ گروهی برای حذف شدن در نظر گرفته نشده", -"No address books found." => "هیچ کتابچه نشانی پیدا نشد", -"No contacts found." => "هیچ شخصی پیدا نشد", -"There was an error adding the contact." => "یک خطا در افزودن اطلاعات شخص مورد نظر", -"element name is not set." => "نام اصلی تنظیم نشده است", -"Cannot add empty property." => "نمیتوان یک خاصیت خالی ایجاد کرد", -"At least one of the address fields has to be filled out." => "At least one of the address fields has to be filled out. ", -"Trying to add duplicate property: " => "امتحان کردن برای وارد کردن مشخصات تکراری", -"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید", -"Missing ID" => "نشانی گم شده", -"Error parsing VCard for ID: \"" => "خطا در تجزیه کارت ویزا برای شناسه:", -"checksum is not set." => "checksum تنظیم شده نیست", -"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید", -"Something went FUBAR. " => "چند چیز به FUBAR رفتند", -"No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده", -"Error reading contact photo." => "خطا در خواندن اطلاعات تصویر", -"Error saving temporary file." => "خطا در ذخیره پرونده موقت", -"The loading photo is not valid." => "بارگزاری تصویر امکان پذیر نیست", -"Contact ID is missing." => "اطلاعات شناسه گم شده", -"No photo path was submitted." => "هیچ نشانی از تصویرارسال نشده", -"File doesn't exist:" => "پرونده وجود ندارد", -"Error loading image." => "خطا در بارگزاری تصویر", -"Error getting contact object." => "خطا در گرفتن اطلاعات شخص", -"Error getting PHOTO property." => "خطا در دربافت تصویر ویژگی شخصی", -"Error saving contact." => "خطا در ذخیره سازی اطلاعات", -"Error resizing image" => "خطا در تغییر دادن اندازه تصویر", -"Error cropping image" => "خطا در برداشت تصویر", -"Error creating temporary image" => "خطا در ساخت تصویر temporary", -"Error finding image: " => "خطا در پیدا کردن تصویر:", -"Error uploading contacts to storage." => "خطا در هنگام بارگذاری و ذخیره سازی", -"There is no error, the file uploaded with success" => "هیچ خطایی نیست بارگذاری پرونده موفقیت آمیز بود", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم آپلود از طریق Php.ini تعیین می شود", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حداکثر حجم قابل بار گذاری از طریق HTML MAX_FILE_SIZE است", -"The uploaded file was only partially uploaded" => "پرونده بارگذاری شده فقط تاحدودی بارگذاری شده", -"No file was uploaded" => "هیچ پروندهای بارگذاری نشده", -"Missing a temporary folder" => "یک پوشه موقت گم شده", -"Couldn't save temporary image: " => "قابلیت ذخیره تصویر موقت وجود ندارد:", -"Couldn't load temporary image: " => "قابلیت بارگذاری تصویر موقت وجود ندارد:", -"No file was uploaded. Unknown error" => "هیچ فایلی آپلود نشد.خطای ناشناس", -"Contacts" => "اشخاص", -"Sorry, this functionality has not been implemented yet" => "با عرض پوزش،این قابلیت هنوز اجرا نشده است", -"Not implemented" => "انجام نشد", -"Couldn't get a valid address." => "Couldn't get a valid address.", -"Error" => "خطا", -"This property has to be non-empty." => "این ویژگی باید به صورت غیر تهی عمل کند", -"Couldn't serialize elements." => "قابلیت مرتب سازی عناصر وجود ندارد", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "پاک کردن ویژگی بدون استدلال انجام شده.لطفا این مورد را گزارش دهید:bugs.owncloud.org", -"Edit name" => "نام تغییر", -"No files selected for upload." => "هیچ فایلی برای آپلود انتخاب نشده است", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "حجم فایل بسیار بیشتر از حجم تنظیم شده در تنظیمات سرور است", -"Select type" => "نوع را انتخاب کنید", -"Result: " => "نتیجه:", -" imported, " => "وارد شد،", -" failed." => "ناموفق", -"This is not your addressbook." => "این کتابچه ی نشانه های شما نیست", -"Contact could not be found." => "اتصال ویا تماسی یافت نشد", -"Work" => "کار", -"Home" => "خانه", -"Mobile" => "موبایل", -"Text" => "متن", -"Voice" => "صدا", -"Message" => "پیغام", -"Fax" => "دورنگار:", -"Video" => "رسانه تصویری", -"Pager" => "صفحه", -"Internet" => "اینترنت", -"Birthday" => "روزتولد", -"{name}'s Birthday" => "روز تولد {name} است", -"Contact" => "اشخاص", -"Add Contact" => "افزودن اطلاعات شخص مورد نظر", -"Import" => "وارد کردن", -"Addressbooks" => "کتابچه ی نشانی ها", -"Close" => "بستن", -"Drop photo to upload" => "تصویر را به اینجا بکشید تا بار گذازی شود", -"Delete current photo" => "پاک کردن تصویر کنونی", -"Edit current photo" => "ویرایش تصویر کنونی", -"Upload new photo" => "بار گذاری یک تصویر جدید", -"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", -"Edit name details" => "ویرایش نام جزئیات", -"Organization" => "نهاد(ارگان)", -"Delete" => "پاک کردن", -"Nickname" => "نام مستعار", -"Enter nickname" => "یک نام مستعار وارد کنید", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "گروه ها", -"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما", -"Edit groups" => "ویرایش گروه ها", -"Preferred" => "مقدم", -"Please specify a valid email address." => "لطفا یک پست الکترونیکی معتبر وارد کنید", -"Enter email address" => "یک پست الکترونیکی وارد کنید", -"Mail to address" => "به نشانی ارسال شد", -"Delete email address" => "پاک کردن نشانی پست الکترونیکی", -"Enter phone number" => "شماره تلفن راوارد کنید", -"Delete phone number" => "پاک کردن شماره تلفن", -"View on map" => "دیدن روی نقشه", -"Edit address details" => "ویرایش جزئیات نشانی ها", -"Add notes here." => "اینجا یادداشت ها را بیافزایید", -"Add field" => "اضافه کردن فیلد", -"Phone" => "شماره تلفن", -"Email" => "نشانی پست الکترنیک", -"Address" => "نشانی", -"Note" => "یادداشت", -"Download contact" => "دانلود مشخصات اشخاص", -"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", -"The temporary image has been removed from cache." => "تصویر موقت از کش پاک شد.", -"Edit address" => "ویرایش نشانی", -"Type" => "نوع", -"PO Box" => "صندوق پستی", -"Extended" => "تمدید شده", -"City" => "شهر", -"Region" => "ناحیه", -"Zipcode" => "کد پستی", -"Country" => "کشور", -"Addressbook" => "کتابچه ی نشانی ها", -"Hon. prefixes" => "پیشوند های محترمانه", -"Miss" => "خانم", -"Ms" => "خانم", -"Mr" => "آقا", -"Sir" => "آقا", -"Mrs" => "خانم", -"Dr" => "دکتر", -"Given name" => "نام معلوم", -"Additional names" => "نام های دیگر", -"Family name" => "نام خانوادگی", -"Hon. suffixes" => "پسوند های محترم", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "دکتری", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "وارد کردن پرونده حاوی اطلاعات", -"Please choose the addressbook" => "لطفا یک کتابچه نشانی انتخاب کنید", -"create a new addressbook" => "یک کتابچه نشانی بسازید", -"Name of new addressbook" => "نام کتابچه نشانی جدید", -"Importing contacts" => "وارد کردن اشخاص", -"You have no contacts in your addressbook." => "شماهیچ شخصی در کتابچه نشانی خود ندارید", -"Add contact" => "افزودن اطلاعات شخص مورد نظر", -"CardDAV syncing addresses" => "CardDAV syncing addresses ", -"more info" => "اطلاعات بیشتر", -"Primary address (Kontact et al)" => "نشانی اولیه", -"iOS/OS X" => "iOS/OS X ", -"Download" => "بارگیری", -"Edit" => "ویرایش", -"New Address Book" => "کتابچه نشانه های جدید", -"Save" => "ذخیره سازی", -"Cancel" => "انصراف" -); diff --git a/apps/contacts/l10n/fi_FI.php b/apps/contacts/l10n/fi_FI.php deleted file mode 100644 index 23cafe44dc..0000000000 --- a/apps/contacts/l10n/fi_FI.php +++ /dev/null @@ -1,159 +0,0 @@ - "Virhe päivitettäessä osoitekirjaa.", -"Error setting checksum." => "Virhe asettaessa tarkistussummaa.", -"No categories selected for deletion." => "Luokkia ei ole valittu poistettavaksi.", -"No address books found." => "Osoitekirjoja ei löytynyt.", -"No contacts found." => "Yhteystietoja ei löytynyt.", -"There was an error adding the contact." => "Virhe yhteystietoa lisättäessä.", -"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.", -"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.", -"Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.", -"Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"", -"Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.", -"No photo path was submitted." => "Kuvan polkua ei annettu.", -"File doesn't exist:" => "Tiedostoa ei ole olemassa:", -"Error loading image." => "Virhe kuvaa ladatessa.", -"Error saving contact." => "Virhe yhteystietoa tallennettaessa.", -"Error resizing image" => "Virhe asettaessa kuvaa uuteen kokoon", -"Error cropping image" => "Virhe rajatessa kuvaa", -"Error creating temporary image" => "Virhe luotaessa väliaikaista kuvaa", -"There is no error, the file uploaded with success" => "Ei virhettä, tiedosto lähetettiin onnistuneesti", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lähetetyn tiedoston koko ylittää upload_max_filesize-asetuksen arvon php.ini-tiedostossa", -"The uploaded file was only partially uploaded" => "Lähetetty tiedosto lähetettiin vain osittain", -"No file was uploaded" => "Tiedostoa ei lähetetty", -"Missing a temporary folder" => "Tilapäiskansio puuttuu", -"Couldn't save temporary image: " => "Väliaikaiskuvan tallennus epäonnistui:", -"Couldn't load temporary image: " => "Väliaikaiskuvan lataus epäonnistui:", -"No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe", -"Contacts" => "Yhteystiedot", -"Error" => "Virhe", -"Edit name" => "Muokkaa nimeä", -"No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.", -"Error loading profile picture." => "Virhe profiilikuvaa ladatessa.", -"Select type" => "Valitse tyyppi", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Jotkin yhteystiedot on merkitty poistettaviksi, mutta niitä ei ole vielä poistettu. Odota hetki, että kyseiset yhteystiedot poistetaan.", -"Do you want to merge these address books?" => "Haluatko yhdistää nämä osoitekirjat?", -"Result: " => "Tulos: ", -" imported, " => " tuotu, ", -" failed." => " epäonnistui.", -"Displayname cannot be empty." => "Näyttönimi ei voi olla tyhjä.", -"Addressbook not found: " => "Osoitekirjaa ei löytynyt:", -"This is not your addressbook." => "Tämä ei ole osoitekirjasi.", -"Contact could not be found." => "Yhteystietoa ei löytynyt.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "Google Talk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Työ", -"Home" => "Koti", -"Other" => "Muu", -"Mobile" => "Mobiili", -"Text" => "Teksti", -"Voice" => "Ääni", -"Message" => "Viesti", -"Fax" => "Faksi", -"Video" => "Video", -"Pager" => "Hakulaite", -"Internet" => "Internet", -"Birthday" => "Syntymäpäivä", -"Business" => "Työ", -"Questions" => "Kysymykset", -"{name}'s Birthday" => "Henkilön {name} syntymäpäivä", -"Contact" => "Yhteystieto", -"Add Contact" => "Lisää yhteystieto", -"Import" => "Tuo", -"Settings" => "Asetukset", -"Addressbooks" => "Osoitekirjat", -"Close" => "Sulje", -"Keyboard shortcuts" => "Pikanäppäimet", -"Next contact in list" => "Seuraava yhteystieto luettelossa", -"Previous contact in list" => "Edellinen yhteystieto luettelossa", -"Next addressbook" => "Seuraava osoitekirja", -"Previous addressbook" => "Edellinen osoitekirja", -"Actions" => "Toiminnot", -"Refresh contacts list" => "Päivitä yhteystietoluettelo", -"Add new contact" => "Lisää uusi yhteystieto", -"Add new addressbook" => "Lisää uusi osoitekirja", -"Delete current contact" => "Poista nykyinen yhteystieto", -"Delete current photo" => "Poista nykyinen valokuva", -"Edit current photo" => "Muokkaa nykyistä valokuvaa", -"Upload new photo" => "Lähetä uusi valokuva", -"Select photo from ownCloud" => "Valitse valokuva ownCloudista", -"Edit name details" => "Muokkaa nimitietoja", -"Organization" => "Organisaatio", -"Delete" => "Poista", -"Nickname" => "Kutsumanimi", -"Enter nickname" => "Anna kutsumanimi", -"Web site" => "Verkkosivu", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Siirry verkkosivulle", -"Groups" => "Ryhmät", -"Separate groups with commas" => "Erota ryhmät pilkuilla", -"Edit groups" => "Muokkaa ryhmiä", -"Preferred" => "Ensisijainen", -"Please specify a valid email address." => "Anna kelvollinen sähköpostiosoite.", -"Enter email address" => "Anna sähköpostiosoite", -"Mail to address" => "Lähetä sähköpostia", -"Delete email address" => "Poista sähköpostiosoite", -"Enter phone number" => "Anna puhelinnumero", -"Delete phone number" => "Poista puhelinnumero", -"Instant Messenger" => "Pikaviestin", -"View on map" => "Näytä kartalla", -"Edit address details" => "Muokkaa osoitetietoja", -"Add notes here." => "Lisää huomiot tähän.", -"Add field" => "Lisää kenttä", -"Phone" => "Puhelin", -"Email" => "Sähköposti", -"Address" => "Osoite", -"Note" => "Huomio", -"Download contact" => "Lataa yhteystieto", -"Delete contact" => "Poista yhteystieto", -"The temporary image has been removed from cache." => "Väliaikainen kuva on poistettu välimuistista.", -"Edit address" => "Muokkaa osoitetta", -"Type" => "Tyyppi", -"PO Box" => "Postilokero", -"Street address" => "Katuosoite", -"Street and number" => "Katu ja numero", -"Extended" => "Laajennettu", -"Apartment number etc." => "Asunnon numero jne.", -"City" => "Paikkakunta", -"Region" => "Alue", -"Zipcode" => "Postinumero", -"Postal code" => "Postinumero", -"Country" => "Maa", -"Addressbook" => "Osoitekirja", -"Given name" => "Etunimi", -"Additional names" => "Lisänimet", -"Family name" => "Sukunimi", -"Import a contacts file" => "Tuo yhteystiedon sisältävä tiedosto", -"Please choose the addressbook" => "Valitse osoitekirja", -"create a new addressbook" => "luo uusi osoitekirja", -"Name of new addressbook" => "Uuden osoitekirjan nimi", -"Importing contacts" => "Tuodaan yhteystietoja", -"You have no contacts in your addressbook." => "Osoitekirjassasi ei ole yhteystietoja.", -"Add contact" => "Lisää yhteystieto", -"Select Address Books" => "Valitse osoitekirjat", -"Enter name" => "Anna nimi", -"Enter description" => "Anna kuvaus", -"CardDAV syncing addresses" => "CardDAV-synkronointiosoitteet", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Näytä CardDav-linkki", -"Show read-only VCF link" => "Näytä vain luku -muodossa oleva VCF-linkki", -"Share" => "Jaa", -"Download" => "Lataa", -"Edit" => "Muokkaa", -"New Address Book" => "Uusi osoitekirja", -"Name" => "Nimi", -"Description" => "Kuvaus", -"Save" => "Tallenna", -"Cancel" => "Peru", -"More..." => "Lisää..." -); diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php deleted file mode 100644 index 787843f0f2..0000000000 --- a/apps/contacts/l10n/fr.php +++ /dev/null @@ -1,229 +0,0 @@ - "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses.", -"id is not set." => "L'ID n'est pas défini.", -"Cannot update addressbook with an empty name." => "Impossible de mettre à jour le carnet d'adresses avec un nom vide.", -"Error updating addressbook." => "Erreur lors de la mise à jour du carnet d'adresses.", -"No ID provided" => "Aucun ID fourni", -"Error setting checksum." => "Erreur lors du paramétrage du hachage.", -"No categories selected for deletion." => "Pas de catégories sélectionnées pour la suppression.", -"No address books found." => "Pas de carnet d'adresses trouvé.", -"No contacts found." => "Aucun contact trouvé.", -"There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.", -"element name is not set." => "Le champ Nom n'est pas défini.", -"Could not parse contact: " => "Impossible de lire le contact :", -"Cannot add empty property." => "Impossible d'ajouter un champ vide.", -"At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.", -"Trying to add duplicate property: " => "Ajout d'une propriété en double:", -"Missing IM parameter." => "Paramètre de Messagerie Instantanée manquants.", -"Unknown IM: " => "Messagerie Instantanée inconnue", -"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.", -"Missing ID" => "ID manquant", -"Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"", -"checksum is not set." => "L'hachage n'est pas défini.", -"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:", -"Something went FUBAR. " => "Quelque chose est FUBAR.", -"No contact ID was submitted." => "Aucun ID de contact envoyé", -"Error reading contact photo." => "Erreur de lecture de la photo du contact.", -"Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.", -"The loading photo is not valid." => "La photo chargée est invalide.", -"Contact ID is missing." => "L'ID du contact est manquant.", -"No photo path was submitted." => "Le chemin de la photo n'a pas été envoyé.", -"File doesn't exist:" => "Fichier inexistant:", -"Error loading image." => "Erreur lors du chargement de l'image.", -"Error getting contact object." => "Erreur lors de l'obtention de l'objet contact", -"Error getting PHOTO property." => "Erreur lors de l'obtention des propriétés de la photo", -"Error saving contact." => "Erreur de sauvegarde du contact", -"Error resizing image" => "Erreur de redimensionnement de l'image", -"Error cropping image" => "Erreur lors du rognage de l'image", -"Error creating temporary image" => "Erreur de création de l'image temporaire", -"Error finding image: " => "Erreur pour trouver l'image :", -"Error uploading contacts to storage." => "Erreur lors de l'envoi des contacts vers le stockage.", -"There is no error, the file uploaded with success" => "Il n'y a pas d'erreur, le fichier a été envoyé avec succes.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier envoyé dépasse la directive upload_max_filesize dans php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", -"The uploaded file was only partially uploaded" => "Le fichier envoyé n'a été que partiellement envoyé.", -"No file was uploaded" => "Pas de fichier envoyé.", -"Missing a temporary folder" => "Absence de dossier temporaire.", -"Couldn't save temporary image: " => "Impossible de sauvegarder l'image temporaire :", -"Couldn't load temporary image: " => "Impossible de charger l'image temporaire :", -"No file was uploaded. Unknown error" => "Aucun fichier n'a été chargé. Erreur inconnue", -"Contacts" => "Contacts", -"Sorry, this functionality has not been implemented yet" => "Désolé cette fonctionnalité n'a pas encore été implémentée", -"Not implemented" => "Pas encore implémenté", -"Couldn't get a valid address." => "Impossible de trouver une adresse valide.", -"Error" => "Erreur", -"You do not have permission to add contacts to " => "Vous n'avez pas l'autorisation d'ajouter des contacts à", -"Please select one of your own address books." => "Veuillez sélectionner l'un de vos carnets d'adresses.", -"Permission error" => "Erreur de permission", -"This property has to be non-empty." => "Cette valeur ne doit pas être vide", -"Couldn't serialize elements." => "Impossible de sérialiser les éléments.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' a été appelé sans type d'arguments. Merci de rapporter un bug à bugs.owncloud.org", -"Edit name" => "Éditer le nom", -"No files selected for upload." => "Aucun fichiers choisis pour être chargés", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur.", -"Error loading profile picture." => "Erreur pendant le chargement de la photo de profil.", -"Select type" => "Sélectionner un type", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Certains contacts sont marqués pour être supprimés, mais ne le sont pas encore. Veuillez attendre que l'opération se termine.", -"Do you want to merge these address books?" => "Voulez-vous fusionner ces carnets d'adresses ?", -"Result: " => "Résultat :", -" imported, " => "importé,", -" failed." => "échoué.", -"Displayname cannot be empty." => "Le nom d'affichage ne peut pas être vide.", -"Addressbook not found: " => "Carnet d'adresse introuvable : ", -"This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.", -"Contact could not be found." => "Ce contact n'a pu être trouvé.", -"Jabber" => "Jabber", -"AIM" => "Messagerie Instantanée", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Travail", -"Home" => "Domicile", -"Other" => "Autre", -"Mobile" => "Mobile", -"Text" => "Texte", -"Voice" => "Voix", -"Message" => "Message", -"Fax" => "Fax", -"Video" => "Vidéo", -"Pager" => "Bipeur", -"Internet" => "Internet", -"Birthday" => "Anniversaire", -"Business" => "Business", -"Call" => "Appel", -"Clients" => "Clients", -"Deliverer" => "Livreur", -"Holidays" => "Vacances", -"Ideas" => "Idées", -"Journey" => "Trajet", -"Jubilee" => "Jubilé", -"Meeting" => "Rendez-vous", -"Personal" => "Personnel", -"Projects" => "Projets", -"Questions" => "Questions", -"{name}'s Birthday" => "Anniversaire de {name}", -"Contact" => "Contact", -"You do not have the permissions to edit this contact." => "Vous n'avez pas l'autorisation de modifier ce contact.", -"You do not have the permissions to delete this contact." => "Vous n'avez pas l'autorisation de supprimer ce contact.", -"Add Contact" => "Ajouter un Contact", -"Import" => "Importer", -"Settings" => "Paramètres", -"Addressbooks" => "Carnets d'adresses", -"Close" => "Fermer", -"Keyboard shortcuts" => "Raccourcis clavier", -"Navigation" => "Navigation", -"Next contact in list" => "Contact suivant dans la liste", -"Previous contact in list" => "Contact précédent dans la liste", -"Expand/collapse current addressbook" => "Dé/Replier le carnet d'adresses courant", -"Next addressbook" => "Carnet d'adresses suivant", -"Previous addressbook" => "Carnet d'adresses précédent", -"Actions" => "Actions", -"Refresh contacts list" => "Actualiser la liste des contacts", -"Add new contact" => "Ajouter un nouveau contact", -"Add new addressbook" => "Ajouter un nouveau carnet d'adresses", -"Delete current contact" => "Effacer le contact sélectionné", -"Drop photo to upload" => "Glisser une photo pour l'envoi", -"Delete current photo" => "Supprimer la photo actuelle", -"Edit current photo" => "Editer la photo actuelle", -"Upload new photo" => "Envoyer une nouvelle photo", -"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule", -"Edit name details" => "Editer les noms", -"Organization" => "Société", -"Delete" => "Supprimer", -"Nickname" => "Surnom", -"Enter nickname" => "Entrer un surnom", -"Web site" => "Page web", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Allez à la page web", -"dd-mm-yyyy" => "jj-mm-aaaa", -"Groups" => "Groupes", -"Separate groups with commas" => "Séparer les groupes avec des virgules", -"Edit groups" => "Editer les groupes", -"Preferred" => "Préféré", -"Please specify a valid email address." => "Merci d'entrer une adresse e-mail valide.", -"Enter email address" => "Entrer une adresse e-mail", -"Mail to address" => "Envoyer à l'adresse", -"Delete email address" => "Supprimer l'adresse e-mail", -"Enter phone number" => "Entrer un numéro de téléphone", -"Delete phone number" => "Supprimer le numéro de téléphone", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Supprimer la Messagerie Instantanée", -"View on map" => "Voir sur une carte", -"Edit address details" => "Editer les adresses", -"Add notes here." => "Ajouter des notes ici.", -"Add field" => "Ajouter un champ.", -"Phone" => "Téléphone", -"Email" => "E-mail", -"Instant Messaging" => "Messagerie instantanée", -"Address" => "Adresse", -"Note" => "Note", -"Download contact" => "Télécharger le contact", -"Delete contact" => "Supprimer le contact", -"The temporary image has been removed from cache." => "L'image temporaire a été supprimée du cache.", -"Edit address" => "Editer l'adresse", -"Type" => "Type", -"PO Box" => "Boîte postale", -"Street address" => "Adresse postale", -"Street and number" => "Rue et numéro", -"Extended" => "Étendu", -"Apartment number etc." => "Numéro d'appartement, etc.", -"City" => "Ville", -"Region" => "Région", -"E.g. state or province" => "Ex: état ou province", -"Zipcode" => "Code postal", -"Postal code" => "Code postal", -"Country" => "Pays", -"Addressbook" => "Carnet d'adresses", -"Hon. prefixes" => "Préfixe hon.", -"Miss" => "Mlle", -"Ms" => "Mme", -"Mr" => "M.", -"Sir" => "Sir", -"Mrs" => "Mme", -"Dr" => "Dr", -"Given name" => "Prénom", -"Additional names" => "Nom supplémentaires", -"Family name" => "Nom de famille", -"Hon. suffixes" => "Suffixes hon.", -"J.D." => "J.D.", -"M.D." => "Dr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Dr", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importer un fichier de contacts", -"Please choose the addressbook" => "Choisissez le carnet d'adresses SVP", -"create a new addressbook" => "Créer un nouveau carnet d'adresses", -"Name of new addressbook" => "Nom du nouveau carnet d'adresses", -"Importing contacts" => "Importation des contacts", -"You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.", -"Add contact" => "Ajouter un contact", -"Select Address Books" => "Choix du carnet d'adresses", -"Enter name" => "Saisissez le nom", -"Enter description" => "Saisissez une description", -"CardDAV syncing addresses" => "Synchronisation des contacts CardDAV", -"more info" => "Plus d'infos", -"Primary address (Kontact et al)" => "Adresse principale", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Afficher le lien CardDav", -"Show read-only VCF link" => "Afficher les liens VCF en lecture seule", -"Share" => "Partager", -"Download" => "Télécharger", -"Edit" => "Modifier", -"New Address Book" => "Nouveau Carnet d'adresses", -"Name" => "Nom", -"Description" => "Description", -"Save" => "Sauvegarder", -"Cancel" => "Annuler", -"More..." => "Plus…" -); diff --git a/apps/contacts/l10n/gl.php b/apps/contacts/l10n/gl.php deleted file mode 100644 index f25219b22c..0000000000 --- a/apps/contacts/l10n/gl.php +++ /dev/null @@ -1,157 +0,0 @@ - "Produciuse un erro (des)activando a axenda.", -"id is not set." => "non se estableceu o id.", -"Cannot update addressbook with an empty name." => "Non se pode actualizar a libreta de enderezos sen completar o nome.", -"Error updating addressbook." => "Produciuse un erro actualizando a axenda.", -"No ID provided" => "Non se proveeu ID", -"Error setting checksum." => "Erro establecendo a suma de verificación", -"No categories selected for deletion." => "Non se seleccionaron categorías para borrado.", -"No address books found." => "Non se atoparon libretas de enderezos.", -"No contacts found." => "Non se atoparon contactos.", -"There was an error adding the contact." => "Produciuse un erro engadindo o contacto.", -"element name is not set." => "non se nomeou o elemento.", -"Cannot add empty property." => "Non se pode engadir unha propiedade baleira.", -"At least one of the address fields has to be filled out." => "Polo menos un dos campos do enderezo ten que ser cuberto.", -"Trying to add duplicate property: " => "Tentando engadir propiedade duplicada: ", -"Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina.", -"Missing ID" => "ID perdido", -"Error parsing VCard for ID: \"" => "Erro procesando a VCard para o ID: \"", -"checksum is not set." => "non se estableceu a suma de verificación.", -"Information about vCard is incorrect. Please reload the page: " => "A información sobre a vCard é incorrecta. Por favor, recargue a páxina: ", -"No contact ID was submitted." => "Non se enviou ningún ID de contacto.", -"Error reading contact photo." => "Erro lendo a fotografía do contacto.", -"Error saving temporary file." => "Erro gardando o ficheiro temporal.", -"The loading photo is not valid." => "A fotografía cargada non é válida.", -"Contact ID is missing." => "Falta o ID do contacto.", -"No photo path was submitted." => "Non se enviou a ruta a unha foto.", -"File doesn't exist:" => "O ficheiro non existe:", -"Error loading image." => "Erro cargando imaxe.", -"Error getting contact object." => "Erro obtendo o obxeto contacto.", -"Error getting PHOTO property." => "Erro obtendo a propiedade PHOTO.", -"Error saving contact." => "Erro gardando o contacto.", -"Error resizing image" => "Erro cambiando o tamaño da imaxe", -"Error cropping image" => "Erro recortando a imaxe", -"Error creating temporary image" => "Erro creando a imaxe temporal", -"Error finding image: " => "Erro buscando a imaxe: ", -"Error uploading contacts to storage." => "Erro subindo os contactos ao almacén.", -"There is no error, the file uploaded with success" => "Non houbo erros, o ficheiro subeuse con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O ficheiro subido supera a directiva upload_max_filesize no php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro subido supera a directiva MAX_FILE_SIZE especificada no formulario HTML", -"The uploaded file was only partially uploaded" => "O ficheiro so foi parcialmente subido", -"No file was uploaded" => "Non se subeu ningún ficheiro", -"Missing a temporary folder" => "Falta o cartafol temporal", -"Couldn't save temporary image: " => "Non se puido gardar a imaxe temporal: ", -"Couldn't load temporary image: " => "Non se puido cargar a imaxe temporal: ", -"No file was uploaded. Unknown error" => "Non se subeu ningún ficheiro. Erro descoñecido.", -"Contacts" => "Contactos", -"Sorry, this functionality has not been implemented yet" => "Sentímolo, esta función aínda non foi implementada.", -"Not implemented" => "Non implementada.", -"Couldn't get a valid address." => "Non se puido obter un enderezo de correo válido.", -"Error" => "Erro", -"This property has to be non-empty." => "Esta propiedade non pode quedar baldeira.", -"Couldn't serialize elements." => "Non se puido serializar os elementos.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamado sen argumento. Por favor, informe en bugs.owncloud.org", -"Edit name" => "Editar nome", -"No files selected for upload." => "Sen ficheiros escollidos para subir.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O ficheiro que tenta subir supera o tamaño máximo permitido neste servidor.", -"Select type" => "Seleccione tipo", -"Result: " => "Resultado: ", -" imported, " => " importado, ", -" failed." => " fallou.", -"This is not your addressbook." => "Esta non é a súa axenda.", -"Contact could not be found." => "Non se atopou o contacto.", -"Work" => "Traballo", -"Home" => "Casa", -"Mobile" => "Móbil", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensaxe", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Paxinador", -"Internet" => "Internet", -"Birthday" => "Aniversario", -"{name}'s Birthday" => "Cumpleanos de {name}", -"Contact" => "Contacto", -"Add Contact" => "Engadir contacto", -"Import" => "Importar", -"Addressbooks" => "Axendas", -"Close" => "Pechar", -"Drop photo to upload" => "Solte a foto a subir", -"Delete current photo" => "Borrar foto actual", -"Edit current photo" => "Editar a foto actual", -"Upload new photo" => "Subir unha nova foto", -"Select photo from ownCloud" => "Escoller foto desde ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome corto, Nome completo, Inverso ou Inverso con coma", -"Edit name details" => "Editar detalles do nome", -"Organization" => "Organización", -"Delete" => "Eliminar", -"Nickname" => "Apodo", -"Enter nickname" => "Introuza apodo", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grupos", -"Separate groups with commas" => "Separe grupos con comas", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor indique un enderezo de correo electrónico válido.", -"Enter email address" => "Introduza enderezo de correo electrónico", -"Mail to address" => "Correo ao enderezo", -"Delete email address" => "Borrar enderezo de correo electrónico", -"Enter phone number" => "Introducir número de teléfono", -"Delete phone number" => "Borrar número de teléfono", -"View on map" => "Ver no mapa", -"Edit address details" => "Editar detalles do enderezo", -"Add notes here." => "Engadir aquí as notas.", -"Add field" => "Engadir campo", -"Phone" => "Teléfono", -"Email" => "Correo electrónico", -"Address" => "Enderezo", -"Note" => "Nota", -"Download contact" => "Descargar contacto", -"Delete contact" => "Borrar contacto", -"The temporary image has been removed from cache." => "A imaxe temporal foi eliminada da caché.", -"Edit address" => "Editar enderezo", -"Type" => "Escribir", -"PO Box" => "Apartado de correos", -"Extended" => "Ampliado", -"City" => "Cidade", -"Region" => "Autonomía", -"Zipcode" => "Código postal", -"Country" => "País", -"Addressbook" => "Axenda", -"Hon. prefixes" => "Prefixos honoríficos", -"Miss" => "Srta", -"Ms" => "Sra/Srta", -"Mr" => "Sr", -"Sir" => "Sir", -"Mrs" => "Sra", -"Dr" => "Dr", -"Given name" => "Apodo", -"Additional names" => "Nomes adicionais", -"Family name" => "Nome familiar", -"Hon. suffixes" => "Sufixos honorarios", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importar un ficheiro de contactos", -"Please choose the addressbook" => "Por favor escolla unha libreta de enderezos", -"create a new addressbook" => "crear unha nova libreta de enderezos", -"Name of new addressbook" => "Nome da nova libreta de enderezos", -"Importing contacts" => "Importando contactos", -"You have no contacts in your addressbook." => "Non ten contactos na súa libreta de enderezos.", -"Add contact" => "Engadir contacto", -"CardDAV syncing addresses" => "Enderezos CardDAV a sincronizar", -"more info" => "máis información", -"Primary address (Kontact et al)" => "Enderezo primario (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Download" => "Descargar", -"Edit" => "Editar", -"New Address Book" => "Nova axenda", -"Save" => "Gardar", -"Cancel" => "Cancelar" -); diff --git a/apps/contacts/l10n/he.php b/apps/contacts/l10n/he.php deleted file mode 100644 index b224403ad2..0000000000 --- a/apps/contacts/l10n/he.php +++ /dev/null @@ -1,135 +0,0 @@ - "שגיאה בהפעלה או בנטרול פנקס הכתובות.", -"id is not set." => "מספר מזהה לא נקבע.", -"Cannot update addressbook with an empty name." => "אי אפשר לעדכן ספר כתובות ללא שם", -"Error updating addressbook." => "שגיאה בעדכון פנקס הכתובות.", -"No ID provided" => "לא צוין מזהה", -"Error setting checksum." => "שגיאה בהגדרת נתוני הביקורת.", -"No categories selected for deletion." => "לא נבחור קטגוריות למחיקה.", -"No address books found." => "לא נמצאו פנקסי כתובות.", -"No contacts found." => "לא נמצאו אנשי קשר.", -"There was an error adding the contact." => "אירעה שגיאה בעת הוספת איש הקשר.", -"element name is not set." => "שם האלמנט לא נקבע.", -"Cannot add empty property." => "לא ניתן להוסיף מאפיין ריק.", -"At least one of the address fields has to be filled out." => "יש למלא לפחות אחד משדות הכתובת.", -"Trying to add duplicate property: " => "ניסיון להוספת מאפיין כפול: ", -"Information about vCard is incorrect. Please reload the page." => "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף.", -"Missing ID" => "מזהה חסר", -"Error parsing VCard for ID: \"" => "שגיאה בפענוח ה VCard עבור מספר המזהה: \"", -"checksum is not set." => "סיכום ביקורת לא נקבע.", -"Information about vCard is incorrect. Please reload the page: " => "המידע עבור ה vCard אינו נכון. אנא טען את העמוד: ", -"Something went FUBAR. " => "משהו לא התנהל כצפוי.", -"No contact ID was submitted." => "מספר מזהה של אישר הקשר לא נשלח.", -"Error reading contact photo." => "שגיאה בקריאת תמונת איש הקשר.", -"Error saving temporary file." => "שגיאה בשמירת קובץ זמני.", -"The loading photo is not valid." => "התמונה הנטענת אינה תקנית.", -"Contact ID is missing." => "מספר מזהה של אישר הקשר חסר.", -"No photo path was submitted." => "כתובת התמונה לא נשלחה", -"File doesn't exist:" => "קובץ לא קיים:", -"Error loading image." => "שגיאה בטעינת התמונה.", -"Error getting contact object." => "שגיאה בקבלת אוביאקט איש הקשר", -"Error getting PHOTO property." => "שגיאה בקבלת מידע של תמונה", -"Error saving contact." => "שגיאה בשמירת איש הקשר", -"Error resizing image" => "שגיאה בשינוי גודל התמונה", -"Error uploading contacts to storage." => "התרשה שגיאה בהעלאת אנשי הקשר לאכסון.", -"There is no error, the file uploaded with success" => "לא התרחשה שגיאה, הקובץ הועלה בהצלחה", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "גודל הקובץ שהועלה גדול מהערך upload_max_filesize שמוגדר בקובץ php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "הקובץ שהועלה גדוך מהערך MAX_FILE_SIZE שהוגדר בתופס HTML", -"The uploaded file was only partially uploaded" => "הקובץ הועלה באופן חלקי בלבד", -"No file was uploaded" => "שום קובץ לא הועלה", -"Missing a temporary folder" => "תקיה זמנית חסרה", -"Contacts" => "אנשי קשר", -"This is not your addressbook." => "זהו אינו ספר הכתובות שלך", -"Contact could not be found." => "לא ניתן לאתר איש קשר", -"Work" => "עבודה", -"Home" => "בית", -"Mobile" => "נייד", -"Text" => "טקסט", -"Voice" => "קולי", -"Message" => "הודעה", -"Fax" => "פקס", -"Video" => "וידאו", -"Pager" => "זימונית", -"Internet" => "אינטרנט", -"Birthday" => "יום הולדת", -"{name}'s Birthday" => "יום ההולדת של {name}", -"Contact" => "איש קשר", -"Add Contact" => "הוספת איש קשר", -"Import" => "יבא", -"Addressbooks" => "פנקסי כתובות", -"Drop photo to upload" => "גרור ושחרר תמונה בשביל להעלות", -"Delete current photo" => "מחק תמונה נוכחית", -"Edit current photo" => "ערוך תמונה נוכחית", -"Upload new photo" => "העלה תמונה חדשה", -"Select photo from ownCloud" => "בחר תמונה מ ownCloud", -"Edit name details" => "ערוך פרטי שם", -"Organization" => "ארגון", -"Delete" => "מחיקה", -"Nickname" => "כינוי", -"Enter nickname" => "הכנס כינוי", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "קבוצות", -"Separate groups with commas" => "הפרד קבוצות עם פסיקים", -"Edit groups" => "ערוך קבוצות", -"Preferred" => "מועדף", -"Please specify a valid email address." => "אנא הזן כתובת דוא\"ל חוקית", -"Enter email address" => "הזן כתובת דוא\"ל", -"Mail to address" => "כתובת", -"Delete email address" => "מחק כתובת דוא\"ל", -"Enter phone number" => "הכנס מספר טלפון", -"Delete phone number" => "מחק מספר טלפון", -"View on map" => "ראה במפה", -"Edit address details" => "ערוך פרטי כתובת", -"Add notes here." => "הוסף הערות כאן.", -"Add field" => "הוסף שדה", -"Phone" => "טלפון", -"Email" => "דואר אלקטרוני", -"Address" => "כתובת", -"Note" => "הערה", -"Download contact" => "הורדת איש קשר", -"Delete contact" => "מחיקת איש קשר", -"Edit address" => "ערוך כתובת", -"Type" => "סוג", -"PO Box" => "תא דואר", -"Extended" => "מורחב", -"City" => "עיר", -"Region" => "אזור", -"Zipcode" => "מיקוד", -"Country" => "מדינה", -"Addressbook" => "פנקס כתובות", -"Hon. prefixes" => "קידומות שם", -"Miss" => "גב'", -"Ms" => "גב'", -"Mr" => "מר'", -"Sir" => "אדון", -"Mrs" => "גב'", -"Dr" => "ד\"ר", -"Given name" => "שם", -"Additional names" => "שמות נוספים", -"Family name" => "שם משפחה", -"Hon. suffixes" => "סיומות שם", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "יבא קובץ אנשי קשר", -"Please choose the addressbook" => "אנא בחר ספר כתובות", -"create a new addressbook" => "צור ספר כתובות חדש", -"Name of new addressbook" => "שם ספר כתובות החדש", -"Importing contacts" => "מיבא אנשי קשר", -"You have no contacts in your addressbook." => "איך לך אנשי קשר בספר הכתובות", -"Add contact" => "הוסף איש קשר", -"CardDAV syncing addresses" => "CardDAV מסנכרן כתובות", -"more info" => "מידע נוסף", -"Primary address (Kontact et al)" => "כתובת ראשית", -"iOS/OS X" => "iOS/OS X", -"Download" => "הורדה", -"Edit" => "עריכה", -"New Address Book" => "פנקס כתובות חדש", -"Save" => "שמירה", -"Cancel" => "ביטול" -); diff --git a/apps/contacts/l10n/hr.php b/apps/contacts/l10n/hr.php deleted file mode 100644 index 769a6ced0f..0000000000 --- a/apps/contacts/l10n/hr.php +++ /dev/null @@ -1,93 +0,0 @@ - "Pogreška pri (de)aktivaciji adresara.", -"id is not set." => "id nije postavljen.", -"Cannot update addressbook with an empty name." => "Ne mogu ažurirati adresar sa praznim nazivom.", -"Error updating addressbook." => "Pogreška pri ažuriranju adresara.", -"No ID provided" => "Nema dodijeljenog ID identifikatora", -"Error setting checksum." => "Pogreška pri postavljanju checksuma.", -"No categories selected for deletion." => "Niti jedna kategorija nije odabrana za brisanje.", -"No address books found." => "Nema adresara.", -"No contacts found." => "Nema kontakata.", -"There was an error adding the contact." => "Dogodila se pogreška prilikom dodavanja kontakta.", -"element name is not set." => "naziv elementa nije postavljen.", -"Cannot add empty property." => "Prazno svojstvo se ne može dodati.", -"At least one of the address fields has to be filled out." => "Morate ispuniti barem jedno od adresnih polja.", -"Trying to add duplicate property: " => "Pokušali ste dodati duplo svojstvo:", -"Information about vCard is incorrect. Please reload the page." => "Informacija o vCard je neispravna. Osvježite stranicu.", -"Missing ID" => "Nedostupan ID identifikator", -"Error parsing VCard for ID: \"" => "Pogreška pri raščlanjivanju VCard za ID:", -"checksum is not set." => "checksum nije postavljen.", -"Information about vCard is incorrect. Please reload the page: " => "Informacije o VCard su pogrešne. Molimo, učitajte ponovno stranicu:", -"Something went FUBAR. " => "Nešto je otišlo... krivo...", -"No contact ID was submitted." => "ID kontakta nije podnešen.", -"Error reading contact photo." => "Pogreška pri čitanju kontakt fotografije.", -"Error saving temporary file." => "Pogreška pri spremanju privremene datoteke.", -"The loading photo is not valid." => "Fotografija nije valjana.", -"Contact ID is missing." => "ID kontakta nije dostupan.", -"No photo path was submitted." => "Putanja do fotografije nije podnešena.", -"File doesn't exist:" => "Datoteka ne postoji:", -"Error loading image." => "Pogreška pri učitavanju slike.", -"Error uploading contacts to storage." => "Pogreška pri slanju kontakata.", -"There is no error, the file uploaded with success" => "Nema pogreške, datoteka je poslana uspješno.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Veličina poslane datoteke prelazi veličinu prikazanu u upload_max_filesize direktivi u konfiguracijskoj datoteci php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslana datoteka prelazi veličinu prikazanu u MAX_FILE_SIZE direktivi u HTML formi", -"The uploaded file was only partially uploaded" => "Poslana datoteka je parcijalno poslana", -"No file was uploaded" => "Datoteka nije poslana", -"Missing a temporary folder" => "Nedostaje privremeni direktorij", -"Contacts" => "Kontakti", -"This is not your addressbook." => "Ovo nije vaš adresar.", -"Contact could not be found." => "Kontakt ne postoji.", -"Work" => "Posao", -"Home" => "Kuća", -"Mobile" => "Mobitel", -"Text" => "Tekst", -"Voice" => "Glasovno", -"Message" => "Poruka", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Rođendan", -"{name}'s Birthday" => "{name} Rođendan", -"Contact" => "Kontakt", -"Add Contact" => "Dodaj kontakt", -"Import" => "Uvezi", -"Addressbooks" => "Adresari", -"Drop photo to upload" => "Dovucite fotografiju za slanje", -"Edit current photo" => "Uredi trenutnu sliku", -"Edit name details" => "Uredi detalje imena", -"Organization" => "Organizacija", -"Delete" => "Obriši", -"Nickname" => "Nadimak", -"Enter nickname" => "Unesi nadimank", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grupe", -"Edit groups" => "Uredi grupe", -"Preferred" => "Preferirano", -"Enter email address" => "Unesi email adresu", -"Enter phone number" => "Unesi broj telefona", -"View on map" => "Prikaži na karti", -"Edit address details" => "Uredi detalje adrese", -"Add notes here." => "Dodaj bilješke ovdje.", -"Add field" => "Dodaj polje", -"Phone" => "Telefon", -"Email" => "E-mail", -"Address" => "Adresa", -"Note" => "Bilješka", -"Download contact" => "Preuzmi kontakt", -"Delete contact" => "Izbriši kontakt", -"Edit address" => "Uredi adresu", -"Type" => "Tip", -"PO Box" => "Poštanski Pretinac", -"Extended" => "Prošireno", -"City" => "Grad", -"Region" => "Regija", -"Zipcode" => "Poštanski broj", -"Country" => "Država", -"Addressbook" => "Adresar", -"Download" => "Preuzimanje", -"Edit" => "Uredi", -"New Address Book" => "Novi adresar", -"Save" => "Spremi", -"Cancel" => "Prekini" -); diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php deleted file mode 100644 index 4febe9c29f..0000000000 --- a/apps/contacts/l10n/hu_HU.php +++ /dev/null @@ -1,158 +0,0 @@ - "Címlista (de)aktiválása sikertelen", -"id is not set." => "ID nincs beállítva", -"Cannot update addressbook with an empty name." => "Üres névvel nem frissíthető a címlista", -"Error updating addressbook." => "Hiba a címlista frissítésekor", -"No ID provided" => "Nincs ID megadva", -"Error setting checksum." => "Hiba az ellenőrzőösszeg beállításakor", -"No categories selected for deletion." => "Nincs kiválasztva törlendő kategória", -"No address books found." => "Nem található címlista", -"No contacts found." => "Nem található kontakt", -"There was an error adding the contact." => "Hiba a kapcsolat hozzáadásakor", -"element name is not set." => "az elem neve nincs beállítva", -"Cannot add empty property." => "Nem adható hozzá üres tulajdonság", -"At least one of the address fields has to be filled out." => "Legalább egy címmező kitöltendő", -"Trying to add duplicate property: " => "Kísérlet dupla tulajdonság hozzáadására: ", -"Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.", -"Missing ID" => "Hiányzó ID", -"Error parsing VCard for ID: \"" => "VCard elemzése sikertelen a következő ID-hoz: \"", -"checksum is not set." => "az ellenőrzőösszeg nincs beállítva", -"Information about vCard is incorrect. Please reload the page: " => "Helytelen információ a vCardról. Töltse újra az oldalt: ", -"Something went FUBAR. " => "Valami balul sült el.", -"No contact ID was submitted." => "Nincs ID megadva a kontakthoz", -"Error reading contact photo." => "A kontakt képének beolvasása sikertelen", -"Error saving temporary file." => "Ideiglenes fájl mentése sikertelen", -"The loading photo is not valid." => "A kép érvénytelen", -"Contact ID is missing." => "Hiányzik a kapcsolat ID", -"No photo path was submitted." => "Nincs fénykép-útvonal megadva", -"File doesn't exist:" => "A fájl nem létezik:", -"Error loading image." => "Kép betöltése sikertelen", -"Error getting contact object." => "A kontakt-objektum feldolgozása sikertelen", -"Error getting PHOTO property." => "A PHOTO-tulajdonság feldolgozása sikertelen", -"Error saving contact." => "A kontakt mentése sikertelen", -"Error resizing image" => "Képméretezés sikertelen", -"Error cropping image" => "Képvágás sikertelen", -"Error creating temporary image" => "Ideiglenes kép létrehozása sikertelen", -"Error finding image: " => "A kép nem található", -"Error uploading contacts to storage." => "Hiba a kapcsolatok feltöltésekor", -"There is no error, the file uploaded with success" => "Nincs hiba, a fájl sikeresen feltöltődött", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött fájl mérete meghaladja az upload_max_filesize értéket a php.ini-ben", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "A feltöltött fájl mérete meghaladja a HTML form-ban megadott MAX_FILE_SIZE értéket", -"The uploaded file was only partially uploaded" => "A fájl csak részlegesen lett feltöltve", -"No file was uploaded" => "Nincs feltöltött fájl", -"Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár", -"Couldn't save temporary image: " => "Ideiglenes kép létrehozása sikertelen", -"Couldn't load temporary image: " => "Ideiglenes kép betöltése sikertelen", -"No file was uploaded. Unknown error" => "Nem történt feltöltés. Ismeretlen hiba", -"Contacts" => "Kapcsolatok", -"Sorry, this functionality has not been implemented yet" => "Sajnáljuk, ez a funkció még nem támogatott", -"Not implemented" => "Nem támogatott", -"Couldn't get a valid address." => "Érvényes cím lekérése sikertelen", -"Error" => "Hiba", -"This property has to be non-empty." => "Ezt a tulajdonságot muszáj kitölteni", -"Couldn't serialize elements." => "Sorbarakás sikertelen", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "A 'deleteProperty' argumentum nélkül lett meghívva. Kérjük, jelezze a hibát.", -"Edit name" => "Név szerkesztése", -"No files selected for upload." => "Nincs kiválasztva feltöltendő fájl", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "A feltöltendő fájl mérete meghaladja a megengedett mértéket", -"Select type" => "Típus kiválasztása", -"Result: " => "Eredmény: ", -" imported, " => " beimportálva, ", -" failed." => " sikertelen", -"This is not your addressbook." => "Ez nem a te címjegyzéked.", -"Contact could not be found." => "Kapcsolat nem található.", -"Work" => "Munkahelyi", -"Home" => "Otthoni", -"Mobile" => "Mobiltelefonszám", -"Text" => "Szöveg", -"Voice" => "Hang", -"Message" => "Üzenet", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Személyhívó", -"Internet" => "Internet", -"Birthday" => "Születésnap", -"{name}'s Birthday" => "{name} születésnapja", -"Contact" => "Kapcsolat", -"Add Contact" => "Kapcsolat hozzáadása", -"Import" => "Import", -"Addressbooks" => "Címlisták", -"Close" => "Bezár", -"Drop photo to upload" => "Húzza ide a feltöltendő képet", -"Delete current photo" => "Aktuális kép törlése", -"Edit current photo" => "Aktuális kép szerkesztése", -"Upload new photo" => "Új kép feltöltése", -"Select photo from ownCloud" => "Kép kiválasztása ownCloud-ból", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel", -"Edit name details" => "Név részleteinek szerkesztése", -"Organization" => "Szervezet", -"Delete" => "Törlés", -"Nickname" => "Becenév", -"Enter nickname" => "Becenév megadása", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Csoportok", -"Separate groups with commas" => "Vesszővel válassza el a csoportokat", -"Edit groups" => "Csoportok szerkesztése", -"Preferred" => "Előnyben részesített", -"Please specify a valid email address." => "Adjon meg érvényes email címet", -"Enter email address" => "Adja meg az email címet", -"Mail to address" => "Postai cím", -"Delete email address" => "Email cím törlése", -"Enter phone number" => "Adja meg a telefonszámot", -"Delete phone number" => "Telefonszám törlése", -"View on map" => "Megtekintés a térképen", -"Edit address details" => "Cím részleteinek szerkesztése", -"Add notes here." => "Megjegyzések", -"Add field" => "Mező hozzáadása", -"Phone" => "Telefonszám", -"Email" => "E-mail", -"Address" => "Cím", -"Note" => "Jegyzet", -"Download contact" => "Kapcsolat letöltése", -"Delete contact" => "Kapcsolat törlése", -"The temporary image has been removed from cache." => "Az ideiglenes kép el lett távolítva a gyorsítótárból", -"Edit address" => "Cím szerkesztése", -"Type" => "Típus", -"PO Box" => "Postafiók", -"Extended" => "Kiterjesztett", -"City" => "Város", -"Region" => "Megye", -"Zipcode" => "Irányítószám", -"Country" => "Ország", -"Addressbook" => "Címlista", -"Hon. prefixes" => "Előtag", -"Miss" => "Miss", -"Ms" => "Ms", -"Mr" => "Mr", -"Sir" => "Sir", -"Mrs" => "Mrs", -"Dr" => "Dr.", -"Given name" => "Teljes név", -"Additional names" => "További nevek", -"Family name" => "Családnév", -"Hon. suffixes" => "Utótag", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Ifj.", -"Sn." => "Id.", -"Import a contacts file" => "Kapcsolat-fájl importálása", -"Please choose the addressbook" => "Válassza ki a címlistát", -"create a new addressbook" => "Címlista létrehozása", -"Name of new addressbook" => "Új címlista neve", -"Importing contacts" => "Kapcsolatok importálása", -"You have no contacts in your addressbook." => "Nincsenek kapcsolatok a címlistában", -"Add contact" => "Kapcsolat hozzáadása", -"CardDAV syncing addresses" => "CardDAV szinkronizációs címek", -"more info" => "további információ", -"Primary address (Kontact et al)" => "Elsődleges cím", -"iOS/OS X" => "iOS/OS X", -"Download" => "Letöltés", -"Edit" => "Szerkesztés", -"New Address Book" => "Új címlista", -"Save" => "Mentés", -"Cancel" => "Mégsem" -); diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php deleted file mode 100644 index 338ceb7154..0000000000 --- a/apps/contacts/l10n/ia.php +++ /dev/null @@ -1,81 +0,0 @@ - "Nulle adressario trovate", -"No contacts found." => "Nulle contactos trovate.", -"Cannot add empty property." => "Non pote adder proprietate vacue.", -"Error saving temporary file." => "Error durante le scriptura in le file temporari", -"Error loading image." => "Il habeva un error durante le cargamento del imagine.", -"No file was uploaded" => "Nulle file esseva incargate.", -"Missing a temporary folder" => "Manca un dossier temporari", -"Contacts" => "Contactos", -"This is not your addressbook." => "Iste non es tu libro de adresses", -"Contact could not be found." => "Contacto non poterea esser legite", -"Work" => "Travalio", -"Home" => "Domo", -"Mobile" => "Mobile", -"Text" => "Texto", -"Voice" => "Voce", -"Message" => "Message", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Anniversario", -"Contact" => "Contacto", -"Add Contact" => "Adder contacto", -"Import" => "Importar", -"Addressbooks" => "Adressarios", -"Delete current photo" => "Deler photo currente", -"Edit current photo" => "Modificar photo currente", -"Upload new photo" => "Incargar nove photo", -"Select photo from ownCloud" => "Seliger photo ex ownCloud", -"Organization" => "Organisation", -"Delete" => "Deler", -"Nickname" => "Pseudonymo", -"Enter nickname" => "Inserer pseudonymo", -"Groups" => "Gruppos", -"Edit groups" => "Modificar gruppos", -"Preferred" => "Preferite", -"Enter email address" => "Entrar un adresse de e-posta", -"Delete email address" => "Deler adresse de E-posta", -"Enter phone number" => "Entrar un numero de telephono", -"Delete phone number" => "Deler numero de telephono", -"View on map" => "Vider in un carta", -"Add notes here." => "Adder notas hic", -"Add field" => "Adder campo", -"Phone" => "Phono", -"Email" => "E-posta", -"Address" => "Adresse", -"Note" => "Nota", -"Download contact" => "Discargar contacto", -"Delete contact" => "Deler contacto", -"Edit address" => "Modificar adresses", -"Type" => "Typo", -"PO Box" => "Cassa postal", -"Extended" => "Extendite", -"City" => "Citate", -"Region" => "Region", -"Zipcode" => "Codice postal", -"Country" => "Pais", -"Addressbook" => "Adressario", -"Hon. prefixes" => "Prefixos honorific", -"Miss" => "Senioretta", -"Mr" => "Sr.", -"Mrs" => "Sra.", -"Dr" => "Dr.", -"Given name" => "Nomine date", -"Additional names" => "Nomines additional", -"Family name" => "Nomine de familia", -"Hon. suffixes" => "Suffixos honorific", -"Import a contacts file" => "Importar un file de contactos", -"Please choose the addressbook" => "Per favor selige le adressario", -"create a new addressbook" => "Crear un nove adressario", -"Name of new addressbook" => "Nomine del nove gruppo:", -"Add contact" => "Adder adressario", -"more info" => "plus info", -"iOS/OS X" => "iOS/OS X", -"Download" => "Discargar", -"Edit" => "Modificar", -"New Address Book" => "Nove adressario", -"Save" => "Salveguardar", -"Cancel" => "Cancellar" -); diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php deleted file mode 100644 index 1f0e2e3955..0000000000 --- a/apps/contacts/l10n/it.php +++ /dev/null @@ -1,229 +0,0 @@ - "Errore nel (dis)attivare la rubrica.", -"id is not set." => "ID non impostato.", -"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.", -"Error updating addressbook." => "Errore durante l'aggiornamento della rubrica.", -"No ID provided" => "Nessun ID fornito", -"Error setting checksum." => "Errore di impostazione del codice di controllo.", -"No categories selected for deletion." => "Nessuna categoria selezionata per l'eliminazione.", -"No address books found." => "Nessuna rubrica trovata.", -"No contacts found." => "Nessun contatto trovato.", -"There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.", -"element name is not set." => "il nome dell'elemento non è impostato.", -"Could not parse contact: " => "Impossibile elaborare il contatto: ", -"Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.", -"At least one of the address fields has to be filled out." => "Deve essere inserito almeno un indirizzo.", -"Trying to add duplicate property: " => "P", -"Missing IM parameter." => "Parametro IM mancante.", -"Unknown IM: " => "IM sconosciuto:", -"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.", -"Missing ID" => "ID mancante", -"Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"", -"checksum is not set." => "il codice di controllo non è impostato.", -"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ", -"Something went FUBAR. " => "Qualcosa è andato storto. ", -"No contact ID was submitted." => "Nessun ID di contatto inviato.", -"Error reading contact photo." => "Errore di lettura della foto del contatto.", -"Error saving temporary file." => "Errore di salvataggio del file temporaneo.", -"The loading photo is not valid." => "La foto caricata non è valida.", -"Contact ID is missing." => "Manca l'ID del contatto.", -"No photo path was submitted." => "Non è stato inviato alcun percorso a una foto.", -"File doesn't exist:" => "Il file non esiste:", -"Error loading image." => "Errore di caricamento immagine.", -"Error getting contact object." => "Errore di recupero dell'oggetto contatto.", -"Error getting PHOTO property." => "Errore di recupero della proprietà FOTO.", -"Error saving contact." => "Errore di salvataggio del contatto.", -"Error resizing image" => "Errore di ridimensionamento dell'immagine", -"Error cropping image" => "Errore di ritaglio dell'immagine", -"Error creating temporary image" => "Errore durante la creazione dell'immagine temporanea", -"Error finding image: " => "Errore durante la ricerca dell'immagine: ", -"Error uploading contacts to storage." => "Errore di invio dei contatti in archivio.", -"There is no error, the file uploaded with success" => "Non ci sono errori, il file è stato inviato correttamente", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file inviato supera la direttiva upload_max_filesize nel php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", -"The uploaded file was only partially uploaded" => "Il file è stato inviato solo parzialmente", -"No file was uploaded" => "Nessun file è stato inviato", -"Missing a temporary folder" => "Manca una cartella temporanea", -"Couldn't save temporary image: " => "Impossibile salvare l'immagine temporanea: ", -"Couldn't load temporary image: " => "Impossibile caricare l'immagine temporanea: ", -"No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto", -"Contacts" => "Contatti", -"Sorry, this functionality has not been implemented yet" => "Siamo spiacenti, questa funzionalità non è stata ancora implementata", -"Not implemented" => "Non implementata", -"Couldn't get a valid address." => "Impossibile ottenere un indirizzo valido.", -"Error" => "Errore", -"You do not have permission to add contacts to " => "Non hai i permessi per aggiungere contatti a", -"Please select one of your own address books." => "Seleziona una delle tue rubriche.", -"Permission error" => "Errore relativo ai permessi", -"This property has to be non-empty." => "Questa proprietà non può essere vuota.", -"Couldn't serialize elements." => "Impossibile serializzare gli elementi.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org", -"Edit name" => "Modifica il nome", -"No files selected for upload." => "Nessun file selezionato per l'invio", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server.", -"Error loading profile picture." => "Errore durante il caricamento dell'immagine di profilo.", -"Select type" => "Seleziona il tipo", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alcuni contatti sono marcati per l'eliminazione, ma non sono stati ancora rimossi. Attendi fino al completamento dell'operazione.", -"Do you want to merge these address books?" => "Vuoi unire queste rubriche?", -"Result: " => "Risultato: ", -" imported, " => " importato, ", -" failed." => " non riuscito.", -"Displayname cannot be empty." => "Il nome visualizzato non può essere vuoto.", -"Addressbook not found: " => "Rubrica non trovata:", -"This is not your addressbook." => "Questa non è la tua rubrica.", -"Contact could not be found." => "Il contatto non può essere trovato.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Lavoro", -"Home" => "Casa", -"Other" => "Altro", -"Mobile" => "Cellulare", -"Text" => "Testo", -"Voice" => "Voce", -"Message" => "Messaggio", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Cercapersone", -"Internet" => "Internet", -"Birthday" => "Compleanno", -"Business" => "Lavoro", -"Call" => "Chiama", -"Clients" => "Client", -"Deliverer" => "Corriere", -"Holidays" => "Festività", -"Ideas" => "Idee", -"Journey" => "Viaggio", -"Jubilee" => "Anniversario", -"Meeting" => "Riunione", -"Personal" => "Personale", -"Projects" => "Progetti", -"Questions" => "Domande", -"{name}'s Birthday" => "Data di nascita di {name}", -"Contact" => "Contatto", -"You do not have the permissions to edit this contact." => "Non hai i permessi per modificare questo contatto.", -"You do not have the permissions to delete this contact." => "Non hai i permessi per eliminare questo contatto.", -"Add Contact" => "Aggiungi contatto", -"Import" => "Importa", -"Settings" => "Impostazioni", -"Addressbooks" => "Rubriche", -"Close" => "Chiudi", -"Keyboard shortcuts" => "Scorciatoie da tastiera", -"Navigation" => "Navigazione", -"Next contact in list" => "Contatto successivo in elenco", -"Previous contact in list" => "Contatto precedente in elenco", -"Expand/collapse current addressbook" => "Espandi/Contrai la rubrica corrente", -"Next addressbook" => "Rubrica successiva", -"Previous addressbook" => "Rubrica precedente", -"Actions" => "Azioni", -"Refresh contacts list" => "Aggiorna l'elenco dei contatti", -"Add new contact" => "Aggiungi un nuovo contatto", -"Add new addressbook" => "Aggiungi una nuova rubrica", -"Delete current contact" => "Elimina il contatto corrente", -"Drop photo to upload" => "Rilascia una foto da inviare", -"Delete current photo" => "Elimina la foto corrente", -"Edit current photo" => "Modifica la foto corrente", -"Upload new photo" => "Invia una nuova foto", -"Select photo from ownCloud" => "Seleziona la foto da ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola", -"Edit name details" => "Modifica dettagli del nome", -"Organization" => "Organizzazione", -"Delete" => "Elimina", -"Nickname" => "Pseudonimo", -"Enter nickname" => "Inserisci pseudonimo", -"Web site" => "Sito web", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Vai al sito web", -"dd-mm-yyyy" => "gg-mm-aaaa", -"Groups" => "Gruppi", -"Separate groups with commas" => "Separa i gruppi con virgole", -"Edit groups" => "Modifica gruppi", -"Preferred" => "Preferito", -"Please specify a valid email address." => "Specifica un indirizzo email valido", -"Enter email address" => "Inserisci indirizzo email", -"Mail to address" => "Invia per email", -"Delete email address" => "Elimina l'indirizzo email", -"Enter phone number" => "Inserisci il numero di telefono", -"Delete phone number" => "Elimina il numero di telefono", -"Instant Messenger" => "Client di messaggistica istantanea", -"Delete IM" => "Elimina IM", -"View on map" => "Visualizza sulla mappa", -"Edit address details" => "Modifica dettagli dell'indirizzo", -"Add notes here." => "Aggiungi qui le note.", -"Add field" => "Aggiungi campo", -"Phone" => "Telefono", -"Email" => "Email", -"Instant Messaging" => "Messaggistica istantanea", -"Address" => "Indirizzo", -"Note" => "Nota", -"Download contact" => "Scarica contatto", -"Delete contact" => "Elimina contatto", -"The temporary image has been removed from cache." => "L'immagine temporanea è stata rimossa dalla cache.", -"Edit address" => "Modifica indirizzo", -"Type" => "Tipo", -"PO Box" => "Casella postale", -"Street address" => "Indirizzo", -"Street and number" => "Via e numero", -"Extended" => "Esteso", -"Apartment number etc." => "Numero appartamento ecc.", -"City" => "Città", -"Region" => "Regione", -"E.g. state or province" => "Ad es. stato o provincia", -"Zipcode" => "CAP", -"Postal code" => "CAP", -"Country" => "Stato", -"Addressbook" => "Rubrica", -"Hon. prefixes" => "Prefissi onorifici", -"Miss" => "Sig.na", -"Ms" => "Sig.ra", -"Mr" => "Sig.", -"Sir" => "Sig.", -"Mrs" => "Sig.ra", -"Dr" => "Dott.", -"Given name" => "Nome", -"Additional names" => "Nomi aggiuntivi", -"Family name" => "Cognome", -"Hon. suffixes" => "Suffissi onorifici", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importa un file di contatti", -"Please choose the addressbook" => "Scegli la rubrica", -"create a new addressbook" => "crea una nuova rubrica", -"Name of new addressbook" => "Nome della nuova rubrica", -"Importing contacts" => "Importazione contatti", -"You have no contacts in your addressbook." => "Non hai contatti nella rubrica.", -"Add contact" => "Aggiungi contatto", -"Select Address Books" => "Seleziona rubriche", -"Enter name" => "Inserisci il nome", -"Enter description" => "Inserisci una descrizione", -"CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV", -"more info" => "altre informazioni", -"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Mostra collegamento CardDav", -"Show read-only VCF link" => "Mostra collegamento VCF in sola lettura", -"Share" => "Condividi", -"Download" => "Scarica", -"Edit" => "Modifica", -"New Address Book" => "Nuova rubrica", -"Name" => "Nome", -"Description" => "Descrizione", -"Save" => "Salva", -"Cancel" => "Annulla", -"More..." => "Altro..." -); diff --git a/apps/contacts/l10n/ja_JP.php b/apps/contacts/l10n/ja_JP.php deleted file mode 100644 index 9b5874d459..0000000000 --- a/apps/contacts/l10n/ja_JP.php +++ /dev/null @@ -1,229 +0,0 @@ - "アドレス帳の有効/無効化に失敗しました。", -"id is not set." => "idが設定されていません。", -"Cannot update addressbook with an empty name." => "空白の名前でアドレス帳を更新することはできません。", -"Error updating addressbook." => "アドレス帳の更新に失敗しました。", -"No ID provided" => "IDが提供されていません", -"Error setting checksum." => "チェックサムの設定エラー。", -"No categories selected for deletion." => "削除するカテゴリが選択されていません。", -"No address books found." => "アドレス帳が見つかりません。", -"No contacts found." => "連絡先が見つかりません。", -"There was an error adding the contact." => "連絡先の追加でエラーが発生しました。", -"element name is not set." => "要素名が設定されていません。", -"Could not parse contact: " => "連絡先を解析できませんでした:", -"Cannot add empty property." => "項目の新規追加に失敗しました。", -"At least one of the address fields has to be filled out." => "住所の項目のうち1つは入力して下さい。", -"Trying to add duplicate property: " => "重複する属性を追加: ", -"Missing IM parameter." => "IMのパラメータが不足しています。", -"Unknown IM: " => "不明なIM:", -"Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。", -"Missing ID" => "IDが見つかりません", -"Error parsing VCard for ID: \"" => "VCardからIDの抽出エラー: \"", -"checksum is not set." => "チェックサムが設定されていません。", -"Information about vCard is incorrect. Please reload the page: " => "vCardの情報が正しくありません。ページを再読み込みしてください: ", -"Something went FUBAR. " => "何かがFUBARへ移動しました。", -"No contact ID was submitted." => "連絡先IDは登録されませんでした。", -"Error reading contact photo." => "連絡先写真の読み込みエラー。", -"Error saving temporary file." => "一時ファイルの保存エラー。", -"The loading photo is not valid." => "写真の読み込みは無効です。", -"Contact ID is missing." => "連絡先 IDが見つかりません。", -"No photo path was submitted." => "写真のパスが登録されていません。", -"File doesn't exist:" => "ファイルが存在しません:", -"Error loading image." => "画像の読み込みエラー。", -"Error getting contact object." => "連絡先オブジェクトの取得エラー。", -"Error getting PHOTO property." => "写真属性の取得エラー。", -"Error saving contact." => "連絡先の保存エラー。", -"Error resizing image" => "画像のリサイズエラー", -"Error cropping image" => "画像の切り抜きエラー", -"Error creating temporary image" => "一時画像の生成エラー", -"Error finding image: " => "画像検索エラー: ", -"Error uploading contacts to storage." => "ストレージへの連絡先のアップロードエラー。", -"There is no error, the file uploaded with success" => "エラーはありません。ファイルのアップロードは成功しました", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "アップロードファイルは php.ini 内の upload_max_filesize の制限を超えています", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています", -"The uploaded file was only partially uploaded" => "アップロードファイルは一部分だけアップロードされました", -"No file was uploaded" => "ファイルはアップロードされませんでした", -"Missing a temporary folder" => "一時保存フォルダが見つかりません", -"Couldn't save temporary image: " => "一時的な画像の保存ができませんでした: ", -"Couldn't load temporary image: " => "一時的な画像の読み込みができませんでした: ", -"No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー", -"Contacts" => "連絡先", -"Sorry, this functionality has not been implemented yet" => "申し訳ありません。この機能はまだ実装されていません", -"Not implemented" => "未実装", -"Couldn't get a valid address." => "有効なアドレスを取得できませんでした。", -"Error" => "エラー", -"You do not have permission to add contacts to " => "連絡先を追加する権限がありません", -"Please select one of your own address books." => "アドレス帳を一つ選択してください", -"Permission error" => "権限エラー", -"This property has to be non-empty." => "この属性は空にできません。", -"Couldn't serialize elements." => "要素をシリアライズできませんでした。", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' は型の引数無しで呼び出されました。bugs.owncloud.org へ報告してください。", -"Edit name" => "名前を編集", -"No files selected for upload." => "アップロードするファイルが選択されていません。", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。", -"Error loading profile picture." => "プロファイルの画像の読み込みエラー", -"Select type" => "タイプを選択", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "いくつかの連絡先が削除とマークされていますが、まだ削除されていません。削除するまでお待ちください。", -"Do you want to merge these address books?" => "これらのアドレス帳をマージしてもよろしいですか?", -"Result: " => "結果: ", -" imported, " => " をインポート、 ", -" failed." => " は失敗しました。", -"Displayname cannot be empty." => "表示名は空にできません。", -"Addressbook not found: " => "アドレス帳が見つかりません:", -"This is not your addressbook." => "これはあなたの電話帳ではありません。", -"Contact could not be found." => "連絡先を見つける事ができません。", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "Googleトーク", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "勤務先", -"Home" => "住居", -"Other" => "その他", -"Mobile" => "携帯電話", -"Text" => "TTY TDD", -"Voice" => "音声番号", -"Message" => "メッセージ", -"Fax" => "FAX", -"Video" => "テレビ電話", -"Pager" => "ポケベル", -"Internet" => "インターネット", -"Birthday" => "誕生日", -"Business" => "ビジネス", -"Call" => "電話", -"Clients" => "顧客", -"Deliverer" => "運送会社", -"Holidays" => "休日", -"Ideas" => "アイデア", -"Journey" => "旅行", -"Jubilee" => "記念祭", -"Meeting" => "打ち合わせ", -"Personal" => "個人", -"Projects" => "プロジェクト", -"Questions" => "質問", -"{name}'s Birthday" => "{name}の誕生日", -"Contact" => "連絡先", -"You do not have the permissions to edit this contact." => "この連絡先を編集する権限がありません", -"You do not have the permissions to delete this contact." => "この連絡先を削除する権限がありません", -"Add Contact" => "連絡先の追加", -"Import" => "インポート", -"Settings" => "設定", -"Addressbooks" => "アドレス帳", -"Close" => "閉じる", -"Keyboard shortcuts" => "キーボードショートカット", -"Navigation" => "ナビゲーション", -"Next contact in list" => "リスト内の次の連絡先", -"Previous contact in list" => "リスト内の前の連絡先", -"Expand/collapse current addressbook" => "現在のアドレス帳を展開する/折りたたむ", -"Next addressbook" => "次のアドレス帳", -"Previous addressbook" => "前のアドレス帳", -"Actions" => "アクション", -"Refresh contacts list" => "連絡先リストを再読込する", -"Add new contact" => "新しい連絡先を追加", -"Add new addressbook" => "新しいアドレス帳を追加", -"Delete current contact" => "現在の連絡先を削除", -"Drop photo to upload" => "写真をドロップしてアップロード", -"Delete current photo" => "現在の写真を削除", -"Edit current photo" => "現在の写真を編集", -"Upload new photo" => "新しい写真をアップロード", -"Select photo from ownCloud" => "ownCloudから写真を選択", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順", -"Edit name details" => "名前の詳細を編集", -"Organization" => "所属", -"Delete" => "削除", -"Nickname" => "ニックネーム", -"Enter nickname" => "ニックネームを入力", -"Web site" => "ウェブサイト", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Webサイトへ移動", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "グループ", -"Separate groups with commas" => "コンマでグループを分割", -"Edit groups" => "グループを編集", -"Preferred" => "推奨", -"Please specify a valid email address." => "有効なメールアドレスを指定してください。", -"Enter email address" => "メールアドレスを入力", -"Mail to address" => "アドレスへメールを送る", -"Delete email address" => "メールアドレスを削除", -"Enter phone number" => "電話番号を入力", -"Delete phone number" => "電話番号を削除", -"Instant Messenger" => "インスタントメッセンジャー", -"Delete IM" => "IMを削除", -"View on map" => "地図で表示", -"Edit address details" => "住所の詳細を編集", -"Add notes here." => "ここにメモを追加。", -"Add field" => "項目を追加", -"Phone" => "電話番号", -"Email" => "メールアドレス", -"Instant Messaging" => "インスタントメッセージ", -"Address" => "住所", -"Note" => "メモ", -"Download contact" => "連絡先のダウンロード", -"Delete contact" => "連絡先の削除", -"The temporary image has been removed from cache." => "一時画像はキャッシュから削除されました。", -"Edit address" => "住所を編集", -"Type" => "種類", -"PO Box" => "私書箱", -"Street address" => "住所1", -"Street and number" => "番地", -"Extended" => "住所2", -"Apartment number etc." => "アパート名等", -"City" => "都市", -"Region" => "都道府県", -"E.g. state or province" => "例:東京都、大阪府", -"Zipcode" => "郵便番号", -"Postal code" => "郵便番号", -"Country" => "国名", -"Addressbook" => "アドレス帳", -"Hon. prefixes" => "敬称", -"Miss" => "Miss", -"Ms" => "Ms", -"Mr" => "Mr", -"Sir" => "Sir", -"Mrs" => "Mrs", -"Dr" => "Dr", -"Given name" => "名", -"Additional names" => "ミドルネーム", -"Family name" => "姓", -"Hon. suffixes" => "称号", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "連絡先ファイルをインポート", -"Please choose the addressbook" => "アドレス帳を選択してください", -"create a new addressbook" => "新しいアドレス帳を作成", -"Name of new addressbook" => "新しいアドレスブックの名前", -"Importing contacts" => "連絡先をインポート", -"You have no contacts in your addressbook." => "アドレス帳に連絡先が登録されていません。", -"Add contact" => "連絡先を追加", -"Select Address Books" => "アドレス帳を選択してください", -"Enter name" => "名前を入力", -"Enter description" => "説明を入力してください", -"CardDAV syncing addresses" => "CardDAV同期アドレス", -"more info" => "詳細情報", -"Primary address (Kontact et al)" => "プライマリアドレス(Kontact 他)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "CarDavリンクを表示", -"Show read-only VCF link" => "読み取り専用のVCFリンクを表示", -"Share" => "共有", -"Download" => "ダウンロード", -"Edit" => "編集", -"New Address Book" => "新規のアドレス帳", -"Name" => "名前", -"Description" => "説明", -"Save" => "保存", -"Cancel" => "取り消し", -"More..." => "もっと..." -); diff --git a/apps/contacts/l10n/ko.php b/apps/contacts/l10n/ko.php deleted file mode 100644 index 4349224f53..0000000000 --- a/apps/contacts/l10n/ko.php +++ /dev/null @@ -1,155 +0,0 @@ - "주소록을 (비)활성화하는 데 실패했습니다.", -"id is not set." => "아이디가 설정되어 있지 않습니다. ", -"Cannot update addressbook with an empty name." => "주소록에 이름란이 비어있으면 업데이트를 할 수 없습니다. ", -"Error updating addressbook." => "주소록을 업데이트할 수 없습니다.", -"No ID provided" => "제공되는 아이디 없음", -"Error setting checksum." => "오류 검사합계 설정", -"No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다. ", -"No address books found." => "주소록을 찾을 수 없습니다.", -"No contacts found." => "연락처를 찾을 수 없습니다.", -"There was an error adding the contact." => "연락처를 추가하는 중 오류가 발생하였습니다.", -"element name is not set." => "element 이름이 설정되지 않았습니다.", -"Cannot add empty property." => "빈 속성을 추가할 수 없습니다.", -"At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.", -"Trying to add duplicate property: " => "중복 속성 추가 시도: ", -"Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.", -"Missing ID" => "아이디 분실", -"Error parsing VCard for ID: \"" => "아이디에 대한 VCard 분석 오류", -"checksum is not set." => "체크섬이 설정되지 않았습니다.", -"Information about vCard is incorrect. Please reload the page: " => " vCard에 대한 정보가 잘못되었습니다. 페이지를 다시 로드하세요:", -"No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.", -"Error reading contact photo." => "사진 읽기 오류", -"Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ", -"The loading photo is not valid." => "로딩 사진이 유효하지 않습니다. ", -"Contact ID is missing." => "접속 아이디가 없습니다. ", -"No photo path was submitted." => "사진 경로가 제출되지 않았습니다. ", -"File doesn't exist:" => "파일이 존재하지 않습니다. ", -"Error loading image." => "로딩 이미지 오류입니다.", -"Error getting contact object." => "연락처 개체를 가져오는 중 오류가 발생했습니다. ", -"Error getting PHOTO property." => "사진 속성을 가져오는 중 오류가 발생했습니다. ", -"Error saving contact." => "연락처 저장 중 오류가 발생했습니다.", -"Error resizing image" => "이미지 크기 조정 중 오류가 발생했습니다.", -"Error cropping image" => "이미지를 자르던 중 오류가 발생했습니다.", -"Error creating temporary image" => "임시 이미지를 생성 중 오류가 발생했습니다.", -"Error finding image: " => "이미지를 찾던 중 오류가 발생했습니다:", -"Error uploading contacts to storage." => "스토리지 에러 업로드 연락처.", -"There is no error, the file uploaded with success" => "오류없이 파일업로드 성공.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "php.ini 형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "HTML형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.", -"The uploaded file was only partially uploaded" => "이 업로드된 파일은 부분적으로만 업로드 되었습니다.", -"No file was uploaded" => "파일이 업로드 되어있지 않습니다", -"Missing a temporary folder" => "임시 폴더 분실", -"Couldn't save temporary image: " => "임시 이미지를 저장할 수 없습니다:", -"Couldn't load temporary image: " => "임시 이미지를 불러올 수 없습니다. ", -"No file was uploaded. Unknown error" => "파일이 업로드 되지 않았습니다. 알 수 없는 오류.", -"Contacts" => "연락처", -"Sorry, this functionality has not been implemented yet" => "죄송합니다. 이 기능은 아직 구현되지 않았습니다. ", -"Not implemented" => "구현되지 않음", -"Couldn't get a valid address." => "유효한 주소를 얻을 수 없습니다.", -"Error" => "오류", -"Couldn't serialize elements." => "요소를 직렬화 할 수 없습니다.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty'가 문서형식이 없이 불려왔습니다. bugs.owncloud.org에 보고해주세요. ", -"Edit name" => "이름 편집", -"No files selected for upload." => "업로드를 위한 파일이 선택되지 않았습니다. ", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일은 이 서버 파일 업로드 최대 용량을 초과 합니다. ", -"Select type" => "유형 선택", -"Result: " => "결과:", -" imported, " => "불러오기,", -" failed." => "실패.", -"This is not your addressbook." => "내 주소록이 아닙니다.", -"Contact could not be found." => "연락처를 찾을 수 없습니다.", -"Work" => "직장", -"Home" => "자택", -"Mobile" => "휴대폰", -"Text" => "문자 번호", -"Voice" => "음성 번호", -"Message" => "메세지", -"Fax" => "팩스 번호", -"Video" => "영상 번호", -"Pager" => "호출기", -"Internet" => "인터넷", -"Birthday" => "생일", -"{name}'s Birthday" => "{이름}의 생일", -"Contact" => "연락처", -"Add Contact" => "연락처 추가", -"Import" => "입력", -"Addressbooks" => "주소록", -"Close" => "닫기", -"Drop photo to upload" => "Drop photo to upload", -"Delete current photo" => "현재 사진 삭제", -"Edit current photo" => "현재 사진 편집", -"Upload new photo" => "새로운 사진 업로드", -"Select photo from ownCloud" => "ownCloud에서 사진 선택", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", -"Edit name details" => "이름 세부사항을 편집합니다. ", -"Organization" => "조직", -"Delete" => "삭제", -"Nickname" => "별명", -"Enter nickname" => "별명 입력", -"dd-mm-yyyy" => "일-월-년", -"Groups" => "그룹", -"Separate groups with commas" => "쉼표로 그룹 구분", -"Edit groups" => "그룹 편집", -"Preferred" => "선호함", -"Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.", -"Enter email address" => "이메일 주소 입력", -"Delete email address" => "이메일 주소 삭제", -"Enter phone number" => "전화번호 입력", -"Delete phone number" => "전화번호 삭제", -"View on map" => "지도에서 보기", -"Edit address details" => "상세 주소 수정", -"Add notes here." => "여기에 노트 추가.", -"Add field" => "파일 추가", -"Phone" => "전화 번호", -"Email" => "전자 우편", -"Address" => "주소", -"Note" => "노트", -"Download contact" => "연락처 다운로드", -"Delete contact" => "연락처 삭제", -"The temporary image has been removed from cache." => "임시 이미지가 캐시에서 제거 되었습니다. ", -"Edit address" => "주소 수정", -"Type" => "종류", -"PO Box" => "사서함", -"Extended" => "확장", -"City" => "도시", -"Region" => "지역", -"Zipcode" => "우편 번호", -"Country" => "국가", -"Addressbook" => "주소록", -"Hon. prefixes" => "Hon. prefixes", -"Miss" => "Miss", -"Ms" => "Ms", -"Mr" => "Mr", -"Sir" => "Sir", -"Mrs" => "Mrs", -"Dr" => "Dr", -"Given name" => "Given name", -"Additional names" => "추가 이름", -"Family name" => "성", -"Hon. suffixes" => "Hon. suffixes", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "연락처 파일 입력", -"Please choose the addressbook" => "주소록을 선택해 주세요.", -"create a new addressbook" => "새 주소록 만들기", -"Name of new addressbook" => "새 주소록 이름", -"Importing contacts" => "연락처 입력", -"You have no contacts in your addressbook." => "당신의 주소록에는 연락처가 없습니다. ", -"Add contact" => "연락처 추가", -"CardDAV syncing addresses" => "CardDAV 주소 동기화", -"more info" => "더 많은 정보", -"Primary address (Kontact et al)" => "기본 주소 (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Download" => "다운로드", -"Edit" => "편집", -"New Address Book" => "새 주소록", -"Save" => "저장", -"Cancel" => "취소" -); diff --git a/apps/contacts/l10n/lb.php b/apps/contacts/l10n/lb.php deleted file mode 100644 index 22ca20e751..0000000000 --- a/apps/contacts/l10n/lb.php +++ /dev/null @@ -1,86 +0,0 @@ - "Fehler beim (de)aktivéieren vum Adressbuch.", -"id is not set." => "ID ass net gesat.", -"Error updating addressbook." => "Fehler beim updaten vum Adressbuch.", -"No ID provided" => "Keng ID uginn", -"Error setting checksum." => "Fehler beim setzen vun der Checksum.", -"No categories selected for deletion." => "Keng Kategorien fir ze läschen ausgewielt.", -"No address books found." => "Keen Adressbuch fonnt.", -"No contacts found." => "Keng Kontakter fonnt.", -"There was an error adding the contact." => "Fehler beim bäisetzen vun engem Kontakt.", -"Cannot add empty property." => "Ka keng eidel Proprietéit bäisetzen.", -"Trying to add duplicate property: " => "Probéieren duebel Proprietéit bäi ze setzen:", -"Information about vCard is incorrect. Please reload the page." => "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei.", -"Missing ID" => "ID fehlt", -"No contact ID was submitted." => "Kontakt ID ass net mat geschéckt ginn.", -"Error reading contact photo." => "Fehler beim liesen vun der Kontakt Photo.", -"Error saving temporary file." => "Fehler beim späicheren vum temporäre Fichier.", -"The loading photo is not valid." => "Déi geluede Photo ass net gülteg.", -"Contact ID is missing." => "Kontakt ID fehlt.", -"File doesn't exist:" => "Fichier existéiert net:", -"Error loading image." => "Fehler beim lueden vum Bild.", -"No file was uploaded" => "Et ass kee Fichier ropgeluede ginn", -"Contacts" => "Kontakter", -"Error" => "Fehler", -"Result: " => "Resultat: ", -" imported, " => " importéiert, ", -"This is not your addressbook." => "Dat do ass net däin Adressbuch.", -"Contact could not be found." => "Konnt den Kontakt net fannen.", -"Work" => "Aarbecht", -"Home" => "Doheem", -"Mobile" => "GSM", -"Text" => "SMS", -"Voice" => "Voice", -"Message" => "Message", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Gebuertsdag", -"{name}'s Birthday" => "{name} säi Gebuertsdag", -"Contact" => "Kontakt", -"Add Contact" => "Kontakt bäisetzen", -"Addressbooks" => "Adressbicher ", -"Close" => "Zoumaachen", -"Organization" => "Firma", -"Delete" => "Läschen", -"Nickname" => "Spëtznumm", -"Enter nickname" => "Gëff e Spëtznumm an", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Gruppen", -"Edit groups" => "Gruppen editéieren", -"Enter phone number" => "Telefonsnummer aginn", -"Delete phone number" => "Telefonsnummer läschen", -"View on map" => "Op da Kaart uweisen", -"Edit address details" => "Adress Detailer editéieren", -"Phone" => "Telefon", -"Email" => "Email", -"Address" => "Adress", -"Note" => "Note", -"Download contact" => "Kontakt eroflueden", -"Delete contact" => "Kontakt läschen", -"Type" => "Typ", -"PO Box" => "Postleetzuel", -"Extended" => "Erweidert", -"City" => "Staat", -"Region" => "Regioun", -"Zipcode" => "Postleetzuel", -"Country" => "Land", -"Addressbook" => "Adressbuch", -"Mr" => "M", -"Sir" => "Sir", -"Mrs" => "Mme", -"Dr" => "Dr", -"Given name" => "Virnumm", -"Additional names" => "Weider Nimm", -"Family name" => "Famillje Numm", -"Ph.D." => "Ph.D.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"iOS/OS X" => "iOS/OS X", -"Download" => "Download", -"Edit" => "Editéieren", -"New Address Book" => "Neit Adressbuch", -"Save" => "Späicheren", -"Cancel" => "Ofbriechen" -); diff --git a/apps/contacts/l10n/lt_LT.php b/apps/contacts/l10n/lt_LT.php deleted file mode 100644 index 3b31aa7931..0000000000 --- a/apps/contacts/l10n/lt_LT.php +++ /dev/null @@ -1,53 +0,0 @@ - "Klaida (de)aktyvuojant adresų knygą.", -"No contacts found." => "Kontaktų nerasta.", -"There was an error adding the contact." => "Pridedant kontaktą įvyko klaida.", -"Information about vCard is incorrect. Please reload the page." => "Informacija apie vCard yra neteisinga. ", -"Error reading contact photo." => "Klaida skaitant kontakto nuotrauką.", -"The loading photo is not valid." => "Netinkama įkeliama nuotrauka.", -"File doesn't exist:" => "Failas neegzistuoja:", -"Error loading image." => "Klaida įkeliant nuotrauką.", -"There is no error, the file uploaded with success" => "Failas įkeltas sėkmingai, be klaidų", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Įkeliamo failo dydis viršija upload_max_filesize nustatymą php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Įkeliamo failo dydis viršija MAX_FILE_SIZE nustatymą, kuris naudojamas HTML formoje.", -"The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai", -"No file was uploaded" => "Nebuvo įkeltas joks failas", -"Contacts" => "Kontaktai", -"This is not your addressbook." => "Tai ne jūsų adresų knygelė.", -"Contact could not be found." => "Kontaktas nerastas", -"Work" => "Darbo", -"Home" => "Namų", -"Mobile" => "Mobilusis", -"Text" => "Žinučių", -"Voice" => "Balso", -"Message" => "Žinutė", -"Fax" => "Faksas", -"Video" => "Vaizdo", -"Pager" => "Pranešimų gaviklis", -"Internet" => "Internetas", -"Birthday" => "Gimtadienis", -"Contact" => "Kontaktas", -"Add Contact" => "Pridėti kontaktą", -"Addressbooks" => "Adresų knygos", -"Organization" => "Organizacija", -"Delete" => "Trinti", -"Nickname" => "Slapyvardis", -"Enter nickname" => "Įveskite slapyvardį", -"Phone" => "Telefonas", -"Email" => "El. paštas", -"Address" => "Adresas", -"Download contact" => "Atsisųsti kontaktą", -"Delete contact" => "Ištrinti kontaktą", -"Type" => "Tipas", -"PO Box" => "Pašto dėžutė", -"City" => "Miestas", -"Region" => "Regionas", -"Zipcode" => "Pašto indeksas", -"Country" => "Šalis", -"Addressbook" => "Adresų knyga", -"Download" => "Atsisiųsti", -"Edit" => "Keisti", -"New Address Book" => "Nauja adresų knyga", -"Save" => "Išsaugoti", -"Cancel" => "Atšaukti" -); diff --git a/apps/contacts/l10n/mk.php b/apps/contacts/l10n/mk.php deleted file mode 100644 index 093b105777..0000000000 --- a/apps/contacts/l10n/mk.php +++ /dev/null @@ -1,158 +0,0 @@ - "Грешка (де)активирање на адресарот.", -"id is not set." => "ид не е поставено.", -"Cannot update addressbook with an empty name." => "Неможе да се ажурира адресар со празно име.", -"Error updating addressbook." => "Грешка при ажурирање на адресарот.", -"No ID provided" => "Нема доставено ИД", -"Error setting checksum." => "Грешка во поставување сума за проверка.", -"No categories selected for deletion." => "Нема избрано категории за бришење.", -"No address books found." => "Не се најдени адресари.", -"No contacts found." => "Не се најдени контакти.", -"There was an error adding the contact." => "Имаше грешка при додавање на контактот.", -"element name is not set." => "име за елементот не е поставена.", -"Cannot add empty property." => "Неможе да се додаде празна вредност.", -"At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.", -"Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:", -"Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.", -"Missing ID" => "Недостасува ИД", -"Error parsing VCard for ID: \"" => "Грешка при парсирање VCard за ИД: \"", -"checksum is not set." => "сумата за проверка не е поставена.", -"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:", -"Something went FUBAR. " => "Нешто се расипа.", -"No contact ID was submitted." => "Не беше доставено ИД за контакт.", -"Error reading contact photo." => "Грешка во читање на контакт фотографија.", -"Error saving temporary file." => "Грешка во снимање на привремена датотека.", -"The loading photo is not valid." => "Фотографијата која се вчитува е невалидна.", -"Contact ID is missing." => "ИД за контакт недостасува.", -"No photo path was submitted." => "Не беше поднесена патека за фотографија.", -"File doesn't exist:" => "Не постои датотеката:", -"Error loading image." => "Грешка во вчитување на слика.", -"Error getting contact object." => "Грешка при преземањето на контакт објектот,", -"Error getting PHOTO property." => "Грешка при утврдувањето на карактеристиките на фотографијата.", -"Error saving contact." => "Грешка при снимање на контактите.", -"Error resizing image" => "Грешка при скалирање на фотографијата", -"Error cropping image" => "Грешка при сечење на фотографијата", -"Error creating temporary image" => "Грешка при креирањето на привремената фотографија", -"Error finding image: " => "Грешка при наоѓањето на фотографијата:", -"Error uploading contacts to storage." => "Грешка во снимање на контактите на диск.", -"There is no error, the file uploaded with success" => "Датотеката беше успешно подигната.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Големината на датотеката ја надминува upload_max_filesize директивата во php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата", -"The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.", -"No file was uploaded" => "Не беше подигната датотека.", -"Missing a temporary folder" => "Недостасува привремена папка", -"Couldn't save temporary image: " => "Не можеше да се сними привремената фотографија:", -"Couldn't load temporary image: " => "Не можеше да се вчита привремената фотографија:", -"No file was uploaded. Unknown error" => "Ниту еден фајл не се вчита. Непозната грешка", -"Contacts" => "Контакти", -"Sorry, this functionality has not been implemented yet" => "Жалам, оваа функционалност уште не е имплементирана", -"Not implemented" => "Не е имплементирано", -"Couldn't get a valid address." => "Не можев да добијам исправна адреса.", -"Error" => "Грешка", -"This property has to be non-empty." => "Својството не смее да биде празно.", -"Couldn't serialize elements." => "Не може да се серијализираат елементите.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' повикан без тип на аргументот. Пријавете грешка/проблем на bugs.owncloud.org", -"Edit name" => "Уреди го името", -"No files selected for upload." => "Ниту еден фајл не е избран за вчитување.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеката која се обидувате да ја префрлите ја надминува максималната големина дефинирана за пренос на овој сервер.", -"Select type" => "Одбери тип", -"Result: " => "Резултат: ", -" imported, " => "увезено,", -" failed." => "неуспешно.", -"This is not your addressbook." => "Ова не е во Вашиот адресар.", -"Contact could not be found." => "Контактот неможе да биде најден.", -"Work" => "Работа", -"Home" => "Дома", -"Mobile" => "Мобилен", -"Text" => "Текст", -"Voice" => "Глас", -"Message" => "Порака", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пејџер", -"Internet" => "Интернет", -"Birthday" => "Роденден", -"{name}'s Birthday" => "Роденден на {name}", -"Contact" => "Контакт", -"Add Contact" => "Додади контакт", -"Import" => "Внеси", -"Addressbooks" => "Адресари", -"Close" => "Затвои", -"Drop photo to upload" => "Довлечкај фотографија за да се подигне", -"Delete current photo" => "Избриши моментална фотографија", -"Edit current photo" => "Уреди моментална фотографија", -"Upload new photo" => "Подигни нова фотографија", -"Select photo from ownCloud" => "Изберете фотографија од ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка", -"Edit name details" => "Уреди детали за име", -"Organization" => "Организација", -"Delete" => "Избриши", -"Nickname" => "Прекар", -"Enter nickname" => "Внеси прекар", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Групи", -"Separate groups with commas" => "Одвоете ги групите со запирка", -"Edit groups" => "Уреди групи", -"Preferred" => "Претпочитано", -"Please specify a valid email address." => "Ве молам внесете правилна адреса за е-пошта.", -"Enter email address" => "Внесете е-пошта", -"Mail to address" => "Прати порака до адреса", -"Delete email address" => "Избриши адреса за е-пошта", -"Enter phone number" => "Внесете телефонски број", -"Delete phone number" => "Избриши телефонски број", -"View on map" => "Погледајте на мапа", -"Edit address details" => "Уреди детали за адреса", -"Add notes here." => "Внесете забелешки тука.", -"Add field" => "Додади поле", -"Phone" => "Телефон", -"Email" => "Е-пошта", -"Address" => "Адреса", -"Note" => "Забелешка", -"Download contact" => "Преземи го контактот", -"Delete contact" => "Избриши го контактот", -"The temporary image has been removed from cache." => "Привремената слика е отстранета од кешот.", -"Edit address" => "Уреди адреса", -"Type" => "Тип", -"PO Box" => "Поштенски фах", -"Extended" => "Дополнително", -"City" => "Град", -"Region" => "Регион", -"Zipcode" => "Поштенски код", -"Country" => "Држава", -"Addressbook" => "Адресар", -"Hon. prefixes" => "Префикси за титула", -"Miss" => "Г-ца", -"Ms" => "Г-ѓа", -"Mr" => "Г-дин", -"Sir" => "Сер", -"Mrs" => "Г-ѓа", -"Dr" => "Др", -"Given name" => "Лично име", -"Additional names" => "Дополнителни имиња", -"Family name" => "Презиме", -"Hon. suffixes" => "Суфикси за титула", -"J.D." => "J.D.", -"M.D." => "Д.М.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Д-р", -"Esq." => "Esq.", -"Jr." => "Помлад.", -"Sn." => "Постар.", -"Import a contacts file" => "Внеси датотека со контакти", -"Please choose the addressbook" => "Ве молам изберете адресар", -"create a new addressbook" => "креирај нов адресар", -"Name of new addressbook" => "Име на новиот адресар", -"Importing contacts" => "Внесување контакти", -"You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.", -"Add contact" => "Додади контакт", -"CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV", -"more info" => "повеќе информации", -"Primary address (Kontact et al)" => "Примарна адреса", -"iOS/OS X" => "iOS/OS X", -"Download" => "Преземи", -"Edit" => "Уреди", -"New Address Book" => "Нов адресар", -"Save" => "Сними", -"Cancel" => "Откажи" -); diff --git a/apps/contacts/l10n/ms_MY.php b/apps/contacts/l10n/ms_MY.php deleted file mode 100644 index 3fce9eae5a..0000000000 --- a/apps/contacts/l10n/ms_MY.php +++ /dev/null @@ -1,178 +0,0 @@ - "Ralat nyahaktif buku alamat.", -"id is not set." => "ID tidak ditetapkan.", -"Cannot update addressbook with an empty name." => "Tidak boleh kemaskini buku alamat dengan nama yang kosong.", -"Error updating addressbook." => "Masalah mengemaskini buku alamat.", -"No ID provided" => "tiada ID diberi", -"Error setting checksum." => "Ralat menetapkan checksum.", -"No categories selected for deletion." => "Tiada kategori dipilih untuk dibuang.", -"No address books found." => "Tiada buku alamat dijumpai.", -"No contacts found." => "Tiada kenalan dijumpai.", -"There was an error adding the contact." => "Terdapat masalah menambah maklumat.", -"element name is not set." => "nama elemen tidak ditetapkan.", -"Cannot add empty property." => "Tidak boleh menambah ruang kosong.", -"At least one of the address fields has to be filled out." => "Sekurangnya satu ruangan alamat perlu diisikan.", -"Trying to add duplicate property: " => "Cuba untuk letak nilai duplikasi:", -"Information about vCard is incorrect. Please reload the page." => "Maklumat vCard tidak tepat. Sila reload semula halaman ini.", -"Missing ID" => "ID Hilang", -"Error parsing VCard for ID: \"" => "Ralat VCard untuk ID: \"", -"checksum is not set." => "checksum tidak ditetapkan.", -"Information about vCard is incorrect. Please reload the page: " => "Maklumat tentang vCard tidak betul.", -"Something went FUBAR. " => "Sesuatu tidak betul.", -"No contact ID was submitted." => "Tiada ID kenalan yang diberi.", -"Error reading contact photo." => "Ralat pada foto kenalan.", -"Error saving temporary file." => "Ralat menyimpan fail sementara", -"The loading photo is not valid." => "Foto muatan tidak sah.", -"Contact ID is missing." => "ID Kenalan telah hilang.", -"No photo path was submitted." => "Tiada direktori gambar yang diberi.", -"File doesn't exist:" => "Fail tidak wujud:", -"Error loading image." => "Ralat pada muatan imej.", -"Error getting contact object." => "Ralat mendapatkan objek pada kenalan.", -"Error getting PHOTO property." => "Ralat mendapatkan maklumat gambar.", -"Error saving contact." => "Ralat menyimpan kenalan.", -"Error resizing image" => "Ralat mengubah saiz imej", -"Error cropping image" => "Ralat memotong imej", -"Error creating temporary image" => "Ralat mencipta imej sementara", -"Error finding image: " => "Ralat mencari imej: ", -"Error uploading contacts to storage." => "Ralat memuatnaik senarai kenalan.", -"There is no error, the file uploaded with success" => "Tiada ralat berlaku, fail berjaya dimuatnaik", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Saiz fail yang dimuatnaik melebihi upload_max_filesize yang ditetapkan dalam php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Saiz fail yang dimuatnaik melebihi MAX_FILE_SIZE yang ditetapkan dalam borang HTML", -"The uploaded file was only partially uploaded" => "Fail yang dimuatnaik tidak lengkap", -"No file was uploaded" => "Tiada fail dimuatnaik", -"Missing a temporary folder" => "Direktori sementara hilang", -"Couldn't save temporary image: " => "Tidak boleh menyimpan imej sementara: ", -"Couldn't load temporary image: " => "Tidak boleh membuka imej sementara: ", -"No file was uploaded. Unknown error" => "Tiada fail dimuatnaik. Ralat tidak diketahui.", -"Contacts" => "Hubungan-hubungan", -"Sorry, this functionality has not been implemented yet" => "Maaf, fungsi ini masih belum boleh diguna lagi", -"Not implemented" => "Tidak digunakan", -"Couldn't get a valid address." => "Tidak boleh mendapat alamat yang sah.", -"Error" => "Ralat", -"This property has to be non-empty." => "Nilai ini tidak boleh kosong.", -"Couldn't serialize elements." => "Tidak boleh menggabungkan elemen.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' dipanggil tanpa argumen taip. Sila maklumkan di bugs.owncloud.org", -"Edit name" => "Ubah nama", -"No files selected for upload." => "Tiada fail dipilih untuk muatnaik.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang ingin dimuatnaik melebihi saiz yang dibenarkan.", -"Select type" => "PIlih jenis", -"Result: " => "Hasil: ", -" imported, " => " import, ", -" failed." => " gagal.", -"Addressbook not found: " => "Buku alamat tidak ditemui:", -"This is not your addressbook." => "Ini bukan buku alamat anda.", -"Contact could not be found." => "Hubungan tidak dapat ditemui", -"Work" => "Kerja", -"Home" => "Rumah", -"Other" => "Lain", -"Mobile" => "Mudah alih", -"Text" => "Teks", -"Voice" => "Suara", -"Message" => "Mesej", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Alat Kelui", -"Internet" => "Internet", -"Birthday" => "Hari lahir", -"Business" => "Perniagaan", -"Clients" => "klien", -"Holidays" => "Hari kelepasan", -"Ideas" => "Idea", -"Journey" => "Perjalanan", -"Jubilee" => "Jubli", -"Meeting" => "Mesyuarat", -"Personal" => "Peribadi", -"Projects" => "Projek", -"{name}'s Birthday" => "Hari Lahir {name}", -"Contact" => "Hubungan", -"Add Contact" => "Tambah kenalan", -"Import" => "Import", -"Settings" => "Tetapan", -"Addressbooks" => "Senarai Buku Alamat", -"Close" => "Tutup", -"Next addressbook" => "Buku alamat seterusnya", -"Previous addressbook" => "Buku alamat sebelumnya", -"Drop photo to upload" => "Letak foto disini untuk muatnaik", -"Delete current photo" => "Padam foto semasa", -"Edit current photo" => "Ubah foto semasa", -"Upload new photo" => "Muatnaik foto baru", -"Select photo from ownCloud" => "Pilih foto dari ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format bebas, Nama pendek, Nama penuh, Unduran dengan koma", -"Edit name details" => "Ubah butiran nama", -"Organization" => "Organisasi", -"Delete" => "Padam", -"Nickname" => "Nama Samaran", -"Enter nickname" => "Masukkan nama samaran", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Kumpulan", -"Separate groups with commas" => "Asingkan kumpulan dengan koma", -"Edit groups" => "Ubah kumpulan", -"Preferred" => "Pilihan", -"Please specify a valid email address." => "Berikan alamat emel yang sah.", -"Enter email address" => "Masukkan alamat emel", -"Mail to address" => "Hantar ke alamat", -"Delete email address" => "Padam alamat emel", -"Enter phone number" => "Masukkan nombor telefon", -"Delete phone number" => "Padam nombor telefon", -"View on map" => "Lihat pada peta", -"Edit address details" => "Ubah butiran alamat", -"Add notes here." => "Letak nota disini.", -"Add field" => "Letak ruangan", -"Phone" => "Telefon", -"Email" => "Emel", -"Address" => "Alamat", -"Note" => "Nota", -"Download contact" => "Muat turun hubungan", -"Delete contact" => "Padam hubungan", -"The temporary image has been removed from cache." => "Imej sementara telah dibuang dari cache.", -"Edit address" => "Ubah alamat", -"Type" => "Jenis", -"PO Box" => "Peti surat", -"Extended" => "Sambungan", -"City" => "bandar", -"Region" => "Wilayah", -"Zipcode" => "Poskod", -"Country" => "Negara", -"Addressbook" => "Buku alamat", -"Hon. prefixes" => "Awalan nama", -"Miss" => "Cik", -"Ms" => "Cik", -"Mr" => "Encik", -"Sir" => "Tuan", -"Mrs" => "Puan", -"Dr" => "Dr", -"Given name" => "Nama diberi", -"Additional names" => "Nama tambahan", -"Family name" => "Nama keluarga", -"Hon. suffixes" => "Awalan nama", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Import fail kenalan", -"Please choose the addressbook" => "Sila pilih buku alamat", -"create a new addressbook" => "Cipta buku alamat baru", -"Name of new addressbook" => "Nama buku alamat", -"Importing contacts" => "Import senarai kenalan", -"You have no contacts in your addressbook." => "Anda tidak mempunyai sebarang kenalan didalam buku alamat.", -"Add contact" => "Letak kenalan", -"Select Address Books" => "Pilih Buku Alamat", -"Enter name" => "Masukkan nama", -"Enter description" => "Masukkan keterangan", -"CardDAV syncing addresses" => "alamat selarian CardDAV", -"more info" => "maklumat lanjut", -"Primary address (Kontact et al)" => "Alamat utama", -"iOS/OS X" => "iOS/OS X", -"Download" => "Muat naik", -"Edit" => "Sunting", -"New Address Book" => "Buku Alamat Baru", -"Name" => "Nama", -"Description" => "Keterangan", -"Save" => "Simpan", -"Cancel" => "Batal", -"More..." => "Lagi..." -); diff --git a/apps/contacts/l10n/nb_NO.php b/apps/contacts/l10n/nb_NO.php deleted file mode 100644 index 905f6fc6a0..0000000000 --- a/apps/contacts/l10n/nb_NO.php +++ /dev/null @@ -1,134 +0,0 @@ - "Et problem oppsto med å (de)aktivere adresseboken.", -"id is not set." => "id er ikke satt.", -"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.", -"Error updating addressbook." => "Et problem oppsto med å oppdatere adresseboken.", -"No ID provided" => "Ingen ID angitt", -"No categories selected for deletion." => "Ingen kategorier valgt for sletting.", -"No address books found." => "Ingen adressebok funnet.", -"No contacts found." => "Ingen kontakter funnet.", -"There was an error adding the contact." => "Et problem oppsto med å legge til kontakten.", -"Cannot add empty property." => "Kan ikke legge til tomt felt.", -"At least one of the address fields has to be filled out." => "Minst en av adressefeltene må oppgis.", -"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.", -"Missing ID" => "Manglende ID", -"Something went FUBAR. " => "Noe gikk fryktelig galt.", -"Error reading contact photo." => "Klarte ikke å lese kontaktbilde.", -"Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.", -"The loading photo is not valid." => "Bildet som lastes inn er ikke gyldig.", -"Contact ID is missing." => "Kontakt-ID mangler.", -"No photo path was submitted." => "Ingen filsti ble lagt inn.", -"File doesn't exist:" => "Filen eksisterer ikke:", -"Error loading image." => "Klarte ikke å laste bilde.", -"Error saving contact." => "Klarte ikke å lagre kontakt.", -"Error resizing image" => "Klarte ikke å endre størrelse på bildet", -"Error cropping image" => "Klarte ikke å beskjære bildet", -"Error creating temporary image" => "Klarte ikke å lage et midlertidig bilde", -"Error finding image: " => "Kunne ikke finne bilde:", -"Error uploading contacts to storage." => "Klarte ikke å laste opp kontakter til lagringsplassen", -"There is no error, the file uploaded with success" => "Pust ut, ingen feil. Filen ble lastet opp problemfritt", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Filen du prøvde å laste opp var større enn grensen upload_max_filesize i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Filen du prøvde å laste opp var større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet.", -"The uploaded file was only partially uploaded" => "Filen du prøvde å laste opp ble kun delvis lastet opp", -"No file was uploaded" => "Ingen filer ble lastet opp", -"Missing a temporary folder" => "Mangler midlertidig mappe", -"Couldn't save temporary image: " => "Kunne ikke lagre midlertidig bilde:", -"Couldn't load temporary image: " => "Kunne ikke laste midlertidig bilde:", -"No file was uploaded. Unknown error" => "Ingen filer ble lastet opp. Ukjent feil.", -"Contacts" => "Kontakter", -"Error" => "Feil", -"Edit name" => "Endre navn", -"No files selected for upload." => "Ingen filer valgt for opplasting.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du prøver å laste opp er for stor.", -"Select type" => "Velg type", -"Result: " => "Resultat:", -" imported, " => "importert,", -" failed." => "feilet.", -"This is not your addressbook." => "Dette er ikke dine adressebok.", -"Contact could not be found." => "Kontakten ble ikke funnet.", -"Work" => "Arbeid", -"Home" => "Hjem", -"Mobile" => "Mobil", -"Text" => "Tekst", -"Voice" => "Svarer", -"Message" => "Melding", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internett", -"Birthday" => "Bursdag", -"{name}'s Birthday" => "{name}s bursdag", -"Contact" => "Kontakt", -"Add Contact" => "Ny kontakt", -"Import" => "Importer", -"Addressbooks" => "Adressebøker", -"Close" => "Lukk", -"Drop photo to upload" => "Dra bilder hit for å laste opp", -"Delete current photo" => "Fjern nåværende bilde", -"Edit current photo" => "Rediger nåværende bilde", -"Upload new photo" => "Last opp nytt bilde", -"Select photo from ownCloud" => "Velg bilde fra ownCloud", -"Edit name details" => "Endre detaljer rundt navn", -"Organization" => "Organisasjon", -"Delete" => "Slett", -"Nickname" => "Kallenavn", -"Enter nickname" => "Skriv inn kallenavn", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Skill gruppene med komma", -"Edit groups" => "Endre grupper", -"Preferred" => "Foretrukket", -"Please specify a valid email address." => "Vennligst angi en gyldig e-postadresse.", -"Enter email address" => "Skriv inn e-postadresse", -"Mail to address" => "Send e-post til adresse", -"Delete email address" => "Fjern e-postadresse", -"Enter phone number" => "Skriv inn telefonnummer", -"Delete phone number" => "Fjern telefonnummer", -"View on map" => "Se på kart", -"Edit address details" => "Endre detaljer rundt adresse", -"Add notes here." => "Legg inn notater her.", -"Add field" => "Legg til felt", -"Phone" => "Telefon", -"Email" => "E-post", -"Address" => "Adresse", -"Note" => "Notat", -"Download contact" => "Hend ned kontakten", -"Delete contact" => "Slett kontakt", -"The temporary image has been removed from cache." => "Det midlertidige bildet er fjernet fra cache.", -"Edit address" => "Endre adresse", -"Type" => "Type", -"PO Box" => "Postboks", -"Extended" => "Utvidet", -"City" => "By", -"Region" => "Området", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Addressbook" => "Adressebok", -"Hon. prefixes" => "Ærestitler", -"Miss" => "Frøken", -"Mr" => "Herr", -"Mrs" => "Fru", -"Dr" => "Dr", -"Given name" => "Fornavn", -"Additional names" => "Ev. mellomnavn", -"Family name" => "Etternavn", -"Hon. suffixes" => "Titler", -"Ph.D." => "Stipendiat", -"Jr." => "Jr.", -"Sn." => "Sr.", -"Import a contacts file" => "Importer en fil med kontakter.", -"Please choose the addressbook" => "Vennligst velg adressebok", -"create a new addressbook" => "Lag ny adressebok", -"Name of new addressbook" => "Navn på ny adressebok", -"Importing contacts" => "Importerer kontakter", -"You have no contacts in your addressbook." => "Du har ingen kontakter i din adressebok", -"Add contact" => "Ny kontakt", -"CardDAV syncing addresses" => "Synkroniseringsadresse for CardDAV", -"more info" => "mer info", -"iOS/OS X" => "iOS/OS X", -"Download" => "Hent ned", -"Edit" => "Rediger", -"New Address Book" => "Ny adressebok", -"Save" => "Lagre", -"Cancel" => "Avbryt" -); diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php deleted file mode 100644 index 7c85dd7ce9..0000000000 --- a/apps/contacts/l10n/nl.php +++ /dev/null @@ -1,220 +0,0 @@ - "Fout bij het (de)activeren van het adresboek.", -"id is not set." => "id is niet ingesteld.", -"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen", -"Error updating addressbook." => "Fout bij het updaten van het adresboek.", -"No ID provided" => "Geen ID opgegeven", -"Error setting checksum." => "Instellen controlegetal mislukt", -"No categories selected for deletion." => "Geen categorieën geselecteerd om te verwijderen.", -"No address books found." => "Geen adresboek gevonden", -"No contacts found." => "Geen contracten gevonden", -"There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.", -"element name is not set." => "onderdeel naam is niet opgegeven.", -"Could not parse contact: " => "Kon het contact niet verwerken", -"Cannot add empty property." => "Kan geen lege eigenschap toevoegen.", -"At least one of the address fields has to be filled out." => "Minstens één van de adresvelden moet ingevuld worden.", -"Trying to add duplicate property: " => "Eigenschap bestaat al: ", -"Missing IM parameter." => "IM parameter ontbreekt", -"Unknown IM: " => "Onbekende IM:", -"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.", -"Missing ID" => "Ontbrekend ID", -"Error parsing VCard for ID: \"" => "Fout bij inlezen VCard voor ID: \"", -"checksum is not set." => "controlegetal is niet opgegeven.", -"Information about vCard is incorrect. Please reload the page: " => "Informatie over vCard is fout. Herlaad de pagina: ", -"Something went FUBAR. " => "Er ging iets totaal verkeerd. ", -"No contact ID was submitted." => "Geen contact ID opgestuurd.", -"Error reading contact photo." => "Lezen van contact foto mislukt.", -"Error saving temporary file." => "Tijdelijk bestand opslaan mislukt.", -"The loading photo is not valid." => "De geladen foto is niet goed.", -"Contact ID is missing." => "Contact ID ontbreekt.", -"No photo path was submitted." => "Geen fotopad opgestuurd.", -"File doesn't exist:" => "Bestand bestaat niet:", -"Error loading image." => "Fout bij laden plaatje.", -"Error getting contact object." => "Fout om contact object te verkrijgen", -"Error getting PHOTO property." => "Fout om PHOTO eigenschap te verkrijgen", -"Error saving contact." => "Fout om contact op te slaan", -"Error resizing image" => "Fout tijdens aanpassen plaatje", -"Error cropping image" => "Fout tijdens aanpassen plaatje", -"Error creating temporary image" => "Fout om een tijdelijk plaatje te maken", -"Error finding image: " => "Fout kan plaatje niet vinden:", -"Error uploading contacts to storage." => "Fout bij opslaan van contacten.", -"There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het bestand overschrijdt de upload_max_filesize instelling in php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het bestand overschrijdt de MAX_FILE_SIZE instelling dat is opgegeven in het HTML formulier", -"The uploaded file was only partially uploaded" => "Het bestand is gedeeltelijk geüpload", -"No file was uploaded" => "Er is geen bestand geüpload", -"Missing a temporary folder" => "Er ontbreekt een tijdelijke map", -"Couldn't save temporary image: " => "Kan tijdelijk plaatje niet op slaan:", -"Couldn't load temporary image: " => "Kan tijdelijk plaatje niet op laden:", -"No file was uploaded. Unknown error" => "Er was geen bestand geladen. Onbekende fout", -"Contacts" => "Contacten", -"Sorry, this functionality has not been implemented yet" => "Sorry, deze functionaliteit is nog niet geïmplementeerd", -"Not implemented" => "Niet geïmplementeerd", -"Couldn't get a valid address." => "Kan geen geldig adres krijgen", -"Error" => "Fout", -"You do not have permission to add contacts to " => "U hebt geen permissie om contacten toe te voegen aan", -"Please select one of your own address books." => "Selecteer één van uw eigen adresboeken", -"Permission error" => "Permissie fout", -"This property has to be non-empty." => "Dit veld mag niet leeg blijven", -"Couldn't serialize elements." => "Kan de elementen niet serializen", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' aangeroepen zonder type argument. Rapporteer dit a.u.b. via http://bugs.owncloud.org", -"Edit name" => "Pas naam aan", -"No files selected for upload." => "Geen bestanden geselecteerd voor upload.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Het bestand dat u probeert te uploaden overschrijdt de maximale bestand grootte voor bestand uploads voor deze server.", -"Error loading profile picture." => "Fout profiel plaatje kan niet worden geladen.", -"Select type" => "Selecteer type", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Enkele contacten zijn gemarkeerd om verwijderd te worden, maar zijn nog niet verwijderd. Wacht totdat ze zijn verwijderd.", -"Do you want to merge these address books?" => "Wilt u deze adresboeken samenvoegen?", -"Result: " => "Resultaat:", -" imported, " => "geïmporteerd,", -" failed." => "gefaald.", -"Displayname cannot be empty." => "Displaynaam mag niet leeg zijn.", -"Addressbook not found: " => "Adresboek niet gevonden:", -"This is not your addressbook." => "Dit is niet uw adresboek.", -"Contact could not be found." => "Contact kon niet worden gevonden.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Werk", -"Home" => "Thuis", -"Other" => "Anders", -"Mobile" => "Mobiel", -"Text" => "Tekst", -"Voice" => "Stem", -"Message" => "Bericht", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pieper", -"Internet" => "Internet", -"Birthday" => "Verjaardag", -"Business" => "Business", -"Call" => "Bel", -"Clients" => "Klanten", -"Deliverer" => "Leverancier", -"Holidays" => "Vakanties", -"Ideas" => "Ideeën", -"Journey" => "Reis", -"Jubilee" => "Jubileum", -"Meeting" => "Vergadering", -"Personal" => "Persoonlijk", -"Projects" => "Projecten", -"Questions" => "Vragen", -"{name}'s Birthday" => "{name}'s verjaardag", -"Contact" => "Contact", -"You do not have the permissions to edit this contact." => "U heeft geen permissie om dit contact te bewerken.", -"You do not have the permissions to delete this contact." => "U heeft geen permissie om dit contact te verwijderen.", -"Add Contact" => "Contact toevoegen", -"Import" => "Importeer", -"Settings" => "Instellingen", -"Addressbooks" => "Adresboeken", -"Close" => "Sluiten", -"Keyboard shortcuts" => "Sneltoetsen", -"Navigation" => "Navigatie", -"Next contact in list" => "Volgende contact in de lijst", -"Previous contact in list" => "Vorige contact in de lijst", -"Expand/collapse current addressbook" => "Uitklappen / inklappen huidig adresboek", -"Next addressbook" => "Volgende adresboek", -"Previous addressbook" => "Vorige adresboek", -"Actions" => "Acties", -"Refresh contacts list" => "Vernieuw contact lijst", -"Add new contact" => "Voeg nieuw contact toe", -"Add new addressbook" => "Voeg nieuw adresboek toe", -"Delete current contact" => "Verwijder huidig contact", -"Drop photo to upload" => "Verwijder foto uit upload", -"Delete current photo" => "Verwijdere huidige foto", -"Edit current photo" => "Wijzig huidige foto", -"Upload new photo" => "Upload nieuwe foto", -"Select photo from ownCloud" => "Selecteer foto uit ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma", -"Edit name details" => "Wijzig naam gegevens", -"Organization" => "Organisatie", -"Delete" => "Verwijderen", -"Nickname" => "Roepnaam", -"Enter nickname" => "Voer roepnaam in", -"Web site" => "Website", -"http://www.somesite.com" => "http://www.willekeurigesite.com", -"Go to web site" => "Ga naar website", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Groepen", -"Separate groups with commas" => "Gebruik komma bij meerder groepen", -"Edit groups" => "Wijzig groepen", -"Preferred" => "Voorkeur", -"Please specify a valid email address." => "Geef een geldig email adres op.", -"Enter email address" => "Voer email adres in", -"Mail to address" => "Mail naar adres", -"Delete email address" => "Verwijder email adres", -"Enter phone number" => "Voer telefoonnummer in", -"Delete phone number" => "Verwijdere telefoonnummer", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Verwijder IM", -"View on map" => "Bekijk op een kaart", -"Edit address details" => "Wijzig adres gegevens", -"Add notes here." => "Voeg notitie toe", -"Add field" => "Voeg veld toe", -"Phone" => "Telefoon", -"Email" => "E-mail", -"Instant Messaging" => "Instant Messaging", -"Address" => "Adres", -"Note" => "Notitie", -"Download contact" => "Download contact", -"Delete contact" => "Verwijder contact", -"The temporary image has been removed from cache." => "Het tijdelijke plaatje is uit de cache verwijderd.", -"Edit address" => "Wijzig adres", -"Type" => "Type", -"PO Box" => "Postbus", -"Street address" => "Adres", -"Street and number" => "Straat en nummer", -"Extended" => "Uitgebreide", -"Apartment number etc." => "Apartement nummer", -"City" => "Stad", -"Region" => "Regio", -"E.g. state or province" => "Provincie", -"Zipcode" => "Postcode", -"Postal code" => "Postcode", -"Country" => "Land", -"Addressbook" => "Adresboek", -"Hon. prefixes" => "Hon. prefixes", -"Miss" => "Mw", -"Ms" => "Mw", -"Mr" => "M", -"Sir" => "M", -"Mrs" => "Mw", -"Dr" => "M", -"Given name" => "Voornaam", -"Additional names" => "Extra namen", -"Family name" => "Achternaam", -"Import a contacts file" => "Importeer een contacten bestand", -"Please choose the addressbook" => "Kies een adresboek", -"create a new addressbook" => "Maak een nieuw adresboek", -"Name of new addressbook" => "Naam van nieuw adresboek", -"Importing contacts" => "Importeren van contacten", -"You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek", -"Add contact" => "Contactpersoon toevoegen", -"Select Address Books" => "Selecteer adresboeken", -"Enter name" => "Naam", -"Enter description" => "Beschrijving", -"CardDAV syncing addresses" => "CardDAV synchroniseert de adressen", -"more info" => "meer informatie", -"Primary address (Kontact et al)" => "Standaardadres", -"iOS/OS X" => "IOS/OS X", -"Show CardDav link" => "Laat CardDav link zien", -"Show read-only VCF link" => "Laat alleen lezen VCF link zien", -"Share" => "Deel", -"Download" => "Download", -"Edit" => "Bewerken", -"New Address Book" => "Nieuw Adresboek", -"Name" => "Naam", -"Description" => "Beschrijving", -"Save" => "Opslaan", -"Cancel" => "Anuleren", -"More..." => "Meer..." -); diff --git a/apps/contacts/l10n/nn_NO.php b/apps/contacts/l10n/nn_NO.php deleted file mode 100644 index 2e3ab16da3..0000000000 --- a/apps/contacts/l10n/nn_NO.php +++ /dev/null @@ -1,44 +0,0 @@ - "Ein feil oppstod ved (de)aktivering av adressebok.", -"Error updating addressbook." => "Eit problem oppstod ved å oppdatere adresseboka.", -"There was an error adding the contact." => "Det kom ei feilmelding då kontakta vart lagt til.", -"Cannot add empty property." => "Kan ikkje leggja til tomt felt.", -"At least one of the address fields has to be filled out." => "Minst eit av adressefelta må fyllast ut.", -"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt.", -"Contacts" => "Kotaktar", -"This is not your addressbook." => "Dette er ikkje di adressebok.", -"Contact could not be found." => "Fann ikkje kontakten.", -"Work" => "Arbeid", -"Home" => "Heime", -"Mobile" => "Mobil", -"Text" => "Tekst", -"Voice" => "Tale", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Personsøkjar", -"Birthday" => "Bursdag", -"Contact" => "Kontakt", -"Add Contact" => "Legg til kontakt", -"Addressbooks" => "Adressebøker", -"Organization" => "Organisasjon", -"Delete" => "Slett", -"Preferred" => "Føretrekt", -"Phone" => "Telefonnummer", -"Email" => "Epost", -"Address" => "Adresse", -"Download contact" => "Last ned kontakt", -"Delete contact" => "Slett kontakt", -"Type" => "Skriv", -"PO Box" => "Postboks", -"Extended" => "Utvida", -"City" => "Stad", -"Region" => "Region/fylke", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Addressbook" => "Adressebok", -"Download" => "Last ned", -"Edit" => "Endra", -"New Address Book" => "Ny adressebok", -"Save" => "Lagre", -"Cancel" => "Kanseller" -); diff --git a/apps/contacts/l10n/pl.php b/apps/contacts/l10n/pl.php deleted file mode 100644 index 924622ebb0..0000000000 --- a/apps/contacts/l10n/pl.php +++ /dev/null @@ -1,219 +0,0 @@ - "Błąd (de)aktywowania książki adresowej.", -"id is not set." => "id nie ustawione.", -"Cannot update addressbook with an empty name." => "Nie można zaktualizować książki adresowej z pustą nazwą.", -"Error updating addressbook." => "Błąd uaktualniania książki adresowej.", -"No ID provided" => "Brak opatrzonego ID ", -"Error setting checksum." => "Błąd ustawień sumy kontrolnej", -"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia", -"No address books found." => "Nie znaleziono książek adresowych", -"No contacts found." => "Nie znaleziono kontaktów.", -"There was an error adding the contact." => "Wystąpił błąd podczas dodawania kontaktu.", -"element name is not set." => "nazwa elementu nie jest ustawiona.", -"Could not parse contact: " => "Nie można parsować kontaktu:", -"Cannot add empty property." => "Nie można dodać pustego elementu.", -"At least one of the address fields has to be filled out." => "Należy wypełnić przynajmniej jedno pole adresu.", -"Trying to add duplicate property: " => "Próba dodania z duplikowanej właściwości:", -"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.", -"Missing ID" => "Brak ID", -"Error parsing VCard for ID: \"" => "Wystąpił błąd podczas przetwarzania VCard ID: \"", -"checksum is not set." => "checksum-a nie ustawiona", -"Information about vCard is incorrect. Please reload the page: " => "Informacje na temat vCard są niepoprawne. Proszę przeładuj stronę:", -"Something went FUBAR. " => "Gdyby coś poszło FUBAR.", -"No contact ID was submitted." => "ID kontaktu nie został utworzony.", -"Error reading contact photo." => "Błąd odczytu zdjęcia kontaktu.", -"Error saving temporary file." => "Wystąpił błąd podczas zapisywania pliku tymczasowego.", -"The loading photo is not valid." => "Wczytywane zdjęcie nie jest poprawne.", -"Contact ID is missing." => "Brak kontaktu id.", -"No photo path was submitted." => "Ścieżka do zdjęcia nie została podana.", -"File doesn't exist:" => "Plik nie istnieje:", -"Error loading image." => "Błąd ładowania obrazu.", -"Error getting contact object." => "Błąd pobrania kontaktu.", -"Error getting PHOTO property." => "Błąd uzyskiwania właściwości ZDJĘCIA.", -"Error saving contact." => "Błąd zapisu kontaktu.", -"Error resizing image" => "Błąd zmiany rozmiaru obrazu", -"Error cropping image" => "Błąd przycinania obrazu", -"Error creating temporary image" => "Błąd utworzenia obrazu tymczasowego", -"Error finding image: " => "Błąd znajdowanie obrazu: ", -"Error uploading contacts to storage." => "Wystąpił błąd podczas wysyłania kontaktów do magazynu.", -"There is no error, the file uploaded with success" => "Nie było błędów, plik wyczytano poprawnie.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Załadowany plik przekracza wielkość upload_max_filesize w php.ini ", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Wczytywany plik przekracza wielkość MAX_FILE_SIZE, która została określona w formularzu HTML", -"The uploaded file was only partially uploaded" => "Załadowany plik tylko częściowo został wysłany.", -"No file was uploaded" => "Plik nie został załadowany", -"Missing a temporary folder" => "Brak folderu tymczasowego", -"Couldn't save temporary image: " => "Nie można zapisać obrazu tymczasowego: ", -"Couldn't load temporary image: " => "Nie można wczytać obrazu tymczasowego: ", -"No file was uploaded. Unknown error" => "Plik nie został załadowany. Nieznany błąd", -"Contacts" => "Kontakty", -"Sorry, this functionality has not been implemented yet" => "Niestety, ta funkcja nie została jeszcze zaimplementowana", -"Not implemented" => "Nie wdrożono", -"Couldn't get a valid address." => "Nie można pobrać prawidłowego adresu.", -"Error" => "Błąd", -"This property has to be non-empty." => "Ta właściwość nie może być pusta.", -"Couldn't serialize elements." => "Nie można serializować elementów.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty' wywołana bez argumentu typu. Proszę raportuj na bugs.owncloud.org", -"Edit name" => "Zmień nazwę", -"No files selected for upload." => "Żadne pliki nie zostały zaznaczone do wysłania.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze.", -"Error loading profile picture." => "Błąd wczytywania zdjęcia profilu.", -"Select type" => "Wybierz typ", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Niektóre kontakty są zaznaczone do usunięcia, ale nie są usunięte jeszcze. Proszę czekać na ich usunięcie.", -"Do you want to merge these address books?" => "Czy chcesz scalić te książki adresowe?", -"Result: " => "Wynik: ", -" imported, " => " importowane, ", -" failed." => " nie powiodło się.", -"Displayname cannot be empty." => "Nazwa nie może być pusta.", -"Addressbook not found: " => "Nie znaleziono książki adresowej:", -"This is not your addressbook." => "To nie jest Twoja książka adresowa.", -"Contact could not be found." => "Nie można odnaleźć kontaktu.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GG", -"Work" => "Praca", -"Home" => "Dom", -"Other" => "Inne", -"Mobile" => "Komórka", -"Text" => "Połączenie tekstowe", -"Voice" => "Połączenie głosowe", -"Message" => "Wiadomość", -"Fax" => "Faks", -"Video" => "Połączenie wideo", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Urodziny", -"Business" => "Biznesowe", -"Call" => "Wywołanie", -"Clients" => "Klienci", -"Deliverer" => "Doręczanie", -"Holidays" => "Święta", -"Ideas" => "Pomysły", -"Journey" => "Podróż", -"Jubilee" => "Jubileusz", -"Meeting" => "Spotkanie", -"Personal" => "Osobiste", -"Projects" => "Projekty", -"Questions" => "Pytania", -"{name}'s Birthday" => "{name} Urodzony", -"Contact" => "Kontakt", -"Add Contact" => "Dodaj kontakt", -"Import" => "Import", -"Settings" => "Ustawienia", -"Addressbooks" => "Książki adresowe", -"Close" => "Zamknij", -"Keyboard shortcuts" => "Skróty klawiatury", -"Navigation" => "Nawigacja", -"Next contact in list" => "Następny kontakt na liście", -"Previous contact in list" => "Poprzedni kontakt na liście", -"Expand/collapse current addressbook" => "Rozwiń/Zwiń bieżącą książkę adresową", -"Next addressbook" => "Następna książka adresowa", -"Previous addressbook" => "Poprzednia książka adresowa", -"Actions" => "Akcje", -"Refresh contacts list" => "Odśwież listę kontaktów", -"Add new contact" => "Dodaj nowy kontakt", -"Add new addressbook" => "Dodaj nowa książkę adresową", -"Delete current contact" => "Usuń obecny kontakt", -"Drop photo to upload" => "Upuść fotografię aby załadować", -"Delete current photo" => "Usuń aktualne zdjęcie", -"Edit current photo" => "Edytuj aktualne zdjęcie", -"Upload new photo" => "Wczytaj nowe zdjęcie", -"Select photo from ownCloud" => "Wybierz zdjęcie z ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format niestandardowy, krótkie nazwy, imię i nazwisko, Odwracać lub Odwrócić z przecinkiem", -"Edit name details" => "Edytuj szczegóły nazwy", -"Organization" => "Organizacja", -"Delete" => "Usuwa książkę adresową", -"Nickname" => "Nazwa", -"Enter nickname" => "Wpisz nazwę", -"Web site" => "Strona www", -"http://www.somesite.com" => "http://www.jakasstrona.pl", -"Go to web site" => "Idż do strony www", -"dd-mm-yyyy" => "dd-mm-rrrr", -"Groups" => "Grupy", -"Separate groups with commas" => "Oddziel grupy przecinkami", -"Edit groups" => "Edytuj grupy", -"Preferred" => "Preferowane", -"Please specify a valid email address." => "Określ prawidłowy adres e-mail.", -"Enter email address" => "Wpisz adres email", -"Mail to address" => "Mail na adres", -"Delete email address" => "Usuń adres mailowy", -"Enter phone number" => "Wpisz numer telefonu", -"Delete phone number" => "Usuń numer telefonu", -"View on map" => "Zobacz na mapie", -"Edit address details" => "Edytuj szczegóły adresu", -"Add notes here." => "Dodaj notatkę tutaj.", -"Add field" => "Dodaj pole", -"Phone" => "Telefon", -"Email" => "E-mail", -"Address" => "Adres", -"Note" => "Uwaga", -"Download contact" => "Pobiera kontakt", -"Delete contact" => "Usuwa kontakt", -"The temporary image has been removed from cache." => "Tymczasowy obraz został usunięty z pamięci podręcznej.", -"Edit address" => "Edytuj adres", -"Type" => "Typ", -"PO Box" => "Skrzynka pocztowa", -"Street address" => "Ulica", -"Street and number" => "Ulica i numer", -"Extended" => "Rozszerzony", -"Apartment number etc." => "Numer lokalu", -"City" => "Miasto", -"Region" => "Region", -"E.g. state or province" => "Np. stanu lub prowincji", -"Zipcode" => "Kod pocztowy", -"Postal code" => "Kod pocztowy", -"Country" => "Kraj", -"Addressbook" => "Książka adresowa", -"Hon. prefixes" => "Prefiksy Hon.", -"Miss" => "Panna", -"Ms" => "Ms", -"Mr" => "Pan", -"Sir" => "Sir", -"Mrs" => "Pani", -"Dr" => "Dr", -"Given name" => "Podaj imię", -"Additional names" => "Dodatkowe nazwy", -"Family name" => "Nazwa rodziny", -"Hon. suffixes" => "Sufiksy Hon.", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importuj plik z kontaktami", -"Please choose the addressbook" => "Proszę wybrać książkę adresową", -"create a new addressbook" => "utwórz nową książkę adresową", -"Name of new addressbook" => "Nazwa nowej książki adresowej", -"Importing contacts" => "importuj kontakty", -"You have no contacts in your addressbook." => "Nie masz żadnych kontaktów w swojej książce adresowej.", -"Add contact" => "Dodaj kontakt", -"Select Address Books" => "Wybierz książki adresowe", -"Enter name" => "Wpisz nazwę", -"Enter description" => "Wprowadź opis", -"CardDAV syncing addresses" => "adres do synchronizacji CardDAV", -"more info" => "więcej informacji", -"Primary address (Kontact et al)" => "Pierwszy adres", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Pokaż link CardDAV", -"Show read-only VCF link" => "Pokaż tylko do odczytu łącze VCF", -"Share" => "Udostępnij", -"Download" => "Pobiera książkę adresową", -"Edit" => "Edytuje książkę adresową", -"New Address Book" => "Nowa książka adresowa", -"Name" => "Nazwa", -"Description" => "Opis", -"Save" => "Zapisz", -"Cancel" => "Anuluj", -"More..." => "Więcej..." -); diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php deleted file mode 100644 index de43e6cbb0..0000000000 --- a/apps/contacts/l10n/pt_BR.php +++ /dev/null @@ -1,158 +0,0 @@ - "Erro ao (des)ativar agenda.", -"id is not set." => "ID não definido.", -"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.", -"Error updating addressbook." => "Erro ao atualizar agenda.", -"No ID provided" => "Nenhum ID fornecido", -"Error setting checksum." => "Erro ajustando checksum.", -"No categories selected for deletion." => "Nenhum categoria selecionada para remoção.", -"No address books found." => "Nenhuma agenda de endereços encontrada.", -"No contacts found." => "Nenhum contato encontrado.", -"There was an error adding the contact." => "Ocorreu um erro ao adicionar o contato.", -"element name is not set." => "nome do elemento não definido.", -"Cannot add empty property." => "Não é possível adicionar propriedade vazia.", -"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço tem que ser preenchido.", -"Trying to add duplicate property: " => "Tentando adiciona propriedade duplicada:", -"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.", -"Missing ID" => "Faltando ID", -"Error parsing VCard for ID: \"" => "Erro de identificação VCard para ID:", -"checksum is not set." => "checksum não definido.", -"Information about vCard is incorrect. Please reload the page: " => "Informação sobre vCard incorreto. Por favor, recarregue a página:", -"Something went FUBAR. " => "Something went FUBAR. ", -"No contact ID was submitted." => "Nenhum ID do contato foi submetido.", -"Error reading contact photo." => "Erro de leitura na foto do contato.", -"Error saving temporary file." => "Erro ao salvar arquivo temporário.", -"The loading photo is not valid." => "Foto carregada não é válida.", -"Contact ID is missing." => "ID do contato está faltando.", -"No photo path was submitted." => "Nenhum caminho para foto foi submetido.", -"File doesn't exist:" => "Arquivo não existe:", -"Error loading image." => "Erro ao carregar imagem.", -"Error getting contact object." => "Erro ao obter propriedade de contato.", -"Error getting PHOTO property." => "Erro ao obter propriedade da FOTO.", -"Error saving contact." => "Erro ao salvar contato.", -"Error resizing image" => "Erro ao modificar tamanho da imagem", -"Error cropping image" => "Erro ao recortar imagem", -"Error creating temporary image" => "Erro ao criar imagem temporária", -"Error finding image: " => "Erro ao localizar imagem:", -"Error uploading contacts to storage." => "Erro enviando contatos para armazenamento.", -"There is no error, the file uploaded with success" => "Arquivo enviado com sucesso", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O arquivo enviado excede a diretiva upload_max_filesize em php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O arquivo carregado excede o argumento MAX_FILE_SIZE especificado no formulário HTML", -"The uploaded file was only partially uploaded" => "O arquivo foi parcialmente carregado", -"No file was uploaded" => "Nenhum arquivo carregado", -"Missing a temporary folder" => "Diretório temporário não encontrado", -"Couldn't save temporary image: " => "Não foi possível salvar a imagem temporária:", -"Couldn't load temporary image: " => "Não foi possível carregar a imagem temporária:", -"No file was uploaded. Unknown error" => "Nenhum arquivo foi transferido. Erro desconhecido", -"Contacts" => "Contatos", -"Sorry, this functionality has not been implemented yet" => "Desculpe, esta funcionalidade não foi implementada ainda", -"Not implemented" => "não implementado", -"Couldn't get a valid address." => "Não foi possível obter um endereço válido.", -"Error" => "Erro", -"This property has to be non-empty." => "Esta propriedade não pode estar vazia.", -"Couldn't serialize elements." => "Não foi possível serializar elementos.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" chamado sem argumento de tipo. Por favor, informe a bugs.owncloud.org", -"Edit name" => "Editar nome", -"No files selected for upload." => "Nenhum arquivo selecionado para carregar.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O arquivo que você está tentando carregar excede o tamanho máximo para este servidor.", -"Select type" => "Selecione o tipo", -"Result: " => "Resultado:", -" imported, " => "importado,", -" failed." => "falhou.", -"This is not your addressbook." => "Esta não é a sua agenda de endereços.", -"Contact could not be found." => "Contato não pôde ser encontrado.", -"Work" => "Trabalho", -"Home" => "Home", -"Mobile" => "Móvel", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensagem", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Aniversário", -"{name}'s Birthday" => "Aniversário de {name}", -"Contact" => "Contato", -"Add Contact" => "Adicionar Contato", -"Import" => "Importar", -"Addressbooks" => "Agendas de Endereço", -"Close" => "Fechar.", -"Drop photo to upload" => "Arraste a foto para ser carregada", -"Delete current photo" => "Deletar imagem atual", -"Edit current photo" => "Editar imagem atual", -"Upload new photo" => "Carregar nova foto", -"Select photo from ownCloud" => "Selecionar foto do OwnCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter com vírgula", -"Edit name details" => "Editar detalhes do nome", -"Organization" => "Organização", -"Delete" => "Excluir", -"Nickname" => "Apelido", -"Enter nickname" => "Digite o apelido", -"dd-mm-yyyy" => "dd-mm-aaaa", -"Groups" => "Grupos", -"Separate groups with commas" => "Separe grupos por virgula", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor, especifique um email válido.", -"Enter email address" => "Digite um endereço de email", -"Mail to address" => "Correio para endereço", -"Delete email address" => "Remover endereço de email", -"Enter phone number" => "Digite um número de telefone", -"Delete phone number" => "Remover número de telefone", -"View on map" => "Visualizar no mapa", -"Edit address details" => "Editar detalhes de endereço", -"Add notes here." => "Adicionar notas", -"Add field" => "Adicionar campo", -"Phone" => "Telefone", -"Email" => "E-mail", -"Address" => "Endereço", -"Note" => "Nota", -"Download contact" => "Baixar contato", -"Delete contact" => "Apagar contato", -"The temporary image has been removed from cache." => "A imagem temporária foi removida cache.", -"Edit address" => "Editar endereço", -"Type" => "Digite", -"PO Box" => "Caixa Postal", -"Extended" => "Estendido", -"City" => "Cidade", -"Region" => "Região", -"Zipcode" => "CEP", -"Country" => "País", -"Addressbook" => "Agenda de Endereço", -"Hon. prefixes" => "Exmo. Prefixos ", -"Miss" => "Senhorita", -"Ms" => "Srta.", -"Mr" => "Sr.", -"Sir" => "Senhor", -"Mrs" => "Sra.", -"Dr" => "Dr", -"Given name" => "Primeiro Nome", -"Additional names" => "Segundo Nome", -"Family name" => "Sobrenome", -"Hon. suffixes" => "Exmo. Sufixos", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importar arquivos de contato.", -"Please choose the addressbook" => "Por favor, selecione uma agenda de endereços", -"create a new addressbook" => "Criar nova agenda de endereços", -"Name of new addressbook" => "Nome da nova agenda de endereços", -"Importing contacts" => "Importar contatos", -"You have no contacts in your addressbook." => "Voce não tem contatos em sua agenda de endereços.", -"Add contact" => "Adicionar contatos", -"CardDAV syncing addresses" => "Sincronizando endereços CardDAV", -"more info" => "leia mais", -"Primary address (Kontact et al)" => "Endereço primário(Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Download" => "Baixar", -"Edit" => "Editar", -"New Address Book" => "Nova agenda", -"Save" => "Salvar", -"Cancel" => "Cancelar" -); diff --git a/apps/contacts/l10n/pt_PT.php b/apps/contacts/l10n/pt_PT.php deleted file mode 100644 index 38708c8620..0000000000 --- a/apps/contacts/l10n/pt_PT.php +++ /dev/null @@ -1,224 +0,0 @@ - "Erro a (des)ativar o livro de endereços", -"id is not set." => "id não está definido", -"Cannot update addressbook with an empty name." => "Não é possivel actualizar o livro de endereços com o nome vazio.", -"Error updating addressbook." => "Erro a atualizar o livro de endereços", -"No ID provided" => "Nenhum ID inserido", -"Error setting checksum." => "Erro a definir checksum.", -"No categories selected for deletion." => "Nenhuma categoria selecionada para eliminar.", -"No address books found." => "Nenhum livro de endereços encontrado.", -"No contacts found." => "Nenhum contacto encontrado.", -"There was an error adding the contact." => "Erro ao adicionar contato", -"element name is not set." => "o nome do elemento não está definido.", -"Could not parse contact: " => "Incapaz de processar contacto", -"Cannot add empty property." => "Não é possivel adicionar uma propriedade vazia", -"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço precisa de estar preenchido", -"Trying to add duplicate property: " => "A tentar adicionar propriedade duplicada: ", -"Missing IM parameter." => "Falta o parâmetro de mensagens instantâneas (IM)", -"Unknown IM: " => "Mensagens instantâneas desconhecida (IM)", -"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", -"Missing ID" => "Falta ID", -"Error parsing VCard for ID: \"" => "Erro a analisar VCard para o ID: \"", -"checksum is not set." => "Checksum não está definido.", -"Information about vCard is incorrect. Please reload the page: " => "A informação sobre o VCard está incorrecta. Por favor refresque a página: ", -"Something went FUBAR. " => "Algo provocou um FUBAR. ", -"No contact ID was submitted." => "Nenhum ID de contacto definido.", -"Error reading contact photo." => "Erro a ler a foto do contacto.", -"Error saving temporary file." => "Erro a guardar ficheiro temporário.", -"The loading photo is not valid." => "A foto carregada não é valida.", -"Contact ID is missing." => "Falta o ID do contacto.", -"No photo path was submitted." => "Nenhum caminho da foto definido.", -"File doesn't exist:" => "O ficheiro não existe:", -"Error loading image." => "Erro a carregar a imagem.", -"Error getting contact object." => "Erro a obter o objecto dos contactos", -"Error getting PHOTO property." => "Erro a obter a propriedade Foto", -"Error saving contact." => "Erro a guardar o contacto.", -"Error resizing image" => "Erro a redimensionar a imagem", -"Error cropping image" => "Erro a recorar a imagem", -"Error creating temporary image" => "Erro a criar a imagem temporária", -"Error finding image: " => "Erro enquanto pesquisava pela imagem: ", -"Error uploading contacts to storage." => "Erro a carregar os contactos para o armazenamento.", -"There is no error, the file uploaded with success" => "Não ocorreu erros, o ficheiro foi submetido com sucesso", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O tamanho do ficheiro carregado excede o parametro upload_max_filesize em php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O tamanho do ficheiro carregado ultrapassa o valor MAX_FILE_SIZE definido no formulário HTML", -"The uploaded file was only partially uploaded" => "O ficheiro seleccionado foi apenas carregado parcialmente", -"No file was uploaded" => "Nenhum ficheiro foi submetido", -"Missing a temporary folder" => "Está a faltar a pasta temporária", -"Couldn't save temporary image: " => "Não foi possível guardar a imagem temporária: ", -"Couldn't load temporary image: " => "Não é possível carregar a imagem temporária: ", -"No file was uploaded. Unknown error" => "Nenhum ficheiro foi carregado. Erro desconhecido", -"Contacts" => "Contactos", -"Sorry, this functionality has not been implemented yet" => "Desculpe, esta funcionalidade ainda não está implementada", -"Not implemented" => "Não implementado", -"Couldn't get a valid address." => "Não foi possível obter um endereço válido.", -"Error" => "Erro", -"This property has to be non-empty." => "Esta propriedade não pode estar vazia.", -"Couldn't serialize elements." => "Não foi possivel serializar os elementos", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamada sem argumento definido. Por favor report o problema em bugs.owncloud.org", -"Edit name" => "Editar nome", -"No files selected for upload." => "Nenhum ficheiro seleccionado para enviar.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor.", -"Error loading profile picture." => "Erro ao carregar imagem de perfil.", -"Select type" => "Seleccionar tipo", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contactos forma marcados para apagar, mas ainda não foram apagados. Por favor espere que ele sejam apagados.", -"Do you want to merge these address books?" => "Quer fundir estes Livros de endereços?", -"Result: " => "Resultado: ", -" imported, " => " importado, ", -" failed." => " falhou.", -"Displayname cannot be empty." => "Displayname não pode ser vazio", -"Addressbook not found: " => "Livro de endereços não encontrado.", -"This is not your addressbook." => "Esta não é a sua lista de contactos", -"Contact could not be found." => "O contacto não foi encontrado", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Emprego", -"Home" => "Casa", -"Other" => "Outro", -"Mobile" => "Telemovel", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensagem", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Aniversário", -"Business" => "Empresa", -"Call" => "Telefonar", -"Clients" => "Clientes", -"Deliverer" => "Fornecedor", -"Holidays" => "Férias", -"Ideas" => "Ideias", -"Journey" => "Viagem", -"Jubilee" => "Jubileu", -"Meeting" => "Encontro", -"Personal" => "Pessoal", -"Projects" => "Projectos", -"Questions" => "Questões", -"{name}'s Birthday" => "Aniversário de {name}", -"Contact" => "Contacto", -"Add Contact" => "Adicionar Contacto", -"Import" => "Importar", -"Settings" => "Configurações", -"Addressbooks" => "Livros de endereços", -"Close" => "Fechar", -"Keyboard shortcuts" => "Atalhos de teclado", -"Navigation" => "Navegação", -"Next contact in list" => "Próximo contacto na lista", -"Previous contact in list" => "Contacto anterior na lista", -"Expand/collapse current addressbook" => "Expandir/encolher o livro de endereços atual", -"Next addressbook" => "Próximo livro de endereços", -"Previous addressbook" => "Livro de endereços anterior", -"Actions" => "Ações", -"Refresh contacts list" => "Recarregar lista de contactos", -"Add new contact" => "Adicionar novo contacto", -"Add new addressbook" => "Adicionar novo Livro de endereços", -"Delete current contact" => "Apagar o contacto atual", -"Drop photo to upload" => "Arraste e solte fotos para carregar", -"Delete current photo" => "Eliminar a foto actual", -"Edit current photo" => "Editar a foto actual", -"Upload new photo" => "Carregar nova foto", -"Select photo from ownCloud" => "Selecionar uma foto da ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formate personalizado, Nome curto, Nome completo, Reverso ou Reverso com virgula", -"Edit name details" => "Editar detalhes do nome", -"Organization" => "Organização", -"Delete" => "Apagar", -"Nickname" => "Alcunha", -"Enter nickname" => "Introduza alcunha", -"Web site" => "Página web", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Ir para página web", -"dd-mm-yyyy" => "dd-mm-aaaa", -"Groups" => "Grupos", -"Separate groups with commas" => "Separe os grupos usando virgulas", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor indique um endereço de correio válido", -"Enter email address" => "Introduza endereço de email", -"Mail to address" => "Enviar correio para o endereço", -"Delete email address" => "Eliminar o endereço de correio", -"Enter phone number" => "Insira o número de telefone", -"Delete phone number" => "Eliminar o número de telefone", -"Instant Messenger" => "Mensageiro instantâneo", -"Delete IM" => "Apagar mensageiro instantâneo (IM)", -"View on map" => "Ver no mapa", -"Edit address details" => "Editar os detalhes do endereço", -"Add notes here." => "Insira notas aqui.", -"Add field" => "Adicionar campo", -"Phone" => "Telefone", -"Email" => "Email", -"Instant Messaging" => "Mensagens Instantâneas", -"Address" => "Morada", -"Note" => "Nota", -"Download contact" => "Transferir contacto", -"Delete contact" => "Apagar contato", -"The temporary image has been removed from cache." => "A imagem temporária foi retirada do cache.", -"Edit address" => "Editar endereço", -"Type" => "Tipo", -"PO Box" => "Apartado", -"Street address" => "Endereço da Rua", -"Street and number" => "Rua e número", -"Extended" => "Extendido", -"Apartment number etc." => "Número de Apartamento, etc.", -"City" => "Cidade", -"Region" => "Região", -"E.g. state or province" => "Por Ex. Estado ou província", -"Zipcode" => "Código Postal", -"Postal code" => "Código Postal", -"Country" => "País", -"Addressbook" => "Livro de endereços", -"Hon. prefixes" => "Prefixos honoráveis", -"Miss" => "Menina", -"Ms" => "Sra", -"Mr" => "Sr", -"Sir" => "Sr", -"Mrs" => "Senhora", -"Dr" => "Dr", -"Given name" => "Nome introduzido", -"Additional names" => "Nomes adicionais", -"Family name" => "Nome de familia", -"Hon. suffixes" => "Sufixos Honoráveis", -"J.D." => "D.J.", -"M.D." => "D.M.", -"D.O." => "Dr.", -"D.C." => "Dr.", -"Ph.D." => "Dr.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "r.", -"Import a contacts file" => "Importar um ficheiro de contactos", -"Please choose the addressbook" => "Por favor seleccione o livro de endereços", -"create a new addressbook" => "Criar um novo livro de endereços", -"Name of new addressbook" => "Nome do novo livro de endereços", -"Importing contacts" => "A importar os contactos", -"You have no contacts in your addressbook." => "Não tem contactos no seu livro de endereços.", -"Add contact" => "Adicionar contacto", -"Select Address Books" => "Selecionar Livros de contactos", -"Enter name" => "Introduzir nome", -"Enter description" => "Introduzir descrição", -"CardDAV syncing addresses" => "CardDAV a sincronizar endereços", -"more info" => "mais informação", -"Primary address (Kontact et al)" => "Endereço primario (Kontact et al)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Mostrar ligação CardDAV", -"Show read-only VCF link" => "Mostrar ligações VCF só de leitura", -"Share" => "Partilhar", -"Download" => "Transferir", -"Edit" => "Editar", -"New Address Book" => "Novo livro de endereços", -"Name" => "Nome", -"Description" => "Descrição", -"Save" => "Guardar", -"Cancel" => "Cancelar", -"More..." => "Mais..." -); diff --git a/apps/contacts/l10n/ro.php b/apps/contacts/l10n/ro.php deleted file mode 100644 index 291e8d54f7..0000000000 --- a/apps/contacts/l10n/ro.php +++ /dev/null @@ -1,76 +0,0 @@ - "(Dez)activarea agendei a întâmpinat o eroare.", -"id is not set." => "ID-ul nu este stabilit", -"Error updating addressbook." => "Eroare la actualizarea agendei.", -"No ID provided" => "Nici un ID nu a fost furnizat", -"Error setting checksum." => "Eroare la stabilirea sumei de control", -"No categories selected for deletion." => "Nici o categorie selectată pentru ștergere", -"No address books found." => "Nici o carte de adrese găsită", -"No contacts found." => "Nici un contact găsit", -"There was an error adding the contact." => "O eroare a împiedicat adăugarea contactului.", -"element name is not set." => "numele elementului nu este stabilit.", -"Cannot add empty property." => "Nu se poate adăuga un câmp gol.", -"At least one of the address fields has to be filled out." => "Cel puțin unul din câmpurile adresei trebuie completat.", -"Information about vCard is incorrect. Please reload the page." => "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina.", -"Missing ID" => "ID lipsă", -"Error parsing VCard for ID: \"" => "Eroare la prelucrarea VCard-ului pentru ID:\"", -"checksum is not set." => "suma de control nu este stabilită.", -"No contact ID was submitted." => "Nici un ID de contact nu a fost transmis", -"Error reading contact photo." => "Eroare la citerea fotografiei de contact", -"Error saving temporary file." => "Eroare la salvarea fișierului temporar.", -"The loading photo is not valid." => "Fotografia care se încarcă nu este validă.", -"Contact ID is missing." => "ID-ul de contact lipsește.", -"No photo path was submitted." => "Nici o adresă către fotografie nu a fost transmisă", -"File doesn't exist:" => "Fișierul nu există:", -"Error loading image." => "Eroare la încărcarea imaginii.", -"Contacts" => "Contacte", -"This is not your addressbook." => "Nu se găsește în agendă.", -"Contact could not be found." => "Contactul nu a putut fi găsit.", -"Work" => "Servicu", -"Home" => "Acasă", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Voce", -"Message" => "Mesaj", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Zi de naștere", -"{name}'s Birthday" => "Ziua de naștere a {name}", -"Contact" => "Contact", -"Add Contact" => "Adaugă contact", -"Addressbooks" => "Agende", -"Edit name details" => "Introdu detalii despre nume", -"Organization" => "Organizație", -"Delete" => "Șterge", -"Nickname" => "Pseudonim", -"Enter nickname" => "Introdu pseudonim", -"dd-mm-yyyy" => "zz-ll-aaaa", -"Groups" => "Grupuri", -"Separate groups with commas" => "Separă grupurile cu virgule", -"Edit groups" => "Editează grupuri", -"Preferred" => "Preferat", -"Please specify a valid email address." => "Te rog să specifici un e-mail corect", -"Enter email address" => "Introdu adresa de e-mail", -"Mail to address" => "Trimite mesaj la e-mail", -"Delete email address" => "Șterge e-mail", -"Phone" => "Telefon", -"Email" => "Email", -"Address" => "Adresă", -"Download contact" => "Descarcă acest contact", -"Delete contact" => "Șterge contact", -"Type" => "Tip", -"PO Box" => "CP", -"Extended" => "Extins", -"City" => "Oraș", -"Region" => "Regiune", -"Zipcode" => "Cod poștal", -"Country" => "Țară", -"Addressbook" => "Agendă", -"Download" => "Descarcă", -"Edit" => "Editează", -"New Address Book" => "Agendă nouă", -"Save" => "Salvează", -"Cancel" => "Anulează" -); diff --git a/apps/contacts/l10n/ru.php b/apps/contacts/l10n/ru.php deleted file mode 100644 index eaeb385d3b..0000000000 --- a/apps/contacts/l10n/ru.php +++ /dev/null @@ -1,229 +0,0 @@ - "Ошибка (де)активации адресной книги.", -"id is not set." => "id не установлен.", -"Cannot update addressbook with an empty name." => "Нельзя обновить адресную книгу с пустым именем.", -"Error updating addressbook." => "Ошибка обновления адресной книги.", -"No ID provided" => "ID не предоставлен", -"Error setting checksum." => "Ошибка установки контрольной суммы.", -"No categories selected for deletion." => "Категории для удаления не установлены.", -"No address books found." => "Адресные книги не найдены.", -"No contacts found." => "Контакты не найдены.", -"There was an error adding the contact." => "Произошла ошибка при добавлении контакта.", -"element name is not set." => "имя элемента не установлено.", -"Could not parse contact: " => "Невозможно распознать контакт:", -"Cannot add empty property." => "Невозможно добавить пустой параметр.", -"At least one of the address fields has to be filled out." => "Как минимум одно поле адреса должно быть заполнено.", -"Trying to add duplicate property: " => "При попытке добавить дубликат:", -"Missing IM parameter." => "Отсутствует параметр IM.", -"Unknown IM: " => "Неизвестный IM:", -"Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", -"Missing ID" => "Отсутствует ID", -"Error parsing VCard for ID: \"" => "Ошибка обработки VCard для ID: \"", -"checksum is not set." => "контрольная сумма не установлена.", -"Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", -"Something went FUBAR. " => "Что-то пошло FUBAR.", -"No contact ID was submitted." => "Нет контакта ID", -"Error reading contact photo." => "Ошибка чтения фотографии контакта.", -"Error saving temporary file." => "Ошибка сохранения временного файла.", -"The loading photo is not valid." => "Загружаемая фотография испорчена.", -"Contact ID is missing." => "ID контакта отсутствует.", -"No photo path was submitted." => "Нет фото по адресу.", -"File doesn't exist:" => "Файл не существует:", -"Error loading image." => "Ошибка загрузки картинки.", -"Error getting contact object." => "Ошибка при получении контактов", -"Error getting PHOTO property." => "Ошибка при получении ФОТО.", -"Error saving contact." => "Ошибка при сохранении контактов.", -"Error resizing image" => "Ошибка изменения размера изображений", -"Error cropping image" => "Ошибка обрезки изображений", -"Error creating temporary image" => "Ошибка создания временных изображений", -"Error finding image: " => "Ошибка поиска изображений:", -"Error uploading contacts to storage." => "Ошибка загрузки контактов в хранилище.", -"There is no error, the file uploaded with success" => "Файл загружен успешно.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Загружаемый файл первосходит значение переменной upload_max_filesize, установленно в php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Загружаемый файл превосходит значение переменной MAX_FILE_SIZE, указанной в форме HTML", -"The uploaded file was only partially uploaded" => "Файл загружен частично", -"No file was uploaded" => "Файл не был загружен", -"Missing a temporary folder" => "Отсутствует временная папка", -"Couldn't save temporary image: " => "Не удалось сохранить временное изображение:", -"Couldn't load temporary image: " => "Не удалось загрузить временное изображение:", -"No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка", -"Contacts" => "Контакты", -"Sorry, this functionality has not been implemented yet" => "К сожалению, эта функция не была реализована", -"Not implemented" => "Не реализовано", -"Couldn't get a valid address." => "Не удалось получить адрес.", -"Error" => "Ошибка", -"You do not have permission to add contacts to " => "У вас нет разрешений добавлять контакты в", -"Please select one of your own address books." => "Выберите одну из ваших собственных адресных книг.", -"Permission error" => "Ошибка доступа", -"This property has to be non-empty." => "Это свойство должно быть не пустым.", -"Couldn't serialize elements." => "Не удалось сериализовать элементы.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' called without type argument. Please report at bugs.owncloud.org", -"Edit name" => "Изменить имя", -"No files selected for upload." => "Нет выбранных файлов для загрузки.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Файл, который вы пытаетесь загрузить превышать максимальный размер загружаемых файлов на этом сервере.", -"Error loading profile picture." => "Ошибка загрузки изображения профиля.", -"Select type" => "Выберите тип", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются.", -"Do you want to merge these address books?" => "Вы хотите соединить эти адресные книги?", -"Result: " => "Результат:", -" imported, " => "импортировано, ", -" failed." => "не удалось.", -"Displayname cannot be empty." => "Отображаемое имя не может быть пустым.", -"Addressbook not found: " => "Адресная книга не найдена:", -"This is not your addressbook." => "Это не ваша адресная книга.", -"Contact could not be found." => "Контакт не найден.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Рабочий", -"Home" => "Домашний", -"Other" => "Другое", -"Mobile" => "Мобильный", -"Text" => "Текст", -"Voice" => "Голос", -"Message" => "Сообщение", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пейджер", -"Internet" => "Интернет", -"Birthday" => "День рождения", -"Business" => "Бизнес", -"Call" => "Вызов", -"Clients" => "Клиенты", -"Deliverer" => "Посыльный", -"Holidays" => "Праздники", -"Ideas" => "Идеи", -"Journey" => "Поездка", -"Jubilee" => "Юбилей", -"Meeting" => "Встреча", -"Personal" => "Личный", -"Projects" => "Проекты", -"Questions" => "Вопросы", -"{name}'s Birthday" => "День рождения {name}", -"Contact" => "Контакт", -"You do not have the permissions to edit this contact." => "У вас нет разрешений редактировать этот контакт.", -"You do not have the permissions to delete this contact." => "У вас нет разрешений удалять этот контакт.", -"Add Contact" => "Добавить Контакт", -"Import" => "Импорт", -"Settings" => "Настройки", -"Addressbooks" => "Адресные книги", -"Close" => "Закрыть", -"Keyboard shortcuts" => "Горячие клавиши", -"Navigation" => "Навигация", -"Next contact in list" => "Следующий контакт в списке", -"Previous contact in list" => "Предыдущий контакт в списке", -"Expand/collapse current addressbook" => "Развернуть/свернуть текущую адресную книгу", -"Next addressbook" => "Следующая адресная книга", -"Previous addressbook" => "Предыдущая адресная книга", -"Actions" => "Действия", -"Refresh contacts list" => "Обновить список контактов", -"Add new contact" => "Добавить новый контакт", -"Add new addressbook" => "Добавить новую адресную книгу", -"Delete current contact" => "Удалить текущий контакт", -"Drop photo to upload" => "Перетяните фотографии для загрузки", -"Delete current photo" => "Удалить текущую фотографию", -"Edit current photo" => "Редактировать текущую фотографию", -"Upload new photo" => "Загрузить новую фотографию", -"Select photo from ownCloud" => "Выбрать фотографию из ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Формат Краткое имя, Полное имя", -"Edit name details" => "Изменить детали имени", -"Organization" => "Организация", -"Delete" => "Удалить", -"Nickname" => "Псевдоним", -"Enter nickname" => "Введите псевдоним", -"Web site" => "Веб-сайт", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Перейти на веб-сайт", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Группы", -"Separate groups with commas" => "Разделить группы запятыми", -"Edit groups" => "Редактировать группы", -"Preferred" => "Предпочитаемый", -"Please specify a valid email address." => "Укажите действительный адрес электронной почты.", -"Enter email address" => "Укажите адрес электронной почты", -"Mail to address" => "Написать по адресу", -"Delete email address" => "Удалить адрес электронной почты", -"Enter phone number" => "Ввести номер телефона", -"Delete phone number" => "Удалить номер телефона", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Удалить IM", -"View on map" => "Показать на карте", -"Edit address details" => "Ввести детали адреса", -"Add notes here." => "Добавьте заметки здесь.", -"Add field" => "Добавить поле", -"Phone" => "Телефон", -"Email" => "Ящик эл. почты", -"Instant Messaging" => "Быстрые сообщения", -"Address" => "Адрес", -"Note" => "Заметка", -"Download contact" => "Скачать контакт", -"Delete contact" => "Удалить контакт", -"The temporary image has been removed from cache." => "Временный образ был удален из кэша.", -"Edit address" => "Редактировать адрес", -"Type" => "Тип", -"PO Box" => "АО", -"Street address" => "Улица", -"Street and number" => "Улица и дом", -"Extended" => "Расширенный", -"Apartment number etc." => "Номер квартиры и т.д.", -"City" => "Город", -"Region" => "Область", -"E.g. state or province" => "Например, область или район", -"Zipcode" => "Почтовый индекс", -"Postal code" => "Почтовый индекс", -"Country" => "Страна", -"Addressbook" => "Адресная книга", -"Hon. prefixes" => "Уважительные префиксы", -"Miss" => "Мисс", -"Ms" => "Г-жа", -"Mr" => "Г-н", -"Sir" => "Сэр", -"Mrs" => "Г-жа", -"Dr" => "Доктор", -"Given name" => "Имя", -"Additional names" => "Дополнительные имена (отчество)", -"Family name" => "Фамилия", -"Hon. suffixes" => "Hon. suffixes", -"J.D." => "Уважительные суффиксы", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Загрузить файл контактов", -"Please choose the addressbook" => "Выберите адресную книгу", -"create a new addressbook" => "создать новую адресную книгу", -"Name of new addressbook" => "Имя новой адресной книги", -"Importing contacts" => "Импорт контактов", -"You have no contacts in your addressbook." => "В адресной книге нет контактов.", -"Add contact" => "Добавить контакт", -"Select Address Books" => "Выбрать адресную книгу", -"Enter name" => "Введите имя", -"Enter description" => "Ввдите описание", -"CardDAV syncing addresses" => "CardDAV синхронизации адресов", -"more info" => "дополнительная информация", -"Primary address (Kontact et al)" => "Первичный адрес (Kontact и др.)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Показать ссылку CardDav", -"Show read-only VCF link" => "Показать нередактируемую ссылку VCF", -"Share" => "Опубликовать", -"Download" => "Скачать", -"Edit" => "Редактировать", -"New Address Book" => "Новая адресная книга", -"Name" => "Имя", -"Description" => "Описание", -"Save" => "Сохранить", -"Cancel" => "Отменить", -"More..." => "Ещё..." -); diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php deleted file mode 100644 index 8295b32a6f..0000000000 --- a/apps/contacts/l10n/sk_SK.php +++ /dev/null @@ -1,178 +0,0 @@ - "Chyba (de)aktivácie adresára.", -"id is not set." => "ID nie je nastavené.", -"Cannot update addressbook with an empty name." => "Nedá sa upraviť adresár s prázdnym menom.", -"Error updating addressbook." => "Chyba aktualizácie adresára.", -"No ID provided" => "ID nezadané", -"Error setting checksum." => "Chyba pri nastavovaní kontrolného súčtu.", -"No categories selected for deletion." => "Žiadne kategórie neboli vybraté na odstránenie.", -"No address books found." => "Žiadny adresár nenájdený.", -"No contacts found." => "Žiadne kontakty nenájdené.", -"There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.", -"element name is not set." => "meno elementu nie je nastavené.", -"Cannot add empty property." => "Nemôžem pridať prázdny údaj.", -"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.", -"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:", -"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.", -"Missing ID" => "Chýba ID", -"Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:", -"checksum is not set." => "kontrolný súčet nie je nastavený.", -"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Niečo sa pokazilo.", -"No contact ID was submitted." => "Nebolo nastavené ID kontaktu.", -"Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.", -"Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.", -"The loading photo is not valid." => "Načítaná fotka je vadná.", -"Contact ID is missing." => "Chýba ID kontaktu.", -"No photo path was submitted." => "Žiadna fotka nebola poslaná.", -"File doesn't exist:" => "Súbor neexistuje:", -"Error loading image." => "Chyba pri nahrávaní obrázka.", -"Error getting contact object." => "Chyba počas prevzatia objektu kontakt.", -"Error getting PHOTO property." => "Chyba počas získavania fotky.", -"Error saving contact." => "Chyba počas ukladania kontaktu.", -"Error resizing image" => "Chyba počas zmeny obrázku.", -"Error cropping image" => "Chyba počas orezania obrázku.", -"Error creating temporary image" => "Chyba počas vytvárania dočasného obrázku.", -"Error finding image: " => "Chyba vyhľadania obrázku: ", -"Error uploading contacts to storage." => "Chyba pri ukladaní kontaktov na úložisko.", -"There is no error, the file uploaded with success" => "Nevyskytla sa žiadna chyba, súbor úspešne uložené.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ukladaný súbor prekračuje nastavenie upload_max_filesize v php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.", -"The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne", -"No file was uploaded" => "Žiadny súbor nebol uložený", -"Missing a temporary folder" => "Chýba dočasný priečinok", -"Couldn't save temporary image: " => "Nemôžem uložiť dočasný obrázok: ", -"Couldn't load temporary image: " => "Nemôžem načítať dočasný obrázok: ", -"No file was uploaded. Unknown error" => "Žiaden súbor nebol odoslaný. Neznáma chyba", -"Contacts" => "Kontakty", -"Sorry, this functionality has not been implemented yet" => "Bohužiaľ, táto funkcia ešte nebola implementovaná", -"Not implemented" => "Neimplementované", -"Couldn't get a valid address." => "Nemôžem získať platnú adresu.", -"Error" => "Chyba", -"This property has to be non-empty." => "Tento parameter nemôže byť prázdny.", -"Couldn't serialize elements." => "Nemôžem previesť prvky.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' zavolané bez argument. Prosím oznámte chybu na bugs.owncloud.org", -"Edit name" => "Upraviť meno", -"No files selected for upload." => "Žiadne súbory neboli vybrané k nahratiu", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Súbor, ktorý sa pokúšate nahrať, presahuje maximálnu povolenú veľkosť.", -"Select type" => "Vybrať typ", -"Result: " => "Výsledok: ", -" imported, " => " importovaných, ", -" failed." => " zlyhaných.", -"This is not your addressbook." => "Toto nie je váš adresár.", -"Contact could not be found." => "Kontakt nebol nájdený.", -"Work" => "Práca", -"Home" => "Domov", -"Other" => "Iné", -"Mobile" => "Mobil", -"Text" => "SMS", -"Voice" => "Odkazová schránka", -"Message" => "Správa", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Birthday" => "Narodeniny", -"Business" => "Biznis", -"Clients" => "Klienti", -"Holidays" => "Prázdniny", -"Meeting" => "Stretnutie", -"Projects" => "Projekty", -"Questions" => "Otázky", -"{name}'s Birthday" => "Narodeniny {name}", -"Contact" => "Kontakt", -"Add Contact" => "Pridať Kontakt.", -"Import" => "Importovať", -"Addressbooks" => "Adresáre", -"Close" => "Zatvoriť", -"Keyboard shortcuts" => "Klávesové skratky", -"Navigation" => "Navigácia", -"Next contact in list" => "Ďalší kontakt v zozname", -"Previous contact in list" => "Predchádzajúci kontakt v zozname", -"Actions" => "Akcie", -"Refresh contacts list" => "Obnov zoznam kontaktov", -"Add new contact" => "Pridaj nový kontakt", -"Add new addressbook" => "Pridaj nový adresár", -"Delete current contact" => "Vymaž súčasný kontakt", -"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie", -"Delete current photo" => "Odstrániť súčasnú fotku", -"Edit current photo" => "Upraviť súčasnú fotku", -"Upload new photo" => "Nahrať novú fotku", -"Select photo from ownCloud" => "Vybrať fotku z ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami", -"Edit name details" => "Upraviť podrobnosti mena", -"Organization" => "Organizácia", -"Delete" => "Odstrániť", -"Nickname" => "Prezývka", -"Enter nickname" => "Zadajte prezývku", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupiny", -"Separate groups with commas" => "Oddelte skupiny čiarkami", -"Edit groups" => "Úprava skupín", -"Preferred" => "Uprednostňované", -"Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.", -"Enter email address" => "Zadajte e-mailové adresy", -"Mail to address" => "Odoslať na adresu", -"Delete email address" => "Odstrániť e-mailové adresy", -"Enter phone number" => "Zadajte telefónne číslo", -"Delete phone number" => "Odstrániť telefónne číslo", -"View on map" => "Zobraziť na mape", -"Edit address details" => "Upraviť podrobnosti adresy", -"Add notes here." => "Tu môžete pridať poznámky.", -"Add field" => "Pridať pole", -"Phone" => "Telefón", -"Email" => "E-mail", -"Address" => "Adresa", -"Note" => "Poznámka", -"Download contact" => "Stiahnuť kontakt", -"Delete contact" => "Odstrániť kontakt", -"The temporary image has been removed from cache." => "Dočasný obrázok bol odstránený z cache.", -"Edit address" => "Upraviť adresu", -"Type" => "Typ", -"PO Box" => "PO Box", -"Street address" => "Ulica", -"Street and number" => "Ulica a číslo", -"Extended" => "Rozšírené", -"City" => "Mesto", -"Region" => "Región", -"Zipcode" => "PSČ", -"Postal code" => "PSČ", -"Country" => "Krajina", -"Addressbook" => "Adresár", -"Hon. prefixes" => "Tituly pred", -"Miss" => "Slečna", -"Ms" => "Pani", -"Mr" => "Pán", -"Sir" => "Sir", -"Mrs" => "Pani", -"Dr" => "Dr.", -"Given name" => "Krstné meno", -"Additional names" => "Ďalšie mená", -"Family name" => "Priezvisko", -"Hon. suffixes" => "Tituly za", -"J.D." => "JUDr.", -"M.D." => "MUDr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "ml.", -"Sn." => "st.", -"Import a contacts file" => "Importovať súbor kontaktu", -"Please choose the addressbook" => "Prosím zvolte adresár", -"create a new addressbook" => "vytvoriť nový adresár", -"Name of new addressbook" => "Meno nového adresára", -"Importing contacts" => "Importovanie kontaktov", -"You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.", -"Add contact" => "Pridať kontakt", -"Enter name" => "Zadaj meno", -"CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV", -"more info" => "viac informácií", -"Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X", -"Download" => "Stiahnuť", -"Edit" => "Upraviť", -"New Address Book" => "Nový adresár", -"Save" => "Uložiť", -"Cancel" => "Zrušiť" -); diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php deleted file mode 100644 index fe0e8ef16c..0000000000 --- a/apps/contacts/l10n/sl.php +++ /dev/null @@ -1,229 +0,0 @@ - "Napaka med (de)aktivacijo imenika.", -"id is not set." => "id ni nastavljen.", -"Cannot update addressbook with an empty name." => "Ne morem posodobiti imenika s praznim imenom.", -"Error updating addressbook." => "Napaka pri posodabljanju imenika.", -"No ID provided" => "ID ni bil podan", -"Error setting checksum." => "Napaka pri nastavljanju nadzorne vsote.", -"No categories selected for deletion." => "Nobena kategorija ni bila izbrana za izbris.", -"No address books found." => "Ni bilo najdenih imenikov.", -"No contacts found." => "Ni bilo najdenih stikov.", -"There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake", -"element name is not set." => "ime elementa ni nastavljeno.", -"Could not parse contact: " => "Ne morem razčleniti stika:", -"Cannot add empty property." => "Ne morem dodati prazne lastnosti.", -"At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.", -"Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:", -"Missing IM parameter." => "Manjkajoč IM parameter.", -"Unknown IM: " => "Neznan IM:", -"Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.", -"Missing ID" => "Manjkajoč ID", -"Error parsing VCard for ID: \"" => "Napaka pri razčlenjevanju VCard za ID: \"", -"checksum is not set." => "nadzorna vsota ni nastavljena.", -"Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ", -"Something went FUBAR. " => "Nekaj je šlo v franže. ", -"No contact ID was submitted." => "ID stika ni bil poslan.", -"Error reading contact photo." => "Napaka pri branju slike stika.", -"Error saving temporary file." => "Napaka pri shranjevanju začasne datoteke.", -"The loading photo is not valid." => "Slika, ki se nalaga ni veljavna.", -"Contact ID is missing." => "Manjka ID stika.", -"No photo path was submitted." => "Pot slike ni bila poslana.", -"File doesn't exist:" => "Datoteka ne obstaja:", -"Error loading image." => "Napaka pri nalaganju slike.", -"Error getting contact object." => "Napaka pri pridobivanju kontakta predmeta.", -"Error getting PHOTO property." => "Napaka pri pridobivanju lastnosti fotografije.", -"Error saving contact." => "Napaka pri shranjevanju stika.", -"Error resizing image" => "Napaka pri spreminjanju velikosti slike", -"Error cropping image" => "Napaka pri obrezovanju slike", -"Error creating temporary image" => "Napaka pri ustvarjanju začasne slike", -"Error finding image: " => "Napaka pri iskanju datoteke: ", -"Error uploading contacts to storage." => "Napaka pri nalaganju stikov v hrambo.", -"There is no error, the file uploaded with success" => "Datoteka je bila uspešno naložena.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu", -"The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena", -"No file was uploaded" => "Nobena datoteka ni bila naložena", -"Missing a temporary folder" => "Manjka začasna mapa", -"Couldn't save temporary image: " => "Začasne slike ni bilo mogoče shraniti: ", -"Couldn't load temporary image: " => "Začasne slike ni bilo mogoče naložiti: ", -"No file was uploaded. Unknown error" => "Nobena datoteka ni bila naložena. Neznana napaka", -"Contacts" => "Stiki", -"Sorry, this functionality has not been implemented yet" => "Žal ta funkcionalnost še ni podprta", -"Not implemented" => "Ni podprto", -"Couldn't get a valid address." => "Ne morem dobiti veljavnega naslova.", -"Error" => "Napaka", -"You do not have permission to add contacts to " => "Nimate dovoljenja za dodajanje stikov v", -"Please select one of your own address books." => "Prosimo, če izberete enega izmed vaših adresarjev.", -"Permission error" => "Napaka dovoljenj", -"This property has to be non-empty." => "Ta lastnost ne sme biti prazna", -"Couldn't serialize elements." => "Predmetov ni bilo mogoče dati v zaporedje.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" je bila klicana brez vrste argumenta. Prosimo, če oddate poročilo o napaki na bugs.owncloud.org", -"Edit name" => "Uredi ime", -"No files selected for upload." => "Nobena datoteka ni bila izbrana za nalaganje.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteka, ki jo poskušate naložiti, presega največjo dovoljeno velikost za nalaganje na tem strežniku.", -"Error loading profile picture." => "Napaka pri nalaganju slike profila.", -"Select type" => "Izberite vrsto", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nekateri stiki so označeni za izbris, vendar še niso izbrisani. Prosimo, če počakate na njihov izbris.", -"Do you want to merge these address books?" => "Ali želite združiti adresarje?", -"Result: " => "Rezultati: ", -" imported, " => " uvoženih, ", -" failed." => " je spodletelo.", -"Displayname cannot be empty." => "Ime za prikaz ne more biti prazno.", -"Addressbook not found: " => "Adresar ni bil najden:", -"This is not your addressbook." => "To ni vaš imenik.", -"Contact could not be found." => "Stika ni bilo mogoče najti.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Delo", -"Home" => "Doma", -"Other" => "Drugo", -"Mobile" => "Mobilni telefon", -"Text" => "Besedilo", -"Voice" => "Glas", -"Message" => "Sporočilo", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pozivnik", -"Internet" => "Internet", -"Birthday" => "Rojstni dan", -"Business" => "Poslovno", -"Call" => "Klic", -"Clients" => "Stranka", -"Deliverer" => "Dostavljalec", -"Holidays" => "Prazniki", -"Ideas" => "Ideje", -"Journey" => "Potovanje", -"Jubilee" => "Jubilej", -"Meeting" => "Sestanek", -"Personal" => "Osebno", -"Projects" => "Projekti", -"Questions" => "Vprašanja", -"{name}'s Birthday" => "{name} - rojstni dan", -"Contact" => "Stik", -"You do not have the permissions to edit this contact." => "Nimate dovoljenj za urejanje tega stika.", -"You do not have the permissions to delete this contact." => "Nimate dovoljenj za izbris tega stika.", -"Add Contact" => "Dodaj stik", -"Import" => "Uvozi", -"Settings" => "Nastavitve", -"Addressbooks" => "Imeniki", -"Close" => "Zapri", -"Keyboard shortcuts" => "Bližnjice na tipkovnici", -"Navigation" => "Krmarjenje", -"Next contact in list" => "Naslednji stik na seznamu", -"Previous contact in list" => "Predhodni stik na seznamu", -"Expand/collapse current addressbook" => "Razširi/skrči trenutni adresar", -"Next addressbook" => "Naslednji adresar", -"Previous addressbook" => "Predhodni adresar", -"Actions" => "Dejanja", -"Refresh contacts list" => "Osveži seznam stikov", -"Add new contact" => "Dodaj nov stik", -"Add new addressbook" => "Dodaj nov adresar", -"Delete current contact" => "Izbriši trenutni stik", -"Drop photo to upload" => "Spustite sliko tukaj, da bi jo naložili", -"Delete current photo" => "Izbriši trenutno sliko", -"Edit current photo" => "Uredi trenutno sliko", -"Upload new photo" => "Naloži novo sliko", -"Select photo from ownCloud" => "Izberi sliko iz ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico", -"Edit name details" => "Uredite podrobnosti imena", -"Organization" => "Organizacija", -"Delete" => "Izbriši", -"Nickname" => "Vzdevek", -"Enter nickname" => "Vnesite vzdevek", -"Web site" => "Spletna stran", -"http://www.somesite.com" => "http://www.nekastran.si", -"Go to web site" => "Pojdi na spletno stran", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupine", -"Separate groups with commas" => "Skupine ločite z vejicami", -"Edit groups" => "Uredi skupine", -"Preferred" => "Prednosten", -"Please specify a valid email address." => "Prosimo, če navedete veljaven e-poštni naslov.", -"Enter email address" => "Vnesite e-poštni naslov", -"Mail to address" => "E-pošta naslovnika", -"Delete email address" => "Izbriši e-poštni naslov", -"Enter phone number" => "Vpiši telefonsko številko", -"Delete phone number" => "Izbriši telefonsko številko", -"Instant Messenger" => "Takojšni sporočilnik", -"Delete IM" => "Izbriši IM", -"View on map" => "Prikaz na zemljevidu", -"Edit address details" => "Uredi podrobnosti", -"Add notes here." => "Opombe dodajte tukaj.", -"Add field" => "Dodaj polje", -"Phone" => "Telefon", -"Email" => "E-pošta", -"Instant Messaging" => "Neposredno sporočanje", -"Address" => "Naslov", -"Note" => "Opomba", -"Download contact" => "Prenesi stik", -"Delete contact" => "Izbriši stik", -"The temporary image has been removed from cache." => "Začasna slika je bila odstranjena iz predpomnilnika.", -"Edit address" => "Uredi naslov", -"Type" => "Vrsta", -"PO Box" => "Poštni predal", -"Street address" => "Ulični naslov", -"Street and number" => "Ulica in štelika", -"Extended" => "Razširjeno", -"Apartment number etc." => "Številka stanovanja itd.", -"City" => "Mesto", -"Region" => "Regija", -"E.g. state or province" => "Npr. dežela ali pokrajina", -"Zipcode" => "Poštna št.", -"Postal code" => "Poštna številka", -"Country" => "Dežela", -"Addressbook" => "Imenik", -"Hon. prefixes" => "Predpone", -"Miss" => "gdč.", -"Ms" => "ga.", -"Mr" => "g.", -"Sir" => "g.", -"Mrs" => "ga.", -"Dr" => "dr.", -"Given name" => "Ime", -"Additional names" => "Dodatna imena", -"Family name" => "Priimek", -"Hon. suffixes" => "Pripone", -"J.D." => "univ. dipl. prav.", -"M.D." => "dr. med.", -"D.O." => "dr. med., spec. spl. med.", -"D.C." => "dr. med., spec. kiropraktike", -"Ph.D." => "dr.", -"Esq." => "Esq.", -"Jr." => "mlajši", -"Sn." => "starejši", -"Import a contacts file" => "Uvozi datoteko s stiki", -"Please choose the addressbook" => "Prosimo, če izberete imenik", -"create a new addressbook" => "Ustvari nov imenik", -"Name of new addressbook" => "Ime novega imenika", -"Importing contacts" => "Uvažam stike", -"You have no contacts in your addressbook." => "V vašem imeniku ni stikov.", -"Add contact" => "Dodaj stik", -"Select Address Books" => "Izberite adresarje", -"Enter name" => "Vnesite ime", -"Enter description" => "Vnesite opis", -"CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo", -"more info" => "več informacij", -"Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Pokaži CardDav povezavo", -"Show read-only VCF link" => "Pokaži VCF povezavo samo za branje", -"Share" => "Souporaba", -"Download" => "Prenesi", -"Edit" => "Uredi", -"New Address Book" => "Nov imenik", -"Name" => "Ime", -"Description" => "Opis", -"Save" => "Shrani", -"Cancel" => "Prekliči", -"More..." => "Več..." -); diff --git a/apps/contacts/l10n/sr.php b/apps/contacts/l10n/sr.php deleted file mode 100644 index f54741c182..0000000000 --- a/apps/contacts/l10n/sr.php +++ /dev/null @@ -1,39 +0,0 @@ - "Подаци о вКарти су неисправни. Поново учитајте страницу.", -"Contacts" => "Контакти", -"This is not your addressbook." => "Ово није ваш адресар.", -"Contact could not be found." => "Контакт се не може наћи.", -"Work" => "Посао", -"Home" => "Кућа", -"Mobile" => "Мобилни", -"Text" => "Текст", -"Voice" => "Глас", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пејџер", -"Birthday" => "Рођендан", -"Contact" => "Контакт", -"Add Contact" => "Додај контакт", -"Addressbooks" => "Адресар", -"Organization" => "Организација", -"Delete" => "Обриши", -"Preferred" => "Пожељан", -"Phone" => "Телефон", -"Email" => "Е-маил", -"Address" => "Адреса", -"Download contact" => "Преузми контакт", -"Delete contact" => "Обриши контакт", -"Type" => "Тип", -"PO Box" => "Поштански број", -"Extended" => "Прошири", -"City" => "Град", -"Region" => "Регија", -"Zipcode" => "Зип код", -"Country" => "Земља", -"Addressbook" => "Адресар", -"Download" => "Преузимање", -"Edit" => "Уреди", -"New Address Book" => "Нови адресар", -"Save" => "Сними", -"Cancel" => "Откажи" -); diff --git a/apps/contacts/l10n/sr@latin.php b/apps/contacts/l10n/sr@latin.php deleted file mode 100644 index f06539ab43..0000000000 --- a/apps/contacts/l10n/sr@latin.php +++ /dev/null @@ -1,27 +0,0 @@ - "Podaci o vKarti su neispravni. Ponovo učitajte stranicu.", -"This is not your addressbook." => "Ovo nije vaš adresar.", -"Contact could not be found." => "Kontakt se ne može naći.", -"Work" => "Posao", -"Home" => "Kuća", -"Mobile" => "Mobilni", -"Text" => "Tekst", -"Voice" => "Glas", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pejdžer", -"Birthday" => "Rođendan", -"Add Contact" => "Dodaj kontakt", -"Organization" => "Organizacija", -"Delete" => "Obriši", -"Phone" => "Telefon", -"Email" => "E-mail", -"Address" => "Adresa", -"PO Box" => "Poštanski broj", -"Extended" => "Proširi", -"City" => "Grad", -"Region" => "Regija", -"Zipcode" => "Zip kod", -"Country" => "Zemlja", -"Edit" => "Uredi" -); diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php deleted file mode 100644 index 88aac866f6..0000000000 --- a/apps/contacts/l10n/sv.php +++ /dev/null @@ -1,229 +0,0 @@ - "Fel (av)aktivera adressbok.", -"id is not set." => "ID är inte satt.", -"Cannot update addressbook with an empty name." => "Kan inte uppdatera adressboken med ett tomt namn.", -"Error updating addressbook." => "Fel uppstod när adressbok skulle uppdateras.", -"No ID provided" => "Inget ID angett", -"Error setting checksum." => "Fel uppstod när kontrollsumma skulle sättas.", -"No categories selected for deletion." => "Inga kategorier valda för borttaging", -"No address books found." => "Ingen adressbok funnen.", -"No contacts found." => "Inga kontakter funna.", -"There was an error adding the contact." => "Det uppstod ett fel när kontakten skulle läggas till.", -"element name is not set." => "elementnamn ej angett.", -"Could not parse contact: " => "Kunde inte läsa kontakt:", -"Cannot add empty property." => "Kan inte lägga till en tom egenskap.", -"At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i.", -"Trying to add duplicate property: " => "Försöker lägga till dubblett:", -"Missing IM parameter." => "IM parameter saknas.", -"Unknown IM: " => "Okänt IM:", -"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.", -"Missing ID" => "ID saknas", -"Error parsing VCard for ID: \"" => "Fel vid läsning av VCard för ID: \"", -"checksum is not set." => "kontrollsumma är inte satt.", -"Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:", -"Something went FUBAR. " => "Något gick fel.", -"No contact ID was submitted." => "Inget kontakt-ID angavs.", -"Error reading contact photo." => "Fel uppstod vid läsning av kontaktfoto.", -"Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.", -"The loading photo is not valid." => "Det laddade fotot är inte giltigt.", -"Contact ID is missing." => "Kontakt-ID saknas.", -"No photo path was submitted." => "Ingen sökväg till foto angavs.", -"File doesn't exist:" => "Filen existerar inte.", -"Error loading image." => "Fel uppstod när bild laddades.", -"Error getting contact object." => "Fel vid hämtning av kontakt.", -"Error getting PHOTO property." => "Fel vid hämtning av egenskaper för FOTO.", -"Error saving contact." => "Fel vid sparande av kontakt.", -"Error resizing image" => "Fel vid storleksförändring av bilden", -"Error cropping image" => "Fel vid beskärning av bilden", -"Error creating temporary image" => "Fel vid skapande av tillfällig bild", -"Error finding image: " => "Kunde inte hitta bild:", -"Error uploading contacts to storage." => "Fel uppstod när kontakt skulle lagras.", -"There is no error, the file uploaded with success" => "Inga fel uppstod. Filen laddades upp utan problem.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överskrider MAX_FILE_SIZE direktivet som har angetts i HTML formuläret", -"The uploaded file was only partially uploaded" => "Den uppladdade filen var bara delvist uppladdad", -"No file was uploaded" => "Ingen fil laddades upp", -"Missing a temporary folder" => "En temporär mapp saknas", -"Couldn't save temporary image: " => "Kunde inte spara tillfällig bild:", -"Couldn't load temporary image: " => "Kunde inte ladda tillfällig bild:", -"No file was uploaded. Unknown error" => "Ingen fil uppladdad. Okänt fel", -"Contacts" => "Kontakter", -"Sorry, this functionality has not been implemented yet" => "Tyvärr är denna funktion inte införd än", -"Not implemented" => "Inte införd", -"Couldn't get a valid address." => "Kunde inte hitta en giltig adress.", -"Error" => "Fel", -"You do not have permission to add contacts to " => "Du saknar behörighet att skapa kontakter i", -"Please select one of your own address books." => "Välj en av dina egna adressböcker.", -"Permission error" => "Behörighetsfel", -"This property has to be non-empty." => "Denna egenskap får inte vara tom.", -"Couldn't serialize elements." => "Kunde inte serialisera element.", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org", -"Edit name" => "Ändra namn", -"No files selected for upload." => "Inga filer valda för uppladdning", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server.", -"Error loading profile picture." => "Fel vid hämtning av profilbild.", -"Select type" => "Välj typ", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Vissa kontakter är markerade för radering, men är inte raderade än. Vänta tills dom är raderade.", -"Do you want to merge these address books?" => "Vill du slå samman dessa adressböcker?", -"Result: " => "Resultat:", -" imported, " => "importerad,", -" failed." => "misslyckades.", -"Displayname cannot be empty." => "Visningsnamn får inte vara tomt.", -"Addressbook not found: " => "Adressboken hittades inte:", -"This is not your addressbook." => "Det här är inte din adressbok.", -"Contact could not be found." => "Kontakt kunde inte hittas.", -"Jabber" => "Jabber", -"AIM" => "AIM", -"MSN" => "MSN", -"Twitter" => "Twitter", -"GoogleTalk" => "GoogleTalk", -"Facebook" => "Facebook", -"XMPP" => "XMPP", -"ICQ" => "ICQ", -"Yahoo" => "Yahoo", -"Skype" => "Skype", -"QQ" => "QQ", -"GaduGadu" => "GaduGadu", -"Work" => "Arbete", -"Home" => "Hem", -"Other" => "Annat", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Röst", -"Message" => "Meddelande", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Personsökare", -"Internet" => "Internet", -"Birthday" => "Födelsedag", -"Business" => "Företag", -"Call" => "Ring", -"Clients" => "Kunder", -"Deliverer" => "Leverera", -"Holidays" => "Helgdagar", -"Ideas" => "Idéer", -"Journey" => "Resa", -"Jubilee" => "Jubileum", -"Meeting" => "Möte", -"Personal" => "Privat", -"Projects" => "Projekt", -"Questions" => "Frågor", -"{name}'s Birthday" => "{name}'s födelsedag", -"Contact" => "Kontakt", -"You do not have the permissions to edit this contact." => "Du saknar behörighet för att ändra denna kontakt.", -"You do not have the permissions to delete this contact." => "Du saknar behörighet för att radera denna kontakt.", -"Add Contact" => "Lägg till kontakt", -"Import" => "Importera", -"Settings" => "Inställningar", -"Addressbooks" => "Adressböcker", -"Close" => "Stäng", -"Keyboard shortcuts" => "Kortkommandon", -"Navigation" => "Navigering", -"Next contact in list" => "Nästa kontakt i listan", -"Previous contact in list" => "Föregående kontakt i listan", -"Expand/collapse current addressbook" => "Visa/dölj aktuell adressbok", -"Next addressbook" => "Nästa adressbok", -"Previous addressbook" => "Föregående adressbok", -"Actions" => "Åtgärder", -"Refresh contacts list" => "Uppdatera kontaktlistan", -"Add new contact" => "Lägg till ny kontakt", -"Add new addressbook" => "Lägg till ny adressbok", -"Delete current contact" => "Radera denna kontakt", -"Drop photo to upload" => "Släpp foto för att ladda upp", -"Delete current photo" => "Ta bort aktuellt foto", -"Edit current photo" => "Redigera aktuellt foto", -"Upload new photo" => "Ladda upp ett nytt foto", -"Select photo from ownCloud" => "Välj foto från ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma", -"Edit name details" => "Redigera detaljer för namn", -"Organization" => "Organisation", -"Delete" => "Radera", -"Nickname" => "Smeknamn", -"Enter nickname" => "Ange smeknamn", -"Web site" => "Webbplats", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Gå till webbplats", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Separera grupperna med kommatecken", -"Edit groups" => "Editera grupper", -"Preferred" => "Föredragen", -"Please specify a valid email address." => "Vänligen ange en giltig e-postadress.", -"Enter email address" => "Ange e-postadress", -"Mail to address" => "Posta till adress.", -"Delete email address" => "Ta bort e-postadress", -"Enter phone number" => "Ange telefonnummer", -"Delete phone number" => "Ta bort telefonnummer", -"Instant Messenger" => "Instant Messenger", -"Delete IM" => "Radera IM", -"View on map" => "Visa på karta", -"Edit address details" => "Redigera detaljer för adress", -"Add notes here." => "Lägg till noteringar här.", -"Add field" => "Lägg till fält", -"Phone" => "Telefon", -"Email" => "E-post", -"Instant Messaging" => "Instant Messaging", -"Address" => "Adress", -"Note" => "Notering", -"Download contact" => "Ladda ner kontakt", -"Delete contact" => "Radera kontakt", -"The temporary image has been removed from cache." => "Den tillfälliga bilden har raderats från cache.", -"Edit address" => "Editera adress", -"Type" => "Typ", -"PO Box" => "Postbox", -"Street address" => "Gatuadress", -"Street and number" => "Gata och nummer", -"Extended" => "Utökad", -"Apartment number etc." => "Lägenhetsnummer", -"City" => "Stad", -"Region" => "Län", -"E.g. state or province" => "T.ex. stat eller provins", -"Zipcode" => "Postnummer", -"Postal code" => "Postnummer", -"Country" => "Land", -"Addressbook" => "Adressbok", -"Hon. prefixes" => "Ledande titlar", -"Miss" => "Fröken", -"Ms" => "Fru", -"Mr" => "Herr", -"Sir" => "Herr", -"Mrs" => "Fru", -"Dr" => "Dr.", -"Given name" => "Förnamn", -"Additional names" => "Mellannamn", -"Family name" => "Efternamn", -"Hon. suffixes" => "Efterställda titlar", -"J.D." => "Kand. Jur.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Fil.dr.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Importera en kontaktfil", -"Please choose the addressbook" => "Vänligen välj adressboken", -"create a new addressbook" => "skapa en ny adressbok", -"Name of new addressbook" => "Namn för ny adressbok", -"Importing contacts" => "Importerar kontakter", -"You have no contacts in your addressbook." => "Du har inga kontakter i din adressbok.", -"Add contact" => "Lägg till en kontakt", -"Select Address Books" => "Välj adressböcker", -"Enter name" => "Ange namn", -"Enter description" => "Ange beskrivning", -"CardDAV syncing addresses" => "CardDAV synkningsadresser", -"more info" => "mer information", -"Primary address (Kontact et al)" => "Primär adress (Kontakt o.a.)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "Visa CardDav-länk", -"Show read-only VCF link" => "Visa skrivskyddad VCF-länk", -"Share" => "Dela", -"Download" => "Nedladdning", -"Edit" => "Redigera", -"New Address Book" => "Ny adressbok", -"Name" => "Namn", -"Description" => "Beskrivning", -"Save" => "Spara", -"Cancel" => "Avbryt", -"More..." => "Mer..." -); diff --git a/apps/contacts/l10n/th_TH.php b/apps/contacts/l10n/th_TH.php deleted file mode 100644 index facdd62b7b..0000000000 --- a/apps/contacts/l10n/th_TH.php +++ /dev/null @@ -1,207 +0,0 @@ - "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่", -"id is not set." => "ยังไม่ได้กำหนดรหัส", -"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", -"Error updating addressbook." => "เกิดข้อผิดพลาดในการอัพเดทสมุดบันทึกที่อยู่", -"No ID provided" => "ยังไม่ได้ใส่รหัส", -"Error setting checksum." => "เกิดข้อผิดพลาดในการตั้งค่า checksum", -"No categories selected for deletion." => "ยังไม่ได้เลือกหมวดหมู่ที่ต้องการลบ", -"No address books found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", -"No contacts found." => "ไม่พบข้อมูลการติดต่อที่ต้องการ", -"There was an error adding the contact." => "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่", -"element name is not set." => "ยังไม่ได้กำหนดชื่อ", -"Could not parse contact: " => "ไม่สามารถแจกแจงรายชื่อผู้ติดต่อได้", -"Cannot add empty property." => "ไม่สามารถเพิ่มรายละเอียดที่ไม่มีข้อมูลได้", -"At least one of the address fields has to be filled out." => "อย่างน้อยที่สุดช่องข้อมูลที่อยู่จะต้องถูกกรอกลงไป", -"Trying to add duplicate property: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ", -"Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง", -"Missing ID" => "รหัสสูญหาย", -"Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"", -"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum", -"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ", -"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ", -"No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา", -"Error reading contact photo." => "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ", -"Error saving temporary file." => "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว", -"The loading photo is not valid." => "โหลดรูปภาพไม่ถูกต้อง", -"Contact ID is missing." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย", -"No photo path was submitted." => "ไม่พบตำแหน่งพาธของรูปภาพ", -"File doesn't exist:" => "ไม่มีไฟล์ดังกล่าว", -"Error loading image." => "เกิดข้อผิดพลาดในการโหลดรูปภาพ", -"Error getting contact object." => "เกิดข้อผิดพลาดในการดึงข้อมูลติดต่อ", -"Error getting PHOTO property." => "เกิดข้อผิดพลาดในการดึงคุณสมบัติของรูปภาพ", -"Error saving contact." => "เกิดข้อผิดพลาดในการบันทึกข้อมูลผู้ติดต่อ", -"Error resizing image" => "เกิดข้อผิดพลาดในการปรับขนาดรูปภาพ", -"Error cropping image" => "เกิดข้อผิดพลาดในการครอบตัดภาพ", -"Error creating temporary image" => "เกิดข้อผิดพลาดในการสร้างรูปภาพชั่วคราว", -"Error finding image: " => "เกิดข้อผิดพลาดในการค้นหารูปภาพ: ", -"Error uploading contacts to storage." => "เกิดข้อผิดพลาดในการอัพโหลดข้อมูลการติดต่อไปยังพื้นที่จัดเก็บข้อมูล", -"There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง MAX_FILE_SIZE ที่ถูกระบุไว้ในรูปแบบของ HTML", -"The uploaded file was only partially uploaded" => "ไฟล์ถูกอัพโหลดได้เพียงบางส่วนเท่านั้น", -"No file was uploaded" => "ไม่มีไฟล์ที่ถูกอัพโหลด", -"Missing a temporary folder" => "โฟลเดอร์ชั่วคราวเกิดการสูญหาย", -"Couldn't save temporary image: " => "ไม่สามารถบันทึกรูปภาพชั่วคราวได้: ", -"Couldn't load temporary image: " => "ไม่สามารถโหลดรูปภาพชั่วคราวได้: ", -"No file was uploaded. Unknown error" => "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", -"Contacts" => "ข้อมูลการติดต่อ", -"Sorry, this functionality has not been implemented yet" => "ขออภัย, ฟังก์ชั่นการทำงานนี้ยังไม่ได้ถูกดำเนินการ", -"Not implemented" => "ยังไม่ได้ถูกดำเนินการ", -"Couldn't get a valid address." => "ไม่สามารถดึงที่อยู่ที่ถูกต้องได้", -"Error" => "พบข้อผิดพลาด", -"This property has to be non-empty." => "คุณสมบัตินี้ต้องไม่มีข้อมูลว่างอยู่", -"Couldn't serialize elements." => "ไม่สามารถทำสัญลักษณ์องค์ประกอบต่างๆให้เป็นตัวเลขตามลำดับได้", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' ถูกเรียกใช้โดยไม่มีอาร์กิวเมนต์ กรุณาแจ้งได้ที่ bugs.owncloud.org", -"Edit name" => "แก้ไขชื่อ", -"No files selected for upload." => "ยังไม่ได้เลือกไฟล์ำสำหรับอัพโหลด", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณกำลังพยายามที่จะอัพโหลดมีขนาดเกินจำนวนสูงสุดที่สามารถอัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", -"Error loading profile picture." => "เกิดข้อผิดพลาดในการโหลดรูปภาพประจำตัว", -"Select type" => "เลือกชนิด", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "ข้อมูลผู้ติดต่อบางรายการได้ถูกทำเครื่องหมายสำหรับลบทิ้งเอาไว้, แต่ยังไม่ได้ถูกลบทิ้ง, กรุณารอให้รายการดังกล่าวถูกลบทิ้งเสียก่อน", -"Do you want to merge these address books?" => "คุณต้องการผสานข้อมูลสมุดบันทึกที่อยู่เหล่านี้หรือไม่?", -"Result: " => "ผลลัพธ์: ", -" imported, " => " นำเข้าข้อมูลแล้ว, ", -" failed." => " ล้มเหลว.", -"Displayname cannot be empty." => "ชื่อที่ใช้แสดงไม่สามารถเว้นว่างได้", -"Addressbook not found: " => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", -"This is not your addressbook." => "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ", -"Contact could not be found." => "ไม่พบข้อมูลการติดต่อ", -"Work" => "ที่ทำงาน", -"Home" => "บ้าน", -"Other" => "อื่นๆ", -"Mobile" => "มือถือ", -"Text" => "ข้อความ", -"Voice" => "เสียงพูด", -"Message" => "ข้อความ", -"Fax" => "โทรสาร", -"Video" => "วีดีโอ", -"Pager" => "เพจเจอร์", -"Internet" => "อินเทอร์เน็ต", -"Birthday" => "วันเกิด", -"Business" => "ธุรกิจ", -"Call" => "โทร", -"Clients" => "ลูกค้า", -"Deliverer" => "ผู้จัดส่ง", -"Holidays" => "วันหยุด", -"Ideas" => "ไอเดีย", -"Journey" => "การเดินทาง", -"Jubilee" => "งานเฉลิมฉลอง", -"Meeting" => "ประชุม", -"Personal" => "ส่วนตัว", -"Projects" => "โปรเจค", -"Questions" => "คำถาม", -"{name}'s Birthday" => "วันเกิดของ {name}", -"Contact" => "ข้อมูลการติดต่อ", -"Add Contact" => "เพิ่มรายชื่อผู้ติดต่อใหม่", -"Import" => "นำเข้า", -"Settings" => "ตั้งค่า", -"Addressbooks" => "สมุดบันทึกที่อยู่", -"Close" => "ปิด", -"Keyboard shortcuts" => "ปุ่มลัด", -"Navigation" => "ระบบเมนู", -"Next contact in list" => "ข้อมูลผู้ติดต่อถัดไปในรายการ", -"Previous contact in list" => "ข้อมูลผู้ติดต่อก่อนหน้าในรายการ", -"Expand/collapse current addressbook" => "ขยาย/ย่อ สมุดบันทึกที่อยู่ปัจจุบัน", -"Next addressbook" => "สมุดบันทึกที่อยู่ถัดไป", -"Previous addressbook" => "สมุดบันทึกที่อยู่ก่อนหน้า", -"Actions" => "การกระทำ", -"Refresh contacts list" => "รีเฟรชรายชื่อผู้ติดต่อใหม่", -"Add new contact" => "เพิ่มข้อมูลผู้ติดต่อใหม่", -"Add new addressbook" => "เพิ่มสมุดบันทึกที่อยู่ใหม่", -"Delete current contact" => "ลบข้อมูลผู้ติดต่อปัจจุบัน", -"Drop photo to upload" => "วางรูปภาพที่ต้องการอัพโหลด", -"Delete current photo" => "ลบรูปภาพปัจจุบัน", -"Edit current photo" => "แก้ไขรูปภาพปัจจุบัน", -"Upload new photo" => "อัพโหลดรูปภาพใหม่", -"Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง", -"Edit name details" => "แก้ไขรายละเอียดของชื่อ", -"Organization" => "หน่วยงาน", -"Delete" => "ลบ", -"Nickname" => "ชื่อเล่น", -"Enter nickname" => "กรอกชื่อเล่น", -"Web site" => "เว็บไซต์", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "ไปที่เว็บไซต์", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "กลุ่ม", -"Separate groups with commas" => "คั่นระหว่างรายชื่อกลุ่มด้วยเครื่องหมายจุลภาีคหรือคอมม่า", -"Edit groups" => "แก้ไขกลุ่ม", -"Preferred" => "พิเศษ", -"Please specify a valid email address." => "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง", -"Enter email address" => "กรอกที่อยู่อีเมล", -"Mail to address" => "ส่งอีเมลไปที่", -"Delete email address" => "ลบที่อยู่อีเมล", -"Enter phone number" => "กรอกหมายเลขโทรศัพท์", -"Delete phone number" => "ลบหมายเลขโทรศัพท์", -"View on map" => "ดูบนแผนที่", -"Edit address details" => "แก้ไขรายละเอียดที่อยู่", -"Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่", -"Add field" => "เพิ่มช่องรับข้อมูล", -"Phone" => "โทรศัพท์", -"Email" => "อีเมล์", -"Address" => "ที่อยู่", -"Note" => "หมายเหตุ", -"Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", -"Delete contact" => "ลบข้อมูลการติดต่อ", -"The temporary image has been removed from cache." => "รูปภาพชั่วคราวดังกล่าวได้ถูกลบออกจากหน่วยความจำแคชแล้ว", -"Edit address" => "แก้ไขที่อยู่", -"Type" => "ประเภท", -"PO Box" => "ตู้ ปณ.", -"Street address" => "ที่อยู่", -"Street and number" => "ถนนและหมายเลข", -"Extended" => "เพิ่ม", -"Apartment number etc." => "หมายเลขอพาร์ทเมนต์ ฯลฯ", -"City" => "เมือง", -"Region" => "ภูมิภาค", -"E.g. state or province" => "เช่น รัฐ หรือ จังหวัด", -"Zipcode" => "รหัสไปรษณีย์", -"Postal code" => "รหัสไปรษณีย์", -"Country" => "ประเทศ", -"Addressbook" => "สมุดบันทึกที่อยู่", -"Hon. prefixes" => "คำนำหน้าชื่อคนรัก", -"Miss" => "นางสาว", -"Ms" => "น.ส.", -"Mr" => "นาย", -"Sir" => "คุณ", -"Mrs" => "นาง", -"Dr" => "ดร.", -"Given name" => "ชื่อที่ใช้", -"Additional names" => "ชื่ออื่นๆ", -"Family name" => "ชื่อครอบครัว", -"Hon. suffixes" => "คำแนบท้ายชื่อคนรัก", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "ปริญญาเอก", -"Esq." => "Esq.", -"Jr." => "จูเนียร์", -"Sn." => "ซีเนียร์", -"Import a contacts file" => "นำเข้าไฟล์ข้อมูลการติดต่อ", -"Please choose the addressbook" => "กรุณาเลือกสมุดบันทึกที่อยู่", -"create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", -"Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่", -"Importing contacts" => "นำเข้าข้อมูลการติดต่อ", -"You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ", -"Add contact" => "เพิ่มชื่อผู้ติดต่อ", -"Select Address Books" => "เลือกสมุดบันทึกที่อยู่", -"Enter name" => "กรอกชื่อ", -"Enter description" => "กรอกคำอธิบาย", -"CardDAV syncing addresses" => "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV", -"more info" => "ข้อมูลเพิ่มเติม", -"Primary address (Kontact et al)" => "ที่อยู่หลัก (สำหรับติดต่อ)", -"iOS/OS X" => "iOS/OS X", -"Show CardDav link" => "แสดงลิงก์ CardDav", -"Show read-only VCF link" => "แสดงลิงก์ VCF สำหรับอ่านเท่านั้น", -"Share" => "แชร์", -"Download" => "ดาวน์โหลด", -"Edit" => "แก้ไข", -"New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่", -"Name" => "ชื่อ", -"Description" => "คำอธิบาย", -"Save" => "บันทึก", -"Cancel" => "ยกเลิก", -"More..." => "เพิ่มเติม..." -); diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php deleted file mode 100644 index 3abe96998e..0000000000 --- a/apps/contacts/l10n/tr.php +++ /dev/null @@ -1,193 +0,0 @@ - "Adres defteri etkisizleştirilirken hata oluştu.", -"id is not set." => "id atanmamış.", -"Cannot update addressbook with an empty name." => "Adres defterini boş bir isimle güncelleyemezsiniz.", -"Error updating addressbook." => "Adres defteri güncellenirken hata oluştu.", -"No ID provided" => "ID verilmedi", -"Error setting checksum." => "İmza oluşturulurken hata.", -"No categories selected for deletion." => "Silmek için bir kategori seçilmedi.", -"No address books found." => "Adres defteri bulunamadı.", -"No contacts found." => "Bağlantı bulunamadı.", -"There was an error adding the contact." => "Kişi eklenirken hata oluştu.", -"element name is not set." => "eleman ismi atanmamış.", -"Could not parse contact: " => "Kişi bilgisi ayrıştırılamadı.", -"Cannot add empty property." => "Boş özellik eklenemiyor.", -"At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.", -"Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ", -"Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.", -"Missing ID" => "Eksik ID", -"Error parsing VCard for ID: \"" => "ID için VCard ayrıştırılamadı:\"", -"checksum is not set." => "checksum atanmamış.", -"Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ", -"Something went FUBAR. " => "Bir şey FUBAR gitti.", -"No contact ID was submitted." => "Bağlantı ID'si girilmedi.", -"Error reading contact photo." => "Bağlantı fotoğrafı okunamadı.", -"Error saving temporary file." => "Geçici dosya kaydetme hatası.", -"The loading photo is not valid." => "Yüklenecek fotograf geçerli değil.", -"Contact ID is missing." => "Bağlantı ID'si eksik.", -"No photo path was submitted." => "Fotoğraf girilmedi.", -"File doesn't exist:" => "Dosya mevcut değil:", -"Error loading image." => "İmaj yükleme hatası.", -"Error getting contact object." => "Bağlantı nesnesini kaydederken hata.", -"Error getting PHOTO property." => "Resim özelleğini alırken hata oluştu.", -"Error saving contact." => "Bağlantıyı kaydederken hata", -"Error resizing image" => "Görüntü yeniden boyutlandırılamadı.", -"Error cropping image" => "Görüntü kırpılamadı.", -"Error creating temporary image" => "Geçici resim oluştururken hata oluştu", -"Error finding image: " => "Resim ararken hata oluştu:", -"Error uploading contacts to storage." => "Bağlantıları depoya yükleme hatası", -"There is no error, the file uploaded with success" => "Dosya başarıyla yüklendi, hata oluşmadı", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Dosyanın boyutu php.ini dosyasındaki upload_max_filesize limitini aşıyor", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Yüklenecek dosyanın boyutu HTML formunda belirtilen MAX_FILE_SIZE limitini aşıyor", -"The uploaded file was only partially uploaded" => "Dosya kısmen karşıya yüklenebildi", -"No file was uploaded" => "Hiç dosya gönderilmedi", -"Missing a temporary folder" => "Geçici dizin eksik", -"Couldn't save temporary image: " => "Geçici resmi saklayamadı : ", -"Couldn't load temporary image: " => "Geçici resmi yükleyemedi :", -"No file was uploaded. Unknown error" => "Dosya yüklenmedi. Bilinmeyen hata", -"Contacts" => "Kişiler", -"Sorry, this functionality has not been implemented yet" => "Üzgünüz, bu özellik henüz tamamlanmadı.", -"Not implemented" => "Tamamlanmadı.", -"Couldn't get a valid address." => "Geçerli bir adres alınamadı.", -"Error" => "Hata", -"This property has to be non-empty." => "Bu özellik boş bırakılmamalı.", -"Couldn't serialize elements." => "Öğeler seri hale getiremedi", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' tip argümanı olmadan çağrıldı. Lütfen bugs.owncloud.org a rapor ediniz.", -"Edit name" => "İsmi düzenle", -"No files selected for upload." => "Yükleme için dosya seçilmedi.", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosya sunucudaki dosya yükleme maksimum boyutunu aşmaktadır. ", -"Select type" => "Tür seç", -"Result: " => "Sonuç: ", -" imported, " => " içe aktarıldı, ", -" failed." => " hatalı.", -"This is not your addressbook." => "Bu sizin adres defteriniz değil.", -"Contact could not be found." => "Kişi bulunamadı.", -"Work" => "İş", -"Home" => "Ev", -"Other" => "Diğer", -"Mobile" => "Mobil", -"Text" => "Metin", -"Voice" => "Ses", -"Message" => "mesaj", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Sayfalayıcı", -"Internet" => "İnternet", -"Birthday" => "Doğum günü", -"Business" => "İş", -"Call" => "Çağrı", -"Clients" => "Müşteriler", -"Deliverer" => "Dağıtıcı", -"Holidays" => "Tatiller", -"Ideas" => "Fikirler", -"Journey" => "Seyahat", -"Jubilee" => "Yıl Dönümü", -"Meeting" => "Toplantı", -"Personal" => "Kişisel", -"Projects" => "Projeler", -"Questions" => "Sorular", -"{name}'s Birthday" => "{name}'nin Doğumgünü", -"Contact" => "Kişi", -"Add Contact" => "Kişi Ekle", -"Import" => "İçe aktar", -"Addressbooks" => "Adres defterleri", -"Close" => "Kapat", -"Keyboard shortcuts" => "Klavye kısayolları", -"Navigation" => "Dolaşım", -"Next contact in list" => "Listedeki sonraki kişi", -"Previous contact in list" => "Listedeki önceki kişi", -"Expand/collapse current addressbook" => "Şuanki adres defterini genişlet/daralt", -"Actions" => "Eylemler", -"Refresh contacts list" => "Kişi listesini tazele", -"Add new contact" => "Yeni kişi ekle", -"Add new addressbook" => "Yeni adres defteri ekle", -"Delete current contact" => "Şuanki kişiyi sil", -"Drop photo to upload" => "Fotoğrafı yüklenmesi için bırakın", -"Delete current photo" => "Mevcut fotoğrafı sil", -"Edit current photo" => "Mevcut fotoğrafı düzenle", -"Upload new photo" => "Yeni fotoğraf yükle", -"Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters", -"Edit name details" => "İsim detaylarını düzenle", -"Organization" => "Organizasyon", -"Delete" => "Sil", -"Nickname" => "Takma ad", -"Enter nickname" => "Takma adı girin", -"Web site" => "Web sitesi", -"http://www.somesite.com" => "http://www.somesite.com", -"Go to web site" => "Web sitesine git", -"dd-mm-yyyy" => "gg-aa-yyyy", -"Groups" => "Gruplar", -"Separate groups with commas" => "Grupları birbirinden virgülle ayırın", -"Edit groups" => "Grupları düzenle", -"Preferred" => "Tercih edilen", -"Please specify a valid email address." => "Lütfen geçerli bir eposta adresi belirtin.", -"Enter email address" => "Eposta adresini girin", -"Mail to address" => "Eposta adresi", -"Delete email address" => "Eposta adresini sil", -"Enter phone number" => "Telefon numarasını gir", -"Delete phone number" => "Telefon numarasını sil", -"View on map" => "Haritada gör", -"Edit address details" => "Adres detaylarını düzenle", -"Add notes here." => "Notları buraya ekleyin.", -"Add field" => "Alan ekle", -"Phone" => "Telefon", -"Email" => "Eposta", -"Address" => "Adres", -"Note" => "Not", -"Download contact" => "Kişiyi indir", -"Delete contact" => "Kişiyi sil", -"The temporary image has been removed from cache." => "Geçici resim ön bellekten silinmiştir.", -"Edit address" => "Adresi düzenle", -"Type" => "Tür", -"PO Box" => "Posta Kutusu", -"Street address" => "Sokak adresi", -"Street and number" => "Sokak ve Numara", -"Extended" => "Uzatılmış", -"Apartment number etc." => "Apartman numarası vb.", -"City" => "Şehir", -"Region" => "Bölge", -"E.g. state or province" => "Örn. eyalet veya il", -"Zipcode" => "Posta kodu", -"Postal code" => "Posta kodu", -"Country" => "Ülke", -"Addressbook" => "Adres defteri", -"Hon. prefixes" => "Kısaltmalar", -"Miss" => "Bayan", -"Ms" => "Bayan", -"Mr" => "Bay", -"Sir" => "Bay", -"Mrs" => "Bayan", -"Dr" => "Dr", -"Given name" => "Verilen isim", -"Additional names" => "İlave isimler", -"Family name" => "Soyad", -"Hon. suffixes" => "Kısaltmalar", -"J.D." => "J.D.", -"M.D." => "Dr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Dr.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"Import a contacts file" => "Bağlantı dosyasını içeri aktar", -"Please choose the addressbook" => "Yeni adres defterini seç", -"create a new addressbook" => "Yeni adres defteri oluştur", -"Name of new addressbook" => "Yeni adres defteri için isim", -"Importing contacts" => "Bağlantıları içe aktar", -"You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.", -"Add contact" => "Bağlatı ekle", -"Select Address Books" => "Adres deftelerini seçiniz", -"Enter name" => "İsim giriniz", -"Enter description" => "Tanım giriniz", -"CardDAV syncing addresses" => "CardDAV adresleri eşzamanlıyor", -"more info" => "daha fazla bilgi", -"Primary address (Kontact et al)" => "Birincil adres (Bağlantı ve arkadaşları)", -"iOS/OS X" => "iOS/OS X", -"Download" => "İndir", -"Edit" => "Düzenle", -"New Address Book" => "Yeni Adres Defteri", -"Save" => "Kaydet", -"Cancel" => "İptal" -); diff --git a/apps/contacts/l10n/uk.php b/apps/contacts/l10n/uk.php deleted file mode 100644 index dcd9efff34..0000000000 --- a/apps/contacts/l10n/uk.php +++ /dev/null @@ -1,24 +0,0 @@ - "Має бути заповнено щонайменше одне поле.", -"This is not your addressbook." => "Це не ваша адресна книга.", -"Mobile" => "Мобільний", -"Text" => "Текст", -"Voice" => "Голос", -"Fax" => "Факс", -"Video" => "Відео", -"Pager" => "Пейджер", -"Birthday" => "День народження", -"Add Contact" => "Додати контакт", -"Organization" => "Організація", -"Delete" => "Видалити", -"Phone" => "Телефон", -"Email" => "Ел.пошта", -"Address" => "Адреса", -"Delete contact" => "Видалити контакт", -"Extended" => "Розширено", -"City" => "Місто", -"Zipcode" => "Поштовий індекс", -"Country" => "Країна", -"Download" => "Завантажити", -"New Address Book" => "Нова адресна книга" -); diff --git a/apps/contacts/l10n/vi.php b/apps/contacts/l10n/vi.php deleted file mode 100644 index d484fb405c..0000000000 --- a/apps/contacts/l10n/vi.php +++ /dev/null @@ -1,41 +0,0 @@ - "id không được thiết lập.", -"No ID provided" => "Không có ID được cung cấp", -"No address books found." => "Không tìm thấy sổ địa chỉ.", -"No contacts found." => "Không tìm thấy danh sách", -"element name is not set." => "tên phần tử không được thiết lập.", -"Missing ID" => "Missing ID", -"Error reading contact photo." => "Lỗi đọc liên lạc hình ảnh.", -"The loading photo is not valid." => "Các hình ảnh tải không hợp lệ.", -"File doesn't exist:" => "Tập tin không tồn tại", -"Error loading image." => "Lỗi khi tải hình ảnh.", -"Error uploading contacts to storage." => "Lỗi tải lên danh sách địa chỉ để lưu trữ.", -"There is no error, the file uploaded with success" => "Không có lỗi, các tập tin tải lên thành công", -"Contacts" => "Liên lạc", -"Work" => "Công việc", -"Home" => "Nhà", -"Mobile" => "Di động", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "số trang", -"Birthday" => "Ngày sinh nhật", -"Contact" => "Danh sách", -"Add Contact" => "Thêm liên lạc", -"Addressbooks" => "Sổ địa chỉ", -"Organization" => "Tổ chức", -"Delete" => "Xóa", -"Phone" => "Điện thoại", -"Email" => "Email", -"Address" => "Địa chỉ", -"Delete contact" => "Xóa liên lạc", -"PO Box" => "Hòm thư bưu điện", -"City" => "Thành phố", -"Region" => "Vùng/miền", -"Zipcode" => "Mã bưu điện", -"Country" => "Quốc gia", -"Addressbook" => "Sổ địa chỉ", -"Download" => "Tải về", -"Edit" => "Sửa", -"Save" => "Lưu", -"Cancel" => "Hủy" -); diff --git a/apps/contacts/l10n/xgettextfiles b/apps/contacts/l10n/xgettextfiles deleted file mode 100644 index e291074fba..0000000000 --- a/apps/contacts/l10n/xgettextfiles +++ /dev/null @@ -1,18 +0,0 @@ -../appinfo/app.php -../ajax/activation.php -../ajax/addbook.php -../ajax/addproperty.php -../ajax/createaddressbook.php -../ajax/deletebook.php -../ajax/deleteproperty.php -../ajax/contactdetails.php -../ajax/saveproperty.php -../ajax/updateaddressbook.php -../lib/app.php -../templates/index.php -../templates/part.chooseaddressbook.php -../templates/part.chooseaddressbook.rowfields.php -../templates/part.editaddressbook.php -../templates/part.property.php -../templates/part.setpropertyform.php -../templates/settings.php diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php deleted file mode 100644 index b3bac7aedf..0000000000 --- a/apps/contacts/l10n/zh_CN.php +++ /dev/null @@ -1,158 +0,0 @@ - "(取消)激活地址簿错误。", -"id is not set." => "没有设置 id。", -"Cannot update addressbook with an empty name." => "无法使用一个空名称更新地址簿", -"Error updating addressbook." => "更新地址簿错误", -"No ID provided" => "未提供 ID", -"Error setting checksum." => "设置校验值错误。", -"No categories selected for deletion." => "未选中要删除的分类。", -"No address books found." => "找不到地址簿。", -"No contacts found." => "找不到联系人。", -"There was an error adding the contact." => "添加联系人时出错。", -"element name is not set." => "元素名称未设置", -"Cannot add empty property." => "无法添加空属性。", -"At least one of the address fields has to be filled out." => "至少需要填写一项地址。", -"Trying to add duplicate property: " => "试图添加重复属性: ", -"Information about vCard is incorrect. Please reload the page." => "vCard 的信息不正确。请重新加载页面。", -"Missing ID" => "缺少 ID", -"Error parsing VCard for ID: \"" => "无法解析如下ID的 VCard:“", -"checksum is not set." => "未设置校验值。", -"Information about vCard is incorrect. Please reload the page: " => "vCard 信息不正确。请刷新页面: ", -"Something went FUBAR. " => "有一些信息无法被处理。", -"No contact ID was submitted." => "未提交联系人 ID。", -"Error reading contact photo." => "读取联系人照片错误。", -"Error saving temporary file." => "保存临时文件错误。", -"The loading photo is not valid." => "装入的照片不正确。", -"Contact ID is missing." => "缺少联系人 ID。", -"No photo path was submitted." => "未提供照片路径。", -"File doesn't exist:" => "文件不存在:", -"Error loading image." => "加载图片错误。", -"Error getting contact object." => "获取联系人目标时出错。", -"Error getting PHOTO property." => "获取照片属性时出错。", -"Error saving contact." => "保存联系人时出错。", -"Error resizing image" => "缩放图像时出错", -"Error cropping image" => "裁切图像时出错", -"Error creating temporary image" => "创建临时图像时出错", -"Error finding image: " => "查找图像时出错: ", -"Error uploading contacts to storage." => "上传联系人到存储空间时出错", -"There is no error, the file uploaded with success" => "文件上传成功,没有错误发生", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件长度超出了 php.ini 中 upload_max_filesize 的限制", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制", -"The uploaded file was only partially uploaded" => "已上传文件只上传了部分", -"No file was uploaded" => "没有文件被上传", -"Missing a temporary folder" => "缺少临时目录", -"Couldn't save temporary image: " => "无法保存临时图像: ", -"Couldn't load temporary image: " => "无法加载临时图像: ", -"No file was uploaded. Unknown error" => "没有文件被上传。未知错误", -"Contacts" => "联系人", -"Sorry, this functionality has not been implemented yet" => "抱歉,这个功能暂时还没有被实现", -"Not implemented" => "未实现", -"Couldn't get a valid address." => "无法获取一个合法的地址。", -"Error" => "错误", -"This property has to be non-empty." => "这个属性必须是非空的", -"Couldn't serialize elements." => "无法序列化元素", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' 调用时没有类型声明。请到 bugs.owncloud.org 汇报错误", -"Edit name" => "编辑名称", -"No files selected for upload." => "没有选择文件以上传", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "您试图上传的文件超出了该服务器的最大文件限制", -"Select type" => "选择类型", -"Result: " => "结果: ", -" imported, " => " 已导入, ", -" failed." => " 失败。", -"This is not your addressbook." => "这不是您的地址簿。", -"Contact could not be found." => "无法找到联系人。", -"Work" => "工作", -"Home" => "家庭", -"Mobile" => "移动电话", -"Text" => "文本", -"Voice" => "语音", -"Message" => "消息", -"Fax" => "传真", -"Video" => "视频", -"Pager" => "传呼机", -"Internet" => "互联网", -"Birthday" => "生日", -"{name}'s Birthday" => "{name} 的生日", -"Contact" => "联系人", -"Add Contact" => "添加联系人", -"Import" => "导入", -"Addressbooks" => "地址簿", -"Close" => "关闭", -"Drop photo to upload" => "拖拽图片进行上传", -"Delete current photo" => "删除当前照片", -"Edit current photo" => "编辑当前照片", -"Upload new photo" => "上传新照片", -"Select photo from ownCloud" => "从 ownCloud 选择照片", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "自定义格式,简称,全名,姓在前,姓在前并用逗号分割", -"Edit name details" => "编辑名称详情", -"Organization" => "组织", -"Delete" => "删除", -"Nickname" => "昵称", -"Enter nickname" => "输入昵称", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "分组", -"Separate groups with commas" => "用逗号隔开分组", -"Edit groups" => "编辑分组", -"Preferred" => "偏好", -"Please specify a valid email address." => "请指定合法的电子邮件地址", -"Enter email address" => "输入电子邮件地址", -"Mail to address" => "发送邮件到地址", -"Delete email address" => "删除电子邮件地址", -"Enter phone number" => "输入电话号码", -"Delete phone number" => "删除电话号码", -"View on map" => "在地图上显示", -"Edit address details" => "编辑地址细节。", -"Add notes here." => "添加注释。", -"Add field" => "添加字段", -"Phone" => "电话", -"Email" => "电子邮件", -"Address" => "地址", -"Note" => "注释", -"Download contact" => "下载联系人", -"Delete contact" => "删除联系人", -"The temporary image has been removed from cache." => "临时图像文件已从缓存中删除", -"Edit address" => "编辑地址", -"Type" => "类型", -"PO Box" => "邮箱", -"Extended" => "扩展", -"City" => "城市", -"Region" => "地区", -"Zipcode" => "邮编", -"Country" => "国家", -"Addressbook" => "地址簿", -"Hon. prefixes" => "名誉字首", -"Miss" => "小姐", -"Ms" => "女士", -"Mr" => "先生", -"Sir" => "先生", -"Mrs" => "夫人", -"Dr" => "博士", -"Given name" => "名", -"Additional names" => "其他名称", -"Family name" => "姓", -"Hon. suffixes" => "名誉后缀", -"J.D." => "法律博士", -"M.D." => "医学博士", -"D.O." => "骨科医学博士", -"D.C." => "教育学博士", -"Ph.D." => "哲学博士", -"Esq." => "先生", -"Jr." => "小", -"Sn." => "老", -"Import a contacts file" => "导入联系人文件", -"Please choose the addressbook" => "请选择地址簿", -"create a new addressbook" => "创建新地址簿", -"Name of new addressbook" => "新地址簿名称", -"Importing contacts" => "导入联系人", -"You have no contacts in your addressbook." => "您的地址簿中没有联系人。", -"Add contact" => "添加联系人", -"CardDAV syncing addresses" => "CardDAV 同步地址", -"more info" => "更多信息", -"Primary address (Kontact et al)" => "首选地址 (Kontact 等)", -"iOS/OS X" => "iOS/OS X", -"Download" => "下载", -"Edit" => "编辑", -"New Address Book" => "新建地址簿", -"Save" => "保存", -"Cancel" => "取消" -); diff --git a/apps/contacts/l10n/zh_TW.php b/apps/contacts/l10n/zh_TW.php deleted file mode 100644 index c8edacec9e..0000000000 --- a/apps/contacts/l10n/zh_TW.php +++ /dev/null @@ -1,75 +0,0 @@ - "在啟用或關閉電話簿時發生錯誤", -"Error updating addressbook." => "電話簿更新中發生錯誤", -"No ID provided" => "未提供 ID", -"No contacts found." => "沒有找到聯絡人", -"There was an error adding the contact." => "添加通訊錄發生錯誤", -"Cannot add empty property." => "不可添加空白內容", -"At least one of the address fields has to be filled out." => "至少必須填寫一欄地址", -"Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。", -"Missing ID" => "遺失ID", -"No file was uploaded" => "沒有已上傳的檔案", -"Contacts" => "通訊錄", -"This is not your addressbook." => "這不是你的電話簿", -"Contact could not be found." => "通訊錄未發現", -"Work" => "公司", -"Home" => "住宅", -"Mobile" => "行動電話", -"Text" => "文字", -"Voice" => "語音", -"Message" => "訊息", -"Fax" => "傳真", -"Video" => "影片", -"Pager" => "呼叫器", -"Internet" => "網際網路", -"Birthday" => "生日", -"{name}'s Birthday" => "{name}的生日", -"Contact" => "通訊錄", -"Add Contact" => "添加通訊錄", -"Addressbooks" => "電話簿", -"Edit name details" => "編輯姓名詳細資訊", -"Organization" => "組織", -"Delete" => "刪除", -"Nickname" => "綽號", -"Enter nickname" => "輸入綽號", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "群組", -"Separate groups with commas" => "用逗號分隔群組", -"Edit groups" => "編輯群組", -"Preferred" => "首選", -"Please specify a valid email address." => "註填入合法的電子郵件住址", -"Enter email address" => "輸入電子郵件地址", -"Mail to address" => "寄送住址", -"Delete email address" => "刪除電子郵件住址", -"Enter phone number" => "輸入電話號碼", -"Delete phone number" => "刪除電話號碼", -"Edit address details" => "電子郵件住址詳細資訊", -"Add notes here." => "在這裡新增註解", -"Add field" => "新增欄位", -"Phone" => "電話", -"Email" => "電子郵件", -"Address" => "地址", -"Note" => "註解", -"Download contact" => "下載通訊錄", -"Delete contact" => "刪除通訊錄", -"Type" => "類型", -"PO Box" => "通訊地址", -"Extended" => "分機", -"City" => "城市", -"Region" => "地區", -"Zipcode" => "郵遞區號", -"Country" => "國家", -"Addressbook" => "電話簿", -"Mr" => "先生", -"Sir" => "先生", -"Mrs" => "小姐", -"Dr" => "博士(醫生)", -"Given name" => "給定名(名)", -"Additional names" => "額外名", -"Family name" => "家族名(姓)", -"Download" => "下載", -"Edit" => "編輯", -"New Address Book" => "新電話簿", -"Save" => "儲存", -"Cancel" => "取消" -); diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php deleted file mode 100644 index b487260d32..0000000000 --- a/apps/contacts/lib/addressbook.php +++ /dev/null @@ -1,341 +0,0 @@ -. - * - */ -/* - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE contacts_addressbooks ( - * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * userid VARCHAR(255) NOT NULL, - * displayname VARCHAR(255), - * uri VARCHAR(100), - * description TEXT, - * ctag INT(11) UNSIGNED NOT NULL DEFAULT '1' - * ); - * - */ -/** - * This class manages our addressbooks. - */ -class OC_Contacts_Addressbook { - /** - * @brief Returns the list of addressbooks for a specific user. - * @param string $uid - * @param boolean $active Only return addressbooks with this $active state, default(=false) is don't care - * @return array or false. - */ - public static function all($uid, $active=false) { - $values = array($uid); - $active_where = ''; - if ($active) { - $active_where = ' AND `active` = ?'; - $values[] = 1; - } - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' . $active_where . ' ORDER BY `displayname`' ); - $result = $stmt->execute($values); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); - return false; - } - - $addressbooks = array(); - while( $row = $result->fetchRow()) { - $addressbooks[] = $row; - } - $addressbooks = array_merge($addressbooks, OCP\Share::getItemsSharedWith('addressbook', OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS)); - if(!$active && !count($addressbooks)) { - $id = self::addDefault($uid); - return array(self::find($id),); - } - return $addressbooks; - } - - /** - * @brief Get active addressbook IDs for a user. - * @param integer $uid User id. If null current user will be used. - * @return array - */ - public static function activeIds($uid = null) { - if(is_null($uid)) { - $uid = OCP\USER::getUser(); - } - $activeaddressbooks = self::all($uid, true); - $ids = array(); - foreach($activeaddressbooks as $addressbook) { - $ids[] = $addressbook['id']; - } - return $ids; - } - - /** - * @brief Returns the list of active addressbooks for a specific user. - * @param string $uid - * @return array - */ - public static function active($uid) { - return self::all($uid, true); - } - - /** - * @brief Returns the list of addressbooks for a principal (DAV term of user) - * @param string $principaluri - * @return array - */ - public static function allWherePrincipalURIIs($principaluri){ - $uid = self::extractUserID($principaluri); - return self::all($uid); - } - - /** - * @brief Gets the data of one address book - * @param integer $id - * @return associative array or false. - */ - public static function find($id) { - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); - $result = $stmt->execute(array($id)); - return $result->fetchRow(); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief Adds default address book - * @return $id ID of the newly created addressbook or false on error. - */ - public static function addDefault($uid = null) { - if(is_null($uid)) { - $uid = OCP\USER::getUser(); - } - $id = self::add($uid, 'Contacts', 'Default Address Book'); - if($id !== false) { - self::setActive($id, true); - } - return $id; - } - - /** - * @brief Creates a new address book - * @param string $userid - * @param string $name - * @param string $description - * @return insertid - */ - public static function add($uid,$name,$description='') { - try { - $stmt = OCP\DB::prepare( 'SELECT `uri` FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' ); - $result = $stmt->execute(array($uid)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); - return false; - } - $uris = array(); - while($row = $result->fetchRow()){ - $uris[] = $row['uri']; - } - - $uri = self::createURI($name, $uris ); - try { - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($uid,$name,$uri,$description,1)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); - return false; - } - - return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - } - - /** - * @brief Creates a new address book from the data sabredav provides - * @param string $principaluri - * @param string $uri - * @param string $name - * @param string $description - * @return insertid or false - */ - public static function addFromDAVData($principaluri,$uri,$name,$description) { - $uid = self::extractUserID($principaluri); - - try { - $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)'); - $result = $stmt->execute(array($uid,$name,$uri,$description,1)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uri: '.$uri, OCP\Util::DEBUG); - return false; - } - - return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - } - - /** - * @brief Edits an addressbook - * @param integer $id - * @param string $name - * @param string $description - * @return boolean - */ - public static function edit($id,$name,$description) { - // Need these ones for checking uri - $addressbook = self::find($id); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); - if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - return false; - } - } - if(is_null($name)) { - $name = $addressbook['name']; - } - if(is_null($description)) { - $description = $addressbook['description']; - } - - try { - $stmt = OCP\DB::prepare('UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?'); - $result = $stmt->execute(array($name,$description,$id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); - return false; - } - - return true; - } - - /** - * @brief Activates an addressbook - * @param integer $id - * @param boolean $active - * @return boolean - */ - public static function setActive($id,$active) { - $sql = 'UPDATE `*PREFIX*contacts_addressbooks` SET `active` = ? WHERE `id` = ?'; - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id.', active: '.intval($active), OCP\Util::ERROR); - try { - $stmt = OCP\DB::prepare($sql); - $stmt->execute(array(intval($active), $id)); - return true; - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); - return false; - } - } - - /** - * @brief Checks if an addressbook is active. - * @param integer $id ID of the address book. - * @return boolean - */ - public static function isActive($id) { - $sql = 'SELECT `active` FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?'; - try { - $stmt = OCP\DB::prepare( $sql ); - $result = $stmt->execute(array($id)); - $row = $result->fetchRow(); - return (bool)$row['active']; - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - } - } - - /** - * @brief removes an address book - * @param integer $id - * @return boolean - */ - public static function delete($id) { - $addressbook = self::find($id); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); - if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_DELETE)) { - return false; - } - } - self::setActive($id, false); - try { - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); - $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); - return false; - } - - $cards = OC_Contacts_VCard::all($id); - foreach($cards as $card){ - OC_Contacts_VCard::delete($card['id']); - } - - return true; - } - - /** - * @brief Updates ctag for addressbook - * @param integer $id - * @return boolean - */ - public static function touch($id) { - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `ctag` = `ctag` + 1 WHERE `id` = ?' ); - $stmt->execute(array($id)); - - return true; - } - - /** - * @brief Creates a URI for Addressbook - * @param string $name name of the addressbook - * @param array $existing existing addressbook URIs - * @return string new name - */ - public static function createURI($name,$existing) { - $name = str_replace(' ', '_', strtolower($name)); - $newname = $name; - $i = 1; - while(in_array($newname, $existing)) { - $newname = $name.$i; - $i = $i + 1; - } - return $newname; - } - - /** - * @brief gets the userid from a principal path - * @return string - */ - public static function extractUserID($principaluri) { - list($prefix, $userid) = Sabre_DAV_URLUtil::splitPath($principaluri); - return $userid; - } -} diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php deleted file mode 100644 index e8e1937404..0000000000 --- a/apps/contacts/lib/app.php +++ /dev/null @@ -1,331 +0,0 @@ - array( - 'message' => self::$l10n->t('Addressbook not found: ' . $id) - ) - ) - ); - } else { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id, OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS); - if ($sharedAddressbook) { - return $sharedAddressbook; - } else { - OCP\Util::writeLog('contacts', - 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), - OCP\Util::ERROR); - //throw new Exception('This is not your addressbook.'); - OCP\JSON::error( - array( - 'data' => array( - 'message' => self::$l10n->t('This is not your addressbook.') - ) - ) - ); - } - } - } - return $addressbook; - } - - public static function getContactObject($id) { - $card = OC_Contacts_VCard::find( $id ); - if( $card === false ) { - OCP\Util::writeLog('contacts', - 'Contact could not be found: '.$id, - OCP\Util::ERROR); - OCP\JSON::error( - array( - 'data' => array( - 'message' => self::$l10n->t('Contact could not be found.') - .' '.print_r($id, true) - ) - ) - ); - exit(); - } - - self::getAddressbook( $card['addressbookid'] );//access check - return $card; - } - - /** - * @brief Gets the VCard as an OC_VObject - * @returns The card or null if the card could not be parsed. - */ - public static function getContactVCard($id) { - $card = self::getContactObject( $id ); - - $vcard = OC_VObject::parse($card['carddata']); - if (!is_null($vcard) && !isset($vcard->REV)) { - $rev = new DateTime('@'.$card['lastmodified']); - $vcard->setString('REV', $rev->format(DateTime::W3C)); - } - return $vcard; - } - - public static function getPropertyLineByChecksum($vcard, $checksum) { - $line = null; - for($i=0;$ichildren);$i++) { - if(md5($vcard->children[$i]->serialize()) == $checksum ) { - $line = $i; - break; - } - } - return $line; - } - - /** - * @return array of vcard prop => label - */ - public static function getIMOptions($im = null) { - $l10n = self::$l10n; - $ims = array( - 'jabber' => array( - 'displayname' => (string)$l10n->t('Jabber'), - 'xname' => 'X-JABBER', - 'protocol' => 'xmpp', - ), - 'aim' => array( - 'displayname' => (string)$l10n->t('AIM'), - 'xname' => 'X-AIM', - 'protocol' => 'aim', - ), - 'msn' => array( - 'displayname' => (string)$l10n->t('MSN'), - 'xname' => 'X-MSN', - 'protocol' => 'msn', - ), - 'twitter' => array( - 'displayname' => (string)$l10n->t('Twitter'), - 'xname' => 'X-TWITTER', - 'protocol' => null, - ), - 'googletalk' => array( - 'displayname' => (string)$l10n->t('GoogleTalk'), - 'xname' => null, - 'protocol' => 'xmpp', - ), - 'facebook' => array( - 'displayname' => (string)$l10n->t('Facebook'), - 'xname' => null, - 'protocol' => 'xmpp', - ), - 'xmpp' => array( - 'displayname' => (string)$l10n->t('XMPP'), - 'xname' => null, - 'protocol' => 'xmpp', - ), - 'icq' => array( - 'displayname' => (string)$l10n->t('ICQ'), - 'xname' => 'X-ICQ', - 'protocol' => 'icq', - ), - 'yahoo' => array( - 'displayname' => (string)$l10n->t('Yahoo'), - 'xname' => 'X-YAHOO', - 'protocol' => 'ymsgr', - ), - 'skype' => array( - 'displayname' => (string)$l10n->t('Skype'), - 'xname' => 'X-SKYPE', - 'protocol' => 'skype', - ), - 'qq' => array( - 'displayname' => (string)$l10n->t('QQ'), - 'xname' => 'X-SKYPE', - 'protocol' => 'x-apple', - ), - 'gadugadu' => array( - 'displayname' => (string)$l10n->t('GaduGadu'), - 'xname' => 'X-SKYPE', - 'protocol' => 'x-apple', - ), - ); - if(is_null($im)) { - return $ims; - } else { - $ims['ymsgr'] = $ims['yahoo']; - $ims['gtalk'] = $ims['googletalk']; - return isset($ims[$im]) ? $ims[$im] : null; - } - } - - /** - * @return types for property $prop - */ - public static function getTypesOfProperty($prop) { - $l = self::$l10n; - switch($prop) { - case 'ADR': - case 'IMPP': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - 'OTHER' => $l->t('Other'), - ); - case 'TEL': - return array( - 'HOME' => $l->t('Home'), - 'CELL' => $l->t('Mobile'), - 'WORK' => $l->t('Work'), - 'TEXT' => $l->t('Text'), - 'VOICE' => $l->t('Voice'), - 'MSG' => $l->t('Message'), - 'FAX' => $l->t('Fax'), - 'VIDEO' => $l->t('Video'), - 'PAGER' => $l->t('Pager'), - 'OTHER' => $l->t('Other'), - ); - case 'EMAIL': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - 'INTERNET' => $l->t('Internet'), - ); - } - } - - /** - * @brief returns the vcategories object of the user - * @return (object) $vcategories - */ - protected static function getVCategories() { - if (is_null(self::$categories)) { - self::$categories = new OC_VCategories('contacts', - null, - self::getDefaultCategories()); - } - return self::$categories; - } - - /** - * @brief returns the categories for the user - * @return (Array) $categories - */ - public static function getCategories() { - $categories = self::getVCategories()->categories(); - if(count($categories) == 0) { - self::scanCategories(); - $categories = self::$categories->categories(); - } - return ($categories ? $categories : self::getDefaultCategories()); - } - - /** - * @brief returns the default categories of ownCloud - * @return (array) $categories - */ - public static function getDefaultCategories(){ - return array( - (string)self::$l10n->t('Birthday'), - (string)self::$l10n->t('Business'), - (string)self::$l10n->t('Call'), - (string)self::$l10n->t('Clients'), - (string)self::$l10n->t('Deliverer'), - (string)self::$l10n->t('Holidays'), - (string)self::$l10n->t('Ideas'), - (string)self::$l10n->t('Journey'), - (string)self::$l10n->t('Jubilee'), - (string)self::$l10n->t('Meeting'), - (string)self::$l10n->t('Other'), - (string)self::$l10n->t('Personal'), - (string)self::$l10n->t('Projects'), - (string)self::$l10n->t('Questions'), - (string)self::$l10n->t('Work'), - ); - } - - /** - * scan vcards for categories. - * @param $vccontacts VCards to scan. null to check all vcards for the current user. - */ - public static function scanCategories($vccontacts = null) { - if (is_null($vccontacts)) { - $vcaddressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); - if(count($vcaddressbooks) > 0) { - $vcaddressbookids = array(); - foreach($vcaddressbooks as $vcaddressbook) { - $vcaddressbookids[] = $vcaddressbook['id']; - } - $start = 0; - $batchsize = 10; - while($vccontacts = - OC_Contacts_VCard::all($vcaddressbookids, $start, $batchsize)) { - $cards = array(); - foreach($vccontacts as $vccontact) { - $cards[] = $vccontact['carddata']; - } - OCP\Util::writeLog('contacts', - __CLASS__.'::'.__METHOD__ - .', scanning: '.$batchsize.' starting from '.$start, - OCP\Util::DEBUG); - // only reset on first batch. - self::getVCategories()->rescan($cards, - true, - ($start == 0 ? true : false)); - $start += $batchsize; - } - } - } - } - - /** - * check VCard for new categories. - * @see OC_VCategories::loadFromVObject - */ - public static function loadCategoriesFromVCard(OC_VObject $contact) { - self::getVCategories()->loadFromVObject($contact, true); - } - - /** - * @brief Get the last modification time. - * @param $vcard OC_VObject - * $return DateTime | null - */ - public static function lastModified($vcard) { - $rev = $vcard->getAsString('REV'); - if ($rev) { - return DateTime::createFromFormat(DateTime::W3C, $rev); - } - } - - public static function setLastModifiedHeader($contact) { - $rev = $contact->getAsString('REV'); - if ($rev) { - $rev = DateTime::createFromFormat(DateTime::W3C, $rev); - OCP\Response::setLastModifiedHeader($rev); - } - } -} diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php deleted file mode 100644 index 8b7adc60f2..0000000000 --- a/apps/contacts/lib/hooks.php +++ /dev/null @@ -1,116 +0,0 @@ -. - * - */ - -/** - * The following signals are being emitted: - * - * OC_Contacts_VCard::post_moveToAddressbook(array('aid' => $aid, 'id' => $id)) - * OC_Contacts_VCard::pre_deleteVCard(array('aid' => $aid, 'id' => $id, 'uri' = $uri)); (NOTE: the values can be null depending on which method emits them) - * OC_Contacts_VCard::post_updateVCard($id) - * OC_Contacts_VCard::post_createVCard($newid) - */ - -/** - * This class contains all hooks. - */ -class OC_Contacts_Hooks{ - /** - * @brief Add default Addressbook for a certain user - * @param paramters parameters from postCreateUser-Hook - * @return array - */ - static public function createUser($parameters) { - OC_Contacts_Addressbook::addDefault($parameters['uid']); - return true; - } - - /** - * @brief Deletes all Addressbooks of a certain user - * @param paramters parameters from postDeleteUser-Hook - * @return array - */ - static public function deleteUser($parameters) { - $addressbooks = OC_Contacts_Addressbook::all($parameters['uid']); - - foreach($addressbooks as $addressbook) { - OC_Contacts_Addressbook::delete($addressbook['id']); - } - - return true; - } - - static public function getCalenderSources($parameters) { - $base_url = OCP\Util::linkTo('calendar', 'ajax/events.php').'?calendar_id='; - foreach(OC_Contacts_Addressbook::all(OCP\USER::getUser()) as $addressbook) { - $parameters['sources'][] - = array( - 'url' => $base_url.'birthday_'. $addressbook['id'], - 'backgroundColor' => '#cccccc', - 'borderColor' => '#888', - 'textColor' => 'black', - 'cache' => true, - 'editable' => false, - ); - } - } - - static public function getBirthdayEvents($parameters) { - $name = $parameters['calendar_id']; - if (strpos($name, 'birthday_') != 0) { - return; - } - $info = explode('_', $name); - $aid = $info[1]; - OC_Contacts_App::getAddressbook($aid); - foreach(OC_Contacts_VCard::all($aid) as $card){ - $vcard = OC_VObject::parse($card['carddata']); - if (!$vcard) { - continue; - } - $birthday = $vcard->BDAY; - if ($birthday) { - $date = new DateTime($birthday); - $vevent = new OC_VObject('VEVENT'); - //$vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV)); - $vevent->setDateTime('DTSTART', $date, - Sabre_VObject_Element_DateTime::DATE); - $vevent->setString('DURATION', 'P1D'); - $vevent->setString('UID', substr(md5(rand().time()), 0, 10)); - // DESCRIPTION? - $vevent->setString('RRULE', 'FREQ=YEARLY'); - $title = str_replace('{name}', - $vcard->getAsString('FN'), - OC_Contacts_App::$l10n->t('{name}\'s Birthday')); - $parameters['events'][] = array( - 'id' => 0,//$card['id'], - 'vevent' => $vevent, - 'repeating' => true, - 'summary' => $title, - 'calendardata' => "BEGIN:VCALENDAR\nVERSION:2.0\n" - . "PRODID:ownCloud Contacts " - . OCP\App::getAppVersion('contacts') . "\n" - . $vevent->serialize() . "END:VCALENDAR" - ); - } - } - } -} diff --git a/apps/contacts/lib/sabre/addressbook.php b/apps/contacts/lib/sabre/addressbook.php deleted file mode 100644 index e9eb77472b..0000000000 --- a/apps/contacts/lib/sabre/addressbook.php +++ /dev/null @@ -1,128 +0,0 @@ -. - * - */ - -/** - * This class overrides __construct to get access to $addressBookInfo and - * $carddavBackend, Sabre_CardDAV_AddressBook::getACL() to return read/write - * permissions based on user and shared state and it overrides - * Sabre_CardDAV_AddressBook::getChild() and Sabre_CardDAV_AddressBook::getChildren() - * to instantiate OC_Connector_Sabre_CardDAV_Cards. -*/ -class OC_Connector_Sabre_CardDAV_AddressBook extends Sabre_CardDAV_AddressBook { - - /** - * CardDAV backend - * - * @var Sabre_CardDAV_Backend_Abstract - */ - private $carddavBackend; - - /** - * Constructor - * - * @param Sabre_CardDAV_Backend_Abstract $carddavBackend - * @param array $addressBookInfo - */ - public function __construct( - Sabre_CardDAV_Backend_Abstract $carddavBackend, - array $addressBookInfo) { - - $this->carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - parent::__construct($carddavBackend, $addressBookInfo); - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $readprincipal = $this->getOwner(); - $writeprincipal = $this->getOwner(); - $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); - - if($uid != OCP\USER::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { - $readprincipal = 'principals/' . OCP\USER::getUser(); - } - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - $writeprincipal = 'principals/' . OCP\USER::getUser(); - } - } - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal, - 'protected' => true, - ), - - ); - - } - - /** - * Returns a card - * - * @param string $name - * @return OC_Connector_Sabre_DAV_Card - */ - public function getChild($name) { - - $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_NotFound('Card not found'); - return new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - - } - - /** - * Returns the full list of cards - * - * @return array - */ - public function getChildren() { - - $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - } - return $children; - - } -} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/addressbookroot.php b/apps/contacts/lib/sabre/addressbookroot.php deleted file mode 100644 index 69cd602128..0000000000 --- a/apps/contacts/lib/sabre/addressbookroot.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CardDAV_AddressBookRoot::getChildForPrincipal() - * to instantiate OC_Connector_CardDAV_UserAddressBooks. -*/ -class OC_Connector_Sabre_CardDAV_AddressBookRoot extends Sabre_CardDAV_AddressBookRoot { - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new OC_Connector_Sabre_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); - - } - -} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/backend.php b/apps/contacts/lib/sabre/backend.php deleted file mode 100644 index 04737eb3ab..0000000000 --- a/apps/contacts/lib/sabre/backend.php +++ /dev/null @@ -1,210 +0,0 @@ -. - * - */ - -/** - * This CardDAV backend uses PDO to store addressbooks - */ -class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { - /** - * Returns the list of addressbooks for a specific user. - * - * @param string $principaluri - * @return array - */ - public function getAddressBooksForUser($principaluri) { - $data = OC_Contacts_Addressbook::allWherePrincipalURIIs($principaluri); - $addressbooks = array(); - - foreach($data as $i) { - $addressbooks[] = array( - 'id' => $i['id'], - 'uri' => $i['uri'], - 'principaluri' => 'principals/'.$i['userid'], - '{DAV:}displayname' => $i['displayname'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' - => $i['description'], - '{http://calendarserver.org/ns/}getctag' => $i['ctag'], - ); - } - - return $addressbooks; - } - - - /** - * Updates an addressbook's properties - * - * See Sabre_DAV_IProperties for a description of the mutations array, as - * well as the return value. - * - * @param mixed $addressbookid - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateAddressBook($addressbookid, array $mutations) { - $name = null; - $description = null; - - foreach($mutations as $property=>$newvalue) { - switch($property) { - case '{DAV:}displayname' : - $name = $newvalue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV - . '}addressbook-description' : - $description = $newvalue; - break; - default : - // If any unsupported values were being updated, we must - // let the entire request fail. - return false; - } - } - - OC_Contacts_Addressbook::edit($addressbookid, $name, $description); - - return true; - - } - - /** - * Creates a new address book - * - * @param string $principaluri - * @param string $url Just the 'basename' of the url. - * @param array $properties - * @return void - */ - public function createAddressBook($principaluri, $url, array $properties) { - - $displayname = null; - $description = null; - - foreach($properties as $property=>$newvalue) { - - switch($property) { - case '{DAV:}displayname' : - $displayname = $newvalue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV - . '}addressbook-description' : - $description = $newvalue; - break; - default : - throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' - . $property); - } - - } - - OC_Contacts_Addressbook::addFromDAVData( - $principaluri, - $url, - $name, - $description - ); - } - - /** - * Deletes an entire addressbook and all its contents - * - * @param int $addressbookid - * @return void - */ - public function deleteAddressBook($addressbookid) { - OC_Contacts_Addressbook::delete($addressbookid); - } - - /** - * Returns all cards for a specific addressbook id. - * - * @param mixed $addressbookid - * @return array - */ - public function getCards($addressbookid) { - $data = OC_Contacts_VCard::all($addressbookid); - $cards = array(); - foreach($data as $i){ - //OCP\Util::writeLog('contacts', __METHOD__.', uri: ' . $i['uri'], OCP\Util::DEBUG); - $cards[] = array( - 'id' => $i['id'], - //'carddata' => $i['carddata'], - 'size' => strlen($i['carddata']), - 'etag' => md5($i['carddata']), - 'uri' => $i['uri'], - 'lastmodified' => $i['lastmodified'] ); - } - - return $cards; - } - - /** - * Returns a specfic card - * - * @param mixed $addressbookid - * @param string $carduri - * @return array - */ - public function getCard($addressbookid, $carduri) { - return OC_Contacts_VCard::findWhereDAVDataIs($addressbookid, $carduri); - - } - - /** - * Creates a new card - * - * @param mixed $addressbookid - * @param string $carduri - * @param string $carddata - * @return bool - */ - public function createCard($addressbookid, $carduri, $carddata) { - OC_Contacts_VCard::addFromDAVData($addressbookid, $carduri, $carddata); - return true; - } - - /** - * Updates a card - * - * @param mixed $addressbookid - * @param string $carduri - * @param string $carddata - * @return bool - */ - public function updateCard($addressbookid, $carduri, $carddata) { - return OC_Contacts_VCard::editFromDAVData( - $addressbookid, $carduri, $carddata - ); - } - - /** - * Deletes a card - * - * @param mixed $addressbookid - * @param string $carduri - * @return bool - */ - public function deleteCard($addressbookid, $carduri) { - return OC_Contacts_VCard::deleteFromDAVData($addressbookid, $carduri); - } -} diff --git a/apps/contacts/lib/sabre/card.php b/apps/contacts/lib/sabre/card.php deleted file mode 100644 index f4414a25f7..0000000000 --- a/apps/contacts/lib/sabre/card.php +++ /dev/null @@ -1,94 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CardDAV_Card::getACL() - * to return read/write permissions based on user and shared state. -*/ -class OC_Connector_Sabre_CardDAV_Card extends Sabre_CardDAV_Card { - - /** - * Array with information about the containing addressbook - * - * @var array - */ - private $addressBookInfo; - - /** - * Constructor - * - * @param Sabre_CardDAV_Backend_Abstract $carddavBackend - * @param array $addressBookInfo - * @param array $cardData - */ - public function __construct(Sabre_CardDAV_Backend_Abstract $carddavBackend, array $addressBookInfo, array $cardData) { - - $this->addressBookInfo = $addressBookInfo; - parent::__construct($carddavBackend, $addressBookInfo, $cardData); - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $readprincipal = $this->getOwner(); - $writeprincipal = $this->getOwner(); - $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); - - if($uid != OCP\USER::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { - $readprincipal = 'principals/' . OCP\USER::getUser(); - } - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - $writeprincipal = 'principals/' . OCP\USER::getUser(); - } - } - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $readprincipal, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $writeprincipal, - 'protected' => true, - ), - - ); - - } - -} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/useraddressbooks.php b/apps/contacts/lib/sabre/useraddressbooks.php deleted file mode 100644 index 328b433bd6..0000000000 --- a/apps/contacts/lib/sabre/useraddressbooks.php +++ /dev/null @@ -1,45 +0,0 @@ -. - * - */ - -/** - * This class overrides Sabre_CardDAV_UserAddressBooks::getChildren() - * to instantiate OC_Connector_Sabre_CardDAV_AddressBooks. -*/ -class OC_Connector_Sabre_CardDAV_UserAddressBooks extends Sabre_CardDAV_UserAddressBooks { - - /** - * Returns a list of addressbooks - * - * @return array - */ - public function getChildren() { - - $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); - $objs = array(); - foreach($addressbooks as $addressbook) { - $objs[] = new OC_Connector_Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); - } - return $objs; - - } - -} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/vcfexportplugin.php b/apps/contacts/lib/sabre/vcfexportplugin.php deleted file mode 100644 index f0ba60b303..0000000000 --- a/apps/contacts/lib/sabre/vcfexportplugin.php +++ /dev/null @@ -1,100 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod', array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?', $uri, 2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_CardDAV_IAddressBook)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type', 'text/directory'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data', - ), 1); - - $this->server->httpResponse->sendBody($this->generateVCF($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all vcard objects, and builds one big vcf export - * - * @param array $nodes - * @return string - */ - public function generateVCF(array $nodes) { - $objects = array(); - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) { - continue; - } - $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data']; - $objects[] = $nodeData; - - } - - return implode("\r\n", $objects); - - } - -} diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php deleted file mode 100644 index 53aa2b4849..0000000000 --- a/apps/contacts/lib/search.php +++ /dev/null @@ -1,21 +0,0 @@ - 0) { - $link = OCP\Util::linkTo('contacts', 'index.php').'&id='.urlencode($vcard['id']); - $results[]=new OC_Search_Result($vcard['fullname'], '', $link, (string)$l->t('Contact'));//$name,$text,$link,$type - } - } - } - return $results; - } -} diff --git a/apps/contacts/lib/share/addressbook.php b/apps/contacts/lib/share/addressbook.php deleted file mode 100644 index acabeab2ad..0000000000 --- a/apps/contacts/lib/share/addressbook.php +++ /dev/null @@ -1,94 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class OC_Share_Backend_Addressbook implements OCP\Share_Backend_Collection { - const FORMAT_ADDRESSBOOKS = 1; - - /** - * @brief Get the source of the item to be stored in the database - * @param string Item - * @param string Owner of the item - * @return mixed|array|false Source - * - * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' - * Return false if the item does not exist for the user - * - * The formatItems() function will translate the source returned back into the item - */ - public function isValidSource($itemSource, $uidOwner) { - $addressbook = OC_Contacts_Addressbook::find( $itemSource ); - if( $addressbook === false || $addressbook['userid'] != $uidOwner) { - return false; - } - return true; - } - - /** - * @brief Get a unique name of the item for the specified user - * @param string Item - * @param string|false User the item is being shared with - * @param array|null List of similar item names already existing as shared items - * @return string Target name - * - * This function needs to verify that the user does not already have an item with this name. - * If it does generate a new name e.g. name_# - */ - public function generateTarget($itemSource, $shareWith, $exclude = null) { - $addressbook = OC_Contacts_Addressbook::find( $itemSource ); - $user_addressbooks = array(); - foreach(OC_Contacts_Addressbook::all($shareWith) as $user_addressbook) { - $user_addressbooks[] = $user_addressbook['displayname']; - } - $name = $addressbook['userid']."'s ".$addressbook['displayname']; - $suffix = ''; - while (in_array($name.$suffix, $user_addressbooks)) { - $suffix++; - } - - return $name.$suffix; - } - - /** - * @brief Converts the shared item sources back into the item in the specified format - * @param array Shared items - * @param int Format - * @return ? - * - * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. - * The key/value pairs included in the share info depend on the function originally called: - * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source - * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target - * This function allows the backend to control the output of shared items with custom formats. - * It is only called through calls to the public getItem(s)Shared(With) functions. - */ - public function formatItems($items, $format, $parameters = null) { - $addressbooks = array(); - if ($format == self::FORMAT_ADDRESSBOOKS) { - foreach ($items as $item) { - $addressbook = OC_Contacts_Addressbook::find($item['item_source']); - if ($addressbook) { - $addressbook['displayname'] = $item['item_target']; - $addressbook['permissions'] = $item['permissions']; - $addressbooks[] = $addressbook; - } - } - } - return $addressbooks; - } - - public function getChildren($itemSource) { - $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ?'); - $result = $query->execute(array($itemSource)); - $sources = array(); - while ($contact = $result->fetchRow()) { - $sources[] = $contact['id']; - } - return $sources; - } - -} diff --git a/apps/contacts/lib/share/contact.php b/apps/contacts/lib/share/contact.php deleted file mode 100644 index 718c8f9025..0000000000 --- a/apps/contacts/lib/share/contact.php +++ /dev/null @@ -1,53 +0,0 @@ -. -*/ - -class OC_Share_Backend_Contact implements OCP\Share_Backend { - - const FORMAT_CONTACT = 0; - - private static $contact; - - public function isValidSource($itemSource, $uidOwner) { - self::$contact = OC_Contacts_VCard::find($itemSource); - if (self::$contact) { - return true; - } - return false; - } - - public function generateTarget($itemSource, $shareWith, $exclude = null) { - // TODO Get default addressbook and check for conflicts - return self::$contact['fullname']; - } - - public function formatItems($items, $format, $parameters = null) { - $contacts = array(); - if ($format == self::FORMAT_CONTACT) { - foreach ($items as $item) { - $contact = OC_Contacts_VCard::find($item['item_source']); - $contact['fullname'] = $item['item_target']; - $contacts[] = $contact; - } - } - return $contacts; - } - -} \ No newline at end of file diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php deleted file mode 100644 index 91a5b806b1..0000000000 --- a/apps/contacts/lib/vcard.php +++ /dev/null @@ -1,733 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -/* - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE contacts_cards ( - * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * addressbookid INT(11) UNSIGNED NOT NULL, - * fullname VARCHAR(255), - * carddata TEXT, - * uri VARCHAR(100), - * lastmodified INT(11) UNSIGNED - * ); - */ - -/** - * This class manages our vCards - */ -class OC_Contacts_VCard { - /** - * @brief Returns all cards of an address book - * @param integer $id - * @return array|false - * - * The cards are associative arrays. You'll find the original vCard in - * ['carddata'] - */ - public static function all($id, $start=null, $num=null){ - $result = null; - if(is_array($id) && count($id)) { - $id_sql = join(',', array_fill(0, count($id), '?')); - $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`'; - try { - $stmt = OCP\DB::prepare( $sql, $num, $start ); - $result = $stmt->execute($id); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __METHOD__.'SQL:'.$sql, OCP\Util::DEBUG); - return false; - } - } elseif(is_int($id) || is_string($id)) { - try { - $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`'; - $stmt = OCP\DB::prepare( $sql, $num, $start ); - $result = $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', ids: '. $id, OCP\Util::DEBUG); - return false; - } - } else { - OCP\Util::writeLog('contacts', __METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG); - return false; - } - $cards = array(); - if(!is_null($result)) { - while( $row = $result->fetchRow()){ - $cards[] = $row; - } - } - - return $cards; - } - - /** - * @brief Returns a card - * @param integer $id - * @return associative array or false. - */ - public static function find($id){ - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' ); - $result = $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', id: '. $id, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief finds a card by its DAV Data - * @param integer $aid Addressbook id - * @param string $uri the uri ('filename') - * @return associative array or false. - */ - public static function findWhereDAVDataIs($aid,$uri){ - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); - $result = $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief Format property TYPE parameters for upgrading from v. 2.1 - * @param $property Reference to a Sabre_VObject_Property. - * In version 2.1 e.g. a phone can be formatted like: TEL;HOME;CELL:123456789 - * This has to be changed to either TEL;TYPE=HOME,CELL:123456789 or TEL;TYPE=HOME;TYPE=CELL:123456789 - both are valid. - */ - public static function formatPropertyTypes(&$property) { - foreach($property->parameters as $key=>&$parameter){ - $types = OC_Contacts_App::getTypesOfProperty($property->name); - if(is_array($types) && in_array(strtoupper($parameter->name), array_keys($types)) || strtoupper($parameter->name) == 'PREF') { - $property->parameters[] = new Sabre_VObject_Parameter('TYPE', $parameter->name); - } - unset($property->parameters[$key]); - } - } - - /** - * @brief Decode properties for upgrading from v. 2.1 - * @param $property Reference to a Sabre_VObject_Property. - * The only encoding allowed in version 3.0 is 'b' for binary. All encoded strings - * must therefor be decoded and the parameters removed. - */ - public static function decodeProperty(&$property) { - // Check out for encoded string and decode them :-[ - foreach($property->parameters as $key=>&$parameter){ - if(strtoupper($parameter->name) == 'ENCODING') { - if(strtoupper($parameter->value) == 'QUOTED-PRINTABLE') { // what kind of other encodings could be used? - $property->value = quoted_printable_decode($property->value); - unset($property->parameters[$key]); - } - } elseif(strtoupper($parameter->name) == 'CHARSET') { - unset($property->parameters[$key]); - } - } - } - - /** - * @brief Checks if a contact with the same UID already exist in the address book. - * @param $aid Address book ID. - * @param $uid UID (passed by reference). - * @returns true if the UID has been changed. - */ - protected static function trueUID($aid, &$uid) { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); - $uri = $uid.'.vcf'; - try { - $result = $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG); - return false; - } - if($result->numRows() > 0) { - while(true) { - $tmpuid = substr(md5(rand().time()), 0, 10); - $uri = $tmpuid.'.vcf'; - $result = $stmt->execute(array($aid, $uri)); - if($result->numRows() > 0) { - continue; - } else { - $uid = $tmpuid; - return true; - } - } - } else { - return false; - } - } - - /** - * @brief Tries to update imported VCards to adhere to rfc2426 (VERSION: 3.0) and add mandatory fields if missing. - * @param aid Address book id. - * @param vcard An OC_VObject of type VCARD (passed by reference). - */ - protected static function updateValuesFromAdd($aid, &$vcard) { // any suggestions for a better method name? ;-) - $stringprops = array('N', 'FN', 'ORG', 'NICK', 'ADR', 'NOTE'); - $typeprops = array('ADR', 'TEL', 'EMAIL'); - $upgrade = false; - $fn = $n = $uid = $email = $org = null; - $version = $vcard->getAsString('VERSION'); - // Add version if needed - if($version && $version < '3.0') { - $upgrade = true; - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Updating from version: '.$version, OCP\Util::DEBUG); - } - foreach($vcard->children as &$property){ - // Decode string properties and remove obsolete properties. - if($upgrade && in_array($property->name, $stringprops)) { - self::decodeProperty($property); - } - $property->value = str_replace("\r\n", "\n", iconv(mb_detect_encoding($property->value, 'UTF-8, ISO-8859-1'), 'utf-8', $property->value)); - if(in_array($property->name, $stringprops)) { - $property->value = strip_tags($property->value); - } - // Fix format of type parameters. - if($upgrade && in_array($property->name, $typeprops)) { - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. before: '.$property->serialize(), OCP\Util::DEBUG); - self::formatPropertyTypes($property); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. after: '.$property->serialize(), OCP\Util::DEBUG); - } - if($property->name == 'FN') { - $fn = $property->value; - } - if($property->name == 'N') { - $n = $property->value; - } - if($property->name == 'UID') { - $uid = $property->value; - } - if($property->name == 'ORG') { - $org = $property->value; - } - if($property->name == 'EMAIL' && is_null($email)) { // only use the first email as substitute for missing N or FN. - $email = $property->value; - } - } - // Check for missing 'N', 'FN' and 'UID' properties - if(!$fn) { - if($n && $n != ';;;;') { - $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); - } elseif($email) { - $fn = $email; - } elseif($org) { - $fn = $org; - } else { - $fn = 'Unknown Name'; - } - $vcard->setString('FN', $fn); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'FN\' field: '.$fn, OCP\Util::DEBUG); - } - if(!$n || $n == ';;;;') { // Fix missing 'N' field. Ugly hack ahead ;-) - $slice = array_reverse(array_slice(explode(' ', $fn), 0, 2)); // Take 2 first name parts of 'FN' and reverse. - if(count($slice) < 2) { // If not enought, add one more... - $slice[] = ""; - } - $n = implode(';', $slice).';;;'; - $vcard->setString('N', $n); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'N\' field: '.$n, OCP\Util::DEBUG); - } - if(!$uid) { - $vcard->setUID(); - $uid = $vcard->getAsString('UID'); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'UID\' field: '.$uid, OCP\Util::DEBUG); - } - if(self::trueUID($aid, $uid)) { - $vcard->setString('UID', $uid); - } - $now = new DateTime; - $vcard->setString('REV', $now->format(DateTime::W3C)); - } - - /** - * @brief Adds a card - * @param $aid integer Addressbook id - * @param $card OC_VObject vCard file - * @param $uri string the uri of the card, default based on the UID - * @param $isChecked boolean If the vCard should be checked for validity and version. - * @return insertid on success or false. - */ - public static function add($aid, OC_VObject $card, $uri=null, $isChecked=false){ - if(is_null($card)) { - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::add. No vCard supplied', OCP\Util::ERROR); - return null; - }; - $addressbook = OC_Contacts_Addressbook::find($aid); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); - if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { - return false; - } - } - if(!$isChecked) { - OC_Contacts_App::loadCategoriesFromVCard($card); - self::updateValuesFromAdd($aid, $card); - } - $card->setString('VERSION', '3.0'); - // Add product ID is missing. - $prodid = trim($card->getAsString('PRODID')); - if(!$prodid) { - $appinfo = OCP\App::getAppInfo('contacts'); - $appversion = OCP\App::getAppVersion('contacts'); - $prodid = '-//ownCloud//NONSGML '.$appinfo['name'].' '.$appversion.'//EN'; - $card->setString('PRODID', $prodid); - } - - $fn = $card->getAsString('FN'); - if (empty($fn)) { - $fn = ''; - } - - if (!$uri) { - $uid = $card->getAsString('UID'); - $uri = $uid.'.vcf'; - } - - $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`,`fullname`,`carddata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?)' ); - try { - $result = $stmt->execute(array($aid,$fn,$data,$uri,time())); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); - return false; - } - $newid = OCP\DB::insertid('*PREFIX*contacts_cards'); - - OC_Contacts_Addressbook::touch($aid); - OC_Hook::emit('OC_Contacts_VCard', 'post_createVCard', $newid); - return $newid; - } - - /** - * @brief Adds a card with the data provided by sabredav - * @param integer $id Addressbook id - * @param string $uri the uri the card will have - * @param string $data vCard file - * @return insertid - */ - public static function addFromDAVData($id,$uri,$data){ - $card = OC_VObject::parse($data); - return self::add($id, $card, $uri); - } - - /** - * @brief Mass updates an array of cards - * @param array $objects An array of [id, carddata]. - */ - public static function updateDataByID($objects){ - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `carddata` = ?, `lastmodified` = ? WHERE `id` = ?' ); - $now = new DateTime; - foreach($objects as $object) { - $vcard = OC_VObject::parse($object[1]); - if(!is_null($vcard)) { - $oldcard = self::find($object[0]); - if (!$oldcard) { - return false; - } - $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $object[0], OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - return false; - } - } - $vcard->setString('REV', $now->format(DateTime::W3C)); - $data = $vcard->serialize(); - try { - $result = $stmt->execute(array($data,time(),$object[0])); - //OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0].': '.$object[1],OCP\Util::DEBUG); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', id: '.$object[0], OCP\Util::DEBUG); - } - } - } - } - - /** - * @brief edits a card - * @param integer $id id of card - * @param OC_VObject $card vCard file - * @return boolean - */ - public static function edit($id, OC_VObject $card){ - $oldcard = self::find($id); - if (!$oldcard) { - return false; - } - if(is_null($card)) { - return false; - } - // NOTE: Owner checks are being made in the ajax files, which should be done inside the lib files to prevent any redundancies with sharing checks - $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { - throw new Exception(OC_Contacts_App::$l10n->t('You do not have the permissions to edit this contact.')); - } - } - OC_Contacts_App::loadCategoriesFromVCard($card); - - $fn = $card->getAsString('FN'); - if (empty($fn)) { - $fn = null; - } - - $now = new DateTime; - $card->setString('REV', $now->format(DateTime::W3C)); - - $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `fullname` = ?,`carddata` = ?, `lastmodified` = ? WHERE `id` = ?' ); - try { - $result = $stmt->execute(array($fn,$data,time(),$id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: ' - . $e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); - return false; - } - - OC_Contacts_Addressbook::touch($oldcard['addressbookid']); - OC_Hook::emit('OC_Contacts_VCard', 'post_updateVCard', $id); - return true; - } - - /** - * @brief edits a card with the data provided by sabredav - * @param integer $id Addressbook id - * @param string $uri the uri of the card - * @param string $data vCard file - * @return boolean - */ - public static function editFromDAVData($aid, $uri, $data){ - $oldcard = self::findWhereDAVDataIs($aid, $uri); - $card = OC_VObject::parse($data); - if(!$card) { - OCP\Util::writeLog('contacts', __METHOD__. - ', Unable to parse VCARD, uri: '.$uri, OCP\Util::ERROR); - return false; - } - try { - self::edit($oldcard['id'], $card); - return true; - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: ' - . $e->getMessage() . ', ' - . OCP\USER::getUser(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', uri' - . $uri, OCP\Util::DEBUG); - return false; - } - } - - /** - * @brief deletes a card - * @param integer $id id of card - * @return boolean - */ - public static function delete($id){ - $card = self::find($id); - if (!$card) { - return false; - } - $addressbook = OC_Contacts_Addressbook::find($card['addressbookid']); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', - $id, OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact - || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { - throw new Exception( - OC_Contacts_App::$l10n->t( - 'You do not have the permissions to delete this contact.' - ) - ); - } - } - OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', - array('aid' => null, 'id' => $id, 'uri' => null) - ); - $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?'); - try { - $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__. - ', exception: ' . $e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', id: ' - . $id, OCP\Util::DEBUG); - return false; - } - - return true; - } - - /** - * @brief deletes a card with the data provided by sabredav - * @param integer $aid Addressbook id - * @param string $uri the uri of the card - * @return boolean - */ - public static function deleteFromDAVData($aid,$uri){ - $addressbook = OC_Contacts_Addressbook::find($aid); - if ($addressbook['userid'] != OCP\User::getUser()) { - $query = OCP\DB::prepare( 'SELECT `id` FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); - $id = $query->execute(array($aid, $uri))->fetchOne(); - if (!$id) { - return false; - } - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { - return false; - } - } - OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => $aid, 'id' => null, 'uri' => $uri)); - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri`=?' ); - try { - $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG); - return false; - } - OC_Contacts_Addressbook::touch($aid); - - return true; - } - - /** - * @brief Escapes delimiters from an array and returns a string. - * @param array $value - * @param char $delimiter - * @return string - */ - public static function escapeDelimiters($value, $delimiter=';') { - foreach($value as &$i ) { - $i = implode("\\$delimiter", explode($delimiter, $i)); - } - return implode($delimiter, $value); - } - - - /** - * @brief Creates an array out of a multivalue property - * @param string $value - * @param char $delimiter - * @return array - */ - public static function unescapeDelimiters($value, $delimiter=';') { - $array = explode($delimiter, $value); - for($i=0;$ichildren as $property) { - $pname = $property->name; - $temp = self::structureProperty($property); - if(!is_null($temp)) { - // Get Apple X-ABLabels - if(isset($object->{$property->group . '.X-ABLABEL'})) { - $temp['label'] = $object->{$property->group . '.X-ABLABEL'}->value; - if($temp['label'] == '_$!!$_') { - $temp['label'] = OC_Contacts_App::$l10n->t('Other'); - } - } - if(array_key_exists($pname, $details)) { - $details[$pname][] = $temp; - } - else{ - $details[$pname] = array($temp); - } - } - } - return $details; - } - - /** - * @brief Data structure of properties - * @param object $property - * @return associative array - * - * returns an associative array with - * ['name'] name of property - * ['value'] htmlspecialchars escaped value of property - * ['parameters'] associative array name=>value - * ['checksum'] checksum of whole property - * NOTE: $value is not escaped anymore. It shouldn't make any difference - * but we should look out for any problems. - */ - public static function structureProperty($property) { - $value = $property->value; - //$value = htmlspecialchars($value); - if($property->name == 'ADR' || $property->name == 'N') { - $value = self::unescapeDelimiters($value); - } elseif($property->name == 'BDAY') { - if(strpos($value, '-') === false) { - if(strlen($value) >= 8) { - $value = substr($value, 0, 4).'-'.substr($value, 4, 2).'-'.substr($value, 6, 2); - } else { - return null; // Badly malformed :-( - } - } - } - if(is_string($value)) { - $value = strtr($value, array('\,' => ',', '\;' => ';')); - } - $temp = array( - 'name' => $property->name, - 'value' => $value, - 'parameters' => array(), - 'checksum' => md5($property->serialize())); - foreach($property->parameters as $parameter){ - // Faulty entries by kaddressbook - // Actually TYPE=PREF is correct according to RFC 2426 - // but this way is more handy in the UI. Tanghus. - if($parameter->name == 'TYPE' && strtoupper($parameter->value) == 'PREF') { - $parameter->name = 'PREF'; - $parameter->value = '1'; - } - // NOTE: Apparently Sabre_VObject_Reader can't always deal with value list parameters - // like TYPE=HOME,CELL,VOICE. Tanghus. - if (in_array($property->name, array('TEL', 'EMAIL')) && $parameter->name == 'TYPE') { - if (isset($temp['parameters'][$parameter->name])) { - $temp['parameters'][$parameter->name][] = $parameter->value; - } - else { - $temp['parameters'][$parameter->name] = array($parameter->value); - } - } - else{ - $temp['parameters'][$parameter->name] = $parameter->value; - } - } - return $temp; - } - - /** - * @brief Move card(s) to an address book - * @param integer $aid Address book id - * @param $id Array or integer of cards to be moved. - * @return boolean - * - */ - public static function moveToAddressBook($aid, $id, $isAddressbook = false) { - OC_Contacts_App::getAddressbook($aid); // check for user ownership. - $addressbook = OC_Contacts_Addressbook::find($aid); - if ($addressbook['userid'] != OCP\User::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); - if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { - return false; - } - } - if(is_array($id)) { - foreach ($id as $index => $cardId) { - $card = self::find($cardId); - if (!$card) { - unset($id[$index]); - } - $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); - if ($oldAddressbook['userid'] != OCP\User::getUser()) { - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $cardId, OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { - unset($id[$index]); - } - } - } - $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` IN ('.$id_sql.')'; - try { - $stmt = OCP\DB::prepare( $prep ); - //$aid = array($aid); - $vals = array_merge((array)$aid, $id); - $result = $stmt->execute($vals); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $vals), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __METHOD__.', SQL:'.$prep, OCP\Util::DEBUG); - return false; - } - } else { - $stmt = null; - if($isAddressbook) { - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `addressbookid` = ?' ); - } else { - $card = self::find($id); - if (!$card) { - return false; - } - $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); - if ($oldAddressbook['userid'] != OCP\User::getUser()) { - $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); - if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { - return false; - } - } - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` = ?' ); - } - try { - $result = $stmt->execute(array($aid, $id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, OCP\Util::DEBUG); - return false; - } - } - OC_Hook::emit('OC_Contacts_VCard', 'post_moveToAddressbook', array('aid' => $aid, 'id' => $id)); - OC_Contacts_Addressbook::touch($aid); - return true; - } -} diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php deleted file mode 100644 index f5c8e6fe4b..0000000000 --- a/apps/contacts/photo.php +++ /dev/null @@ -1,83 +0,0 @@ - - * Copyright (c) 2011, 2012 Bart Visscher - * Copyright (c) 2011 Jakob Sack mail@jakobsack.de - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Init owncloud - -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); - -function getStandardImage() { - //OCP\Response::setExpiresHeader('P10D'); - OCP\Response::enableCaching(); - OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person_large.png')); -} - -$id = isset($_GET['id']) ? $_GET['id'] : null; -$etag = null; -$caching = null; - -if(is_null($id)) { - getStandardImage(); -} - -if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts', - 'photo.php. GD module not installed', OCP\Util::DEBUG); - getStandardImage(); -} - -$contact = OC_Contacts_App::getContactVCard($id); -$image = new OC_Image(); -if (!$image) { - getStandardImage(); -} -// invalid vcard -if (is_null($contact)) { - OCP\Util::writeLog('contacts', - 'photo.php. The VCard for ID ' . $id . ' is not RFC compatible', - OCP\Util::ERROR); -} else { - // Photo :-) - if ($image->loadFromBase64($contact->getAsString('PHOTO'))) { - // OK - $etag = md5($contact->getAsString('PHOTO')); - } - else - // Logo :-/ - if ($image->loadFromBase64($contact->getAsString('LOGO'))) { - // OK - $etag = md5($contact->getAsString('LOGO')); - } - if ($image->valid()) { - $modified = OC_Contacts_App::lastModified($contact); - // Force refresh if modified within the last minute. - if(!is_null($modified)) { - $caching = (time() - $modified->format('U') > 60) ? null : 0; - } - OCP\Response::enableCaching($caching); - if(!is_null($modified)) { - OCP\Response::setLastModifiedHeader($modified); - } - if($etag) { - OCP\Response::setETagHeader($etag); - } - $max_size = 200; - if ($image->width() > $max_size || $image->height() > $max_size) { - $image->resize($max_size); - } - } -} -if (!$image->valid()) { - // Not found :-( - getStandardImage(); -} -header('Content-Type: '.$image->mimeType()); -$image->show(); - diff --git a/apps/contacts/settings.php b/apps/contacts/settings.php deleted file mode 100644 index 5f639399c9..0000000000 --- a/apps/contacts/settings.php +++ /dev/null @@ -1,6 +0,0 @@ -assign('addressbooks', OC_Contacts_Addressbook::all(OCP\USER::getUser()), false); - -$tmpl->printPage(); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php deleted file mode 100644 index 744381026a..0000000000 --- a/apps/contacts/templates/index.php +++ /dev/null @@ -1,74 +0,0 @@ -
    - -
    - -
    -
    -
    -
    - - - -
    - - -
    - -
    -
    -
    - inc('part.contact'); - } - else{ - echo $this->inc('part.no_contacts'); - } - ?> - -
    - -
    - - - - - diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php deleted file mode 100644 index 87ed07c0ec..0000000000 --- a/apps/contacts/templates/part.contact.php +++ /dev/null @@ -1,145 +0,0 @@ - - -
    -
    - - - - - -
    - -
    - - -
    - -
    -
    - -
    - -
    - - -
    - - - - -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - - - - -
    - - - -
    -
    -
    -
    diff --git a/apps/contacts/templates/part.cropphoto.php b/apps/contacts/templates/part.cropphoto.php deleted file mode 100644 index 3f5817622b..0000000000 --- a/apps/contacts/templates/part.cropphoto.php +++ /dev/null @@ -1,67 +0,0 @@ - - - - -
    - - - - -
    - - - - - - -
    - -
    -t('The temporary image has been removed from cache.'); -} -?> diff --git a/apps/contacts/templates/part.edit_address_dialog.php b/apps/contacts/templates/part.edit_address_dialog.php deleted file mode 100644 index 81e24ba4d0..0000000000 --- a/apps/contacts/templates/part.edit_address_dialog.php +++ /dev/null @@ -1,63 +0,0 @@ - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    Powered by geonames.org
    -
    - -
    diff --git a/apps/contacts/templates/part.edit_name_dialog.php b/apps/contacts/templates/part.edit_name_dialog.php deleted file mode 100644 index f984c232a3..0000000000 --- a/apps/contacts/templates/part.edit_name_dialog.php +++ /dev/null @@ -1,58 +0,0 @@ - -
    -
    -
    -
    - - - -
    -
    - -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    diff --git a/apps/contacts/templates/part.import.php b/apps/contacts/templates/part.import.php deleted file mode 100644 index 32c8dc50dd..0000000000 --- a/apps/contacts/templates/part.import.php +++ /dev/null @@ -1,27 +0,0 @@ -
    "> -
    - - - -

    t('Please choose the addressbook'); ?>

    - - - !" id="startimport"> -
    - -
    \ No newline at end of file diff --git a/apps/contacts/templates/part.no_contacts.php b/apps/contacts/templates/part.no_contacts.php deleted file mode 100644 index 1802939483..0000000000 --- a/apps/contacts/templates/part.no_contacts.php +++ /dev/null @@ -1,7 +0,0 @@ - -
    - t('You have no contacts in your addressbook.') ?> -
    - -
    -
    diff --git a/apps/contacts/templates/part.selectaddressbook.php b/apps/contacts/templates/part.selectaddressbook.php deleted file mode 100644 index 812a3b891f..0000000000 --- a/apps/contacts/templates/part.selectaddressbook.php +++ /dev/null @@ -1,34 +0,0 @@ -
    "> - -
    - - $addressbook) { ?> - - - - - - - - - - - -
    - > - - -
    - - - " /> - " />
    -
    -
    - diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php deleted file mode 100644 index e3536c7b46..0000000000 --- a/apps/contacts/templates/settings.php +++ /dev/null @@ -1,55 +0,0 @@ -
    -
    - t('CardDAV syncing addresses'); ?> (t('more info'); ?>) -
    -
    t('Primary address (Kontact et al)'); ?>
    -
    -
    t('iOS/OS X'); ?>
    -
    principals//
    - - -
    -
    - -
    -
    -
    diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php deleted file mode 100644 index 1e3714ae6c..0000000000 --- a/apps/contacts/thumbnail.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -OCP\JSON::checkLoggedIn(); -//OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -session_write_close(); - -function getStandardImage() { - OCP\Response::enableCaching(); - OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person.png')); -} - -if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts', - 'thumbnail.php. GD module not installed', OCP\Util::DEBUG); - getStandardImage(); - exit(); -} - -$id = $_GET['id']; -$caching = null; - -$contact = OC_Contacts_App::getContactVCard($id); - -// invalid vcard -if(is_null($contact)) { - OCP\Util::writeLog('contacts', - 'thumbnail.php. The VCard for ID ' . $id . ' is not RFC compatible', - OCP\Util::ERROR); - getStandardImage(); - exit(); -} -OCP\Response::enableCaching($caching); -OC_Contacts_App::setLastModifiedHeader($contact); - -$thumbnail_size = 23; - -// Find the photo from VCard. -$image = new OC_Image(); -$photo = $contact->getAsString('PHOTO'); -if($photo) { - if($image->loadFromBase64($photo)) { - if($image->centerCrop()) { - if($image->resize($thumbnail_size)) { - $modified = OC_Contacts_App::lastModified($contact); - // Force refresh if modified within the last minute. - if(!is_null($modified)) { - $caching = (time() - $modified->format('U') > 60) ? null : 0; - } - OCP\Response::enableCaching($caching); - if(!is_null($modified)) { - OCP\Response::setLastModifiedHeader($modified); - } - OCP\Response::setETagHeader(md5($photo)); - if($image->show()) { - exit(); - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t display thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t resize thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - }else{ - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t crop thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t load image string for ID ' . $id, - OCP\Util::ERROR); - } -} -getStandardImage(); diff --git a/apps/contacts/tmpphoto.php b/apps/contacts/tmpphoto.php deleted file mode 100644 index 156d5c8030..0000000000 --- a/apps/contacts/tmpphoto.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -$tmpkey = $_GET['tmpkey']; -$maxsize = isset($_GET['maxsize']) ? $_GET['maxsize'] : -1; -header("Cache-Control: no-cache, no-store, must-revalidate"); - -OCP\Util::writeLog('contacts', 'tmpphoto.php: tmpkey: '.$tmpkey, OCP\Util::DEBUG); - -$image = new OC_Image(); -$image->loadFromData(OC_Cache::get($tmpkey)); -if($maxsize != -1) { - $image->resize($maxsize); -} -$image(); diff --git a/apps/external/ajax/setsites.php b/apps/external/ajax/setsites.php deleted file mode 100644 index 0f9e061d0e..0000000000 --- a/apps/external/ajax/setsites.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * - */ - -OC::$CLASSPATH['OC_External'] = 'apps/external/lib/external.php'; -OCP\Util::addStyle( 'external', 'style'); - -OCP\App::registerAdmin('external', 'settings'); - -$sites = OC_External::getSites(); -for ($i = 0; $i < sizeof($sites); $i++) { - OCP\App::addNavigationEntry( - array('id' => 'external_index' . ($i + 1), 'order' => 80 + $i, 'href' => OCP\Util::linkTo('external', 'index.php') . '?id=' . ($i + 1), 'icon' => OCP\Util::imagePath('external', 'external.png'), 'name' => $sites[$i][0])); -} diff --git a/apps/external/appinfo/info.xml b/apps/external/appinfo/info.xml deleted file mode 100644 index c4d0b55481..0000000000 --- a/apps/external/appinfo/info.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - external - External - Show external Application in the ownCloud menu - AGPL - Frank Karlitschek - 4 - true - diff --git a/apps/external/appinfo/version b/apps/external/appinfo/version deleted file mode 100644 index 9f8e9b69a3..0000000000 --- a/apps/external/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0 \ No newline at end of file diff --git a/apps/external/css/style.css b/apps/external/css/style.css deleted file mode 100644 index f891cb4bc5..0000000000 --- a/apps/external/css/style.css +++ /dev/null @@ -1,14 +0,0 @@ -/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- / -/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */ - -.site_url { - width: 250px; -} - -.delete_button { - display: none; -} - -.external_sites { - width: 450px; -} diff --git a/apps/external/img/external.png b/apps/external/img/external.png deleted file mode 100644 index 9e56f2919f..0000000000 Binary files a/apps/external/img/external.png and /dev/null differ diff --git a/apps/external/img/external.svg b/apps/external/img/external.svg deleted file mode 100644 index b47305fbd0..0000000000 --- a/apps/external/img/external.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/external/index.php b/apps/external/index.php deleted file mode 100644 index 3b6f06e1bf..0000000000 --- a/apps/external/index.php +++ /dev/null @@ -1,42 +0,0 @@ -. - * - */ - -require_once('lib/external.php'); - -OCP\User::checkLoggedIn(); - -if (isset($_GET['id'])) { - - $id = $_GET['id']; - $id = (int) $id; - - $sites = OC_External::getSites(); - if (sizeof($sites) >= $id) { - $url = $sites[$id - 1][1]; - OCP\App::setActiveNavigationEntry('external_index' . $id); - - $tmpl = new OCP\Template('external', 'frame', 'user'); - $tmpl->assign('url', $url); - $tmpl->printPage(); - } -} diff --git a/apps/external/js/admin.js b/apps/external/js/admin.js deleted file mode 100644 index 0caaabd0b9..0000000000 --- a/apps/external/js/admin.js +++ /dev/null @@ -1,57 +0,0 @@ -$(document).ready(function(){ - newSiteHtml = '
  • \n\ - \n\ -
  • '; - - // Handler functions - function addSiteEventHandler(event) { - event.preventDefault(); - - saveSites(); - } - - function deleteButtonEventHandler(event) { - event.preventDefault(); - - $(this).tipsy('hide'); - $(this).parent().remove(); - - saveSites(); - } - - function saveSites() { - var post = $('#external').serialize(); - $.post( OC.filePath('external','ajax','setsites.php') , post, function(data) { - // OC.msg.finishedSaving('#site_name .msg', data); - }); - } - - function showDeleteButton(event) { - $(this).find('img.delete_button').fadeIn(100); - } - - function hideDeleteButton(event) { - $(this).find('img.delete_button').fadeOut(100); - } - - // Initialize events - $('input[name^=site_]').change(addSiteEventHandler); - $('img.delete_button').click(deleteButtonEventHandler); - $('img.delete_button').tipsy(); - - $('#external li').hover(showDeleteButton, hideDeleteButton); - - $('#add_external_site').click(function(event) { - event.preventDefault(); - $('#external ul').append(newSiteHtml); - - $('input.site_url:last').prev('input.site_name').andSelf().change(addSiteEventHandler); - $('img.delete_button').click(deleteButtonEventHandler); - $('img.delete_button:last').tipsy(); - $('#external li:last').hover(showDeleteButton, hideDeleteButton); - - }); - -}); - - diff --git a/apps/external/lib/external.php b/apps/external/lib/external.php deleted file mode 100644 index d13a7cf6dd..0000000000 --- a/apps/external/lib/external.php +++ /dev/null @@ -1,34 +0,0 @@ -. - * - */ - -class OC_External { - - public static function getSites() { - if (($sites = json_decode(OCP\Config::getAppValue("external", "sites", ''))) != NULL) { - return $sites; - } - - return array(); - } - -} diff --git a/apps/external/settings.php b/apps/external/settings.php deleted file mode 100644 index 488444c119..0000000000 --- a/apps/external/settings.php +++ /dev/null @@ -1,9 +0,0 @@ -fetchPage(); diff --git a/apps/external/templates/frame.php b/apps/external/templates/frame.php deleted file mode 100644 index 38b4008353..0000000000 --- a/apps/external/templates/frame.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - diff --git a/apps/external/templates/settings.php b/apps/external/templates/settings.php deleted file mode 100644 index b8139727eb..0000000000 --- a/apps/external/templates/settings.php +++ /dev/null @@ -1,21 +0,0 @@ -
    -
    - External Sites
    -
      - - - - - '; - } - ?> - -
    - - - -
    -
    diff --git a/apps/files_archive/appinfo/app.php b/apps/files_archive/appinfo/app.php deleted file mode 100644 index 67376c4a03..0000000000 --- a/apps/files_archive/appinfo/app.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OC::$CLASSPATH['OC_Filestorage_Archive']='apps/files_archive/lib/storage.php'; - -OCP\Util::connectHook('OC_Filesystem','get_mountpoint','OC_Filestorage_Archive','autoMount'); - -OCP\Util::addscript( 'files_archive', 'archive' ); diff --git a/apps/files_archive/appinfo/info.xml b/apps/files_archive/appinfo/info.xml deleted file mode 100644 index 93ec68ee10..0000000000 --- a/apps/files_archive/appinfo/info.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - files_archive - Archive support - Transparent opening of archives - AGPL - Robin Appelman - 4 - true - - - - - diff --git a/apps/files_archive/appinfo/version b/apps/files_archive/appinfo/version deleted file mode 100644 index 2f4536184b..0000000000 --- a/apps/files_archive/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2 \ No newline at end of file diff --git a/apps/files_archive/js/archive.js b/apps/files_archive/js/archive.js deleted file mode 100644 index 6bcbe09266..0000000000 --- a/apps/files_archive/js/archive.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2012 Robin Appelman - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - FileActions.register('application/zip','Open', FileActions.PERMISSION_READ, '',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); - }); - FileActions.setDefault('application/zip','Open'); - FileActions.register('application/x-gzip','Open', FileActions.PERMISSION_READ, '',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); - }); - FileActions.setDefault('application/x-gzip','Open'); - } -}); diff --git a/apps/files_archive/lib/storage.php b/apps/files_archive/lib/storage.php deleted file mode 100644 index 3c14c3e1fd..0000000000 --- a/apps/files_archive/lib/storage.php +++ /dev/null @@ -1,174 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class OC_Filestorage_Archive extends OC_Filestorage_Common{ - /** - * underlying local storage used for missing functions - * @var OC_Archive - */ - private $archive; - private $path; - private static $mounted=array(); - private static $enableAutomount=true; - private static $rootView; - - private function stripPath($path){//files should never start with / - if(!$path || $path[0]=='/'){ - $path=substr($path,1); - } - return $path; - } - - public function __construct($params){ - $this->archive=OC_Archive::open($params['archive']); - $this->path=$params['archive']; - } - - public function mkdir($path){ - $path=$this->stripPath($path); - return $this->archive->addFolder($path); - } - public function rmdir($path){ - $path=$this->stripPath($path); - return $this->archive->remove($path.'/'); - } - public function opendir($path){ - if(substr($path,-1)!=='/'){ - $path.='/'; - } - $path=$this->stripPath($path); - $files=$this->archive->getFolder($path); - $content=array(); - foreach($files as $file){ - if(substr($file,-1)=='/'){ - $file=substr($file,0,-1); - } - if($file and strpos($file,'/')===false){ - $content[]=$file; - } - } - $id=md5($this->path.$path); - OC_FakeDirStream::$dirs[$id]=$content; - return opendir('fakedir://'.$id); - } - public function stat($path){ - $ctime=-1; - $path=$this->stripPath($path); - if($path==''){ - $stat=stat($this->path); - $stat['size']=0; - }else{ - if($this->is_dir($path)){ - $stat=array('size'=>0); - $stat['mtime']=filemtime($this->path); - }else{ - $stat=array(); - $stat['mtime']=$this->archive->mtime($path); - $stat['size']=$this->archive->filesize($path); - if(!$stat['mtime']){ - $stat['mtime']=time(); - } - } - } - $stat['ctime']=$ctime; - return $stat; - } - public function filetype($path){ - $path=$this->stripPath($path); - if($path==''){ - return 'dir'; - } - if(substr($path,-1)=='/'){ - return $this->archive->fileExists($path)?'dir':'file'; - }else{ - return $this->archive->fileExists($path.'/')?'dir':'file'; - } - } - public function isReadable($path){ - return is_readable($this->path); - } - public function isUpdatable($path){ - return is_writable($this->path); - } - public function file_exists($path){ - $path=$this->stripPath($path); - if($path==''){ - return file_exists($this->path); - } - return $this->archive->fileExists($path); - } - public function unlink($path){ - $path=$this->stripPath($path); - return $this->archive->remove($path); - } - public function fopen($path,$mode){ - $path=$this->stripPath($path); - return $this->archive->getStream($path,$mode); - } - public function free_space($path){ - return 0; - } - public function touch($path, $mtime=null){ - if(is_null($mtime)){ - $tmpFile=OCP\Files::tmpFile(); - $this->archive->extractFile($path,$tmpFile); - $this->archive->addfile($path,$tmpFile); - }else{ - return false;//not supported - } - } - private function toTmpFile($path){ - $tmpFile=OC_Helper::tmpFile($extension); - $this->archive->extractFile($path,$tmpFile); - return $tmpFile; - } - public function file_put_contents($path,$data) { - $path=$this->stripPath($path); - return $this->archive->addFile($path,$data); - } - public function file_get_contents($path) { - $path=$this->stripPath($path); - return $this->archive->getFile($path); - } - - /** - * automount paths from file hooks - * @param aray params - */ - public static function autoMount($params){ - if(!self::$enableAutomount){ - return; - } - $path=$params['path']; - if(!self::$rootView){ - self::$rootView=new OC_FilesystemView(''); - } - self::$enableAutomount=false;//prevent recursion - $supported=array('zip','tar.gz','tar.bz2','tgz'); - foreach($supported as $type){ - $ext='.'.$type.'/'; - if(($pos=strpos(strtolower($path),$ext))!==false){ - $archive=substr($path,0,$pos+strlen($ext)-1); - if(self::$rootView->file_exists($archive) and array_search($archive,self::$mounted)===false){ - $localArchive=self::$rootView->getLocalFile($archive); - OC_Filesystem::mount('OC_Filestorage_Archive',array('archive'=>$localArchive),$archive.'/'); - self::$mounted[]=$archive; - } - } - } - self::$enableAutomount=true; - } - - public function rename($path1,$path2){ - return $this->archive->rename($path1,$path2); - } - - public function hasUpdated($path,$time){ - return $this->filemtime($this->path)>$time; - } -} diff --git a/apps/files_archive/tests/data/data.tar.gz b/apps/files_archive/tests/data/data.tar.gz deleted file mode 100644 index 39f2cdada0..0000000000 Binary files a/apps/files_archive/tests/data/data.tar.gz and /dev/null differ diff --git a/apps/files_archive/tests/data/data.zip b/apps/files_archive/tests/data/data.zip deleted file mode 100644 index eccef53eb4..0000000000 Binary files a/apps/files_archive/tests/data/data.zip and /dev/null differ diff --git a/apps/files_archive/tests/data/lorem.txt b/apps/files_archive/tests/data/lorem.txt deleted file mode 100644 index b62c3fb2ff..0000000000 --- a/apps/files_archive/tests/data/lorem.txt +++ /dev/null @@ -1,4 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. -Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/apps/files_archive/tests/storage.php b/apps/files_archive/tests/storage.php deleted file mode 100644 index 74ddf22870..0000000000 --- a/apps/files_archive/tests/storage.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_Filestorage_Archive_Zip extends Test_FileStorage { - /** - * @var string tmpDir - */ - private $tmpFile; - - public function setUp(){ - $this->tmpFile=OCP\Files::tmpFile('.zip'); - $this->instance=new OC_Filestorage_Archive(array('archive'=>$this->tmpFile)); - } - - public function tearDown(){ - unlink($this->tmpFile); - } -} - -class Test_Filestorage_Archive_Tar extends Test_FileStorage { - /** - * @var string tmpDir - */ - private $tmpFile; - - public function setUp(){ - $this->tmpFile=OCP\Files::tmpFile('.tar.gz'); - $this->instance=new OC_Filestorage_Archive(array('archive'=>$this->tmpFile)); - } - - public function tearDown(){ - unlink($this->tmpFile); - } -} diff --git a/apps/files_imageviewer/appinfo/app.php b/apps/files_imageviewer/appinfo/app.php deleted file mode 100644 index 6184585cff..0000000000 --- a/apps/files_imageviewer/appinfo/app.php +++ /dev/null @@ -1,6 +0,0 @@ - - - files_imageviewer - Image Viewer - Simple image viewer for owncloud - AGPL - Robin Appelman - 4 - true - - diff --git a/apps/files_imageviewer/appinfo/version b/apps/files_imageviewer/appinfo/version deleted file mode 100644 index 9f8e9b69a3..0000000000 --- a/apps/files_imageviewer/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0 \ No newline at end of file diff --git a/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css b/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css deleted file mode 100644 index 6e982805a4..0000000000 --- a/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css +++ /dev/null @@ -1,359 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -#fancybox-loading { - position: fixed; - top: 50%; - left: 50%; - width: 40px; - height: 40px; - margin-top: -20px; - margin-left: -20px; - cursor: pointer; - overflow: hidden; - z-index: 1104; - display: none; -} - -#fancybox-loading div { - position: absolute; - top: 0; - left: 0; - width: 40px; - height: 480px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); -} - -#fancybox-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - z-index: 1100; - display: none; -} - -#fancybox-tmp { - padding: 0; - margin: 0; - border: 0; - overflow: auto; - display: none; -} - -#fancybox-wrap { - position: absolute; - top: 0; - left: 0; - padding: 20px; - z-index: 1101; - outline: none; - display: none; -} - -#fancybox-outer { - position: relative; - width: 100%; - height: 100%; - background: #fff; -} - -#fancybox-content { - width: 0; - height: 0; - padding: 0; - outline: none; - position: relative; - overflow: hidden; - z-index: 1102; - border: 0px solid #fff; -} - -#fancybox-hide-sel-frame { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: transparent; - z-index: 1101; -} - -#fancybox-close { - position: absolute; - top: -15px; - right: -15px; - width: 30px; - height: 30px; - background: transparent url('%appswebroot%/files_imageviewer/img/fancybox.png') -40px 0px; - cursor: pointer; - z-index: 1103; - display: none; -} - -#fancybox-error { - color: #444; - font: normal 12px/20px Arial; - padding: 14px; - margin: 0; -} - -#fancybox-img { - width: 100%; - height: 100%; - padding: 0; - margin: 0; - border: none; - outline: none; - line-height: 0; - vertical-align: top; -} - -#fancybox-frame { - width: 100%; - height: 100%; - border: none; - display: block; -} - -#fancybox-left, #fancybox-right { - position: absolute; - bottom: 0px; - height: 100%; - width: 35%; - cursor: pointer; - outline: none; - background: transparent url('%appswebroot%/files_imageviewer/img/blank.gif'); - z-index: 1102; - display: none; -} - -#fancybox-left { - left: 0px; -} - -#fancybox-right { - right: 0px; -} - -#fancybox-left-ico, #fancybox-right-ico { - position: absolute; - top: 50%; - left: -9999px; - width: 30px; - height: 30px; - margin-top: -15px; - cursor: pointer; - z-index: 1102; - display: block; -} - -#fancybox-left-ico { - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -30px; -} - -#fancybox-right-ico { - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -60px; -} - -#fancybox-left:hover, #fancybox-right:hover { - visibility: visible; /* IE6 */ -} - -#fancybox-left:hover span { - left: 20px; -} - -#fancybox-right:hover span { - left: auto; - right: 20px; -} - -.fancybox-bg { - position: absolute; - padding: 0; - margin: 0; - border: 0; - width: 20px; - height: 20px; - z-index: 1001; -} - -#fancybox-bg-n { - top: -20px; - left: 0; - width: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-x.png'); -} - -#fancybox-bg-ne { - top: -20px; - right: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -162px; -} - -#fancybox-bg-e { - top: 0; - right: -20px; - height: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-y.png'); - background-position: -20px 0px; -} - -#fancybox-bg-se { - bottom: -20px; - right: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -182px; -} - -#fancybox-bg-s { - bottom: -20px; - left: 0; - width: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-x.png'); - background-position: 0px -20px; -} - -#fancybox-bg-sw { - bottom: -20px; - left: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -142px; -} - -#fancybox-bg-w { - top: 0; - left: -20px; - height: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-y.png'); -} - -#fancybox-bg-nw { - top: -20px; - left: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -122px; -} - -#fancybox-title { - font-family: Helvetica; - font-size: 12px; - z-index: 1102; -} - -.fancybox-title-inside { - padding-bottom: 10px; - text-align: center; - color: #333; - background: #fff; - position: relative; -} - -.fancybox-title-outside { - padding-top: 10px; - color: #fff; -} - -.fancybox-title-over { - position: absolute; - bottom: 0; - left: 0; - color: #FFF; - text-align: left; -} - -#fancybox-title-over { - padding: 10px; - background-image: url('%appswebroot%/files_imageviewer/img/fancy_title_over.png'); - display: block; -} - -.fancybox-title-float { - position: absolute; - left: 0; - bottom: -20px; - height: 32px; -} - -#fancybox-title-float-wrap { - border: none; - border-collapse: collapse; - width: auto; -} - -#fancybox-title-float-wrap td { - border: none; - white-space: nowrap; -} - -#fancybox-title-float-left { - padding: 0 0 0 15px; - background: url('%appswebroot%/files_imageviewer/img/fancybox.png') -40px -90px no-repeat; -} - -#fancybox-title-float-main { - color: #FFF; - line-height: 29px; - font-weight: bold; - padding: 0 0 3px 0; - background: url('%appswebroot%/files_imageviewer/img/fancybox-x.png') 0px -40px; -} - -#fancybox-title-float-right { - padding: 0 0 0 15px; - background: url('%appswebroot%/files_imageviewer/img/fancybox.png') -55px -90px no-repeat; -} - -/* IE6 */ - -.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_close.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_nav_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_nav_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } -.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_main.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { - height: expression(this.parentNode.clientHeight + "px"); -} - -#fancybox-loading.fancybox-ie6 { - position: absolute; margin-top: 0; - top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); -} - -#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_loading.png', sizingMethod='scale'); } - -/* IE6, IE7, IE8 */ - -.fancybox-ie .fancybox-bg { background: transparent !important; } - -.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_n.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_ne.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_e.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_se.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_s.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_sw.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_w.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_nw.png', sizingMethod='scale'); } diff --git a/apps/files_imageviewer/img/blank.gif b/apps/files_imageviewer/img/blank.gif deleted file mode 100644 index 35d42e808f..0000000000 Binary files a/apps/files_imageviewer/img/blank.gif and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_close.png b/apps/files_imageviewer/img/fancy_close.png deleted file mode 100644 index 07035307ad..0000000000 Binary files a/apps/files_imageviewer/img/fancy_close.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_loading.png b/apps/files_imageviewer/img/fancy_loading.png deleted file mode 100644 index 2503017960..0000000000 Binary files a/apps/files_imageviewer/img/fancy_loading.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_nav_left.png b/apps/files_imageviewer/img/fancy_nav_left.png deleted file mode 100644 index ebaa6a4fd3..0000000000 Binary files a/apps/files_imageviewer/img/fancy_nav_left.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_nav_right.png b/apps/files_imageviewer/img/fancy_nav_right.png deleted file mode 100644 index 873294e969..0000000000 Binary files a/apps/files_imageviewer/img/fancy_nav_right.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_e.png b/apps/files_imageviewer/img/fancy_shadow_e.png deleted file mode 100644 index 2eda089364..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_e.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_n.png b/apps/files_imageviewer/img/fancy_shadow_n.png deleted file mode 100644 index 69aa10e233..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_n.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_ne.png b/apps/files_imageviewer/img/fancy_shadow_ne.png deleted file mode 100644 index 79f6980a3b..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_ne.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_nw.png b/apps/files_imageviewer/img/fancy_shadow_nw.png deleted file mode 100644 index 7182cd938a..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_nw.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_s.png b/apps/files_imageviewer/img/fancy_shadow_s.png deleted file mode 100644 index d8858bfb78..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_s.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_se.png b/apps/files_imageviewer/img/fancy_shadow_se.png deleted file mode 100644 index 541e3ffd3e..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_se.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_sw.png b/apps/files_imageviewer/img/fancy_shadow_sw.png deleted file mode 100644 index b451689fa7..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_sw.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_w.png b/apps/files_imageviewer/img/fancy_shadow_w.png deleted file mode 100644 index 8a4e4a887f..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_w.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_left.png b/apps/files_imageviewer/img/fancy_title_left.png deleted file mode 100644 index 6049223d1e..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_left.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_main.png b/apps/files_imageviewer/img/fancy_title_main.png deleted file mode 100644 index 8044271f29..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_main.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_over.png b/apps/files_imageviewer/img/fancy_title_over.png deleted file mode 100644 index d9f458f4bb..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_over.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_right.png b/apps/files_imageviewer/img/fancy_title_right.png deleted file mode 100644 index e36d9db2a7..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_right.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox-x.png b/apps/files_imageviewer/img/fancybox-x.png deleted file mode 100644 index c2130f8698..0000000000 Binary files a/apps/files_imageviewer/img/fancybox-x.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox-y.png b/apps/files_imageviewer/img/fancybox-y.png deleted file mode 100644 index 62f3176199..0000000000 Binary files a/apps/files_imageviewer/img/fancybox-y.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox.png b/apps/files_imageviewer/img/fancybox.png deleted file mode 100644 index 65e14f68fd..0000000000 Binary files a/apps/files_imageviewer/img/fancybox.png and /dev/null differ diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js deleted file mode 100644 index e5493cd939..0000000000 --- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js +++ /dev/null @@ -1,1156 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -;(function($) { - var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, - - selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], - - ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, - - loadingTimer, loadingFrame = 1, - - titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('
    ')[0], { prop: 0 }), - - isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, - - /* - * Private methods - */ - - _abort = function() { - loading.hide(); - - imgPreloader.onerror = imgPreloader.onload = null; - - if (ajaxLoader) { - ajaxLoader.abort(); - } - - tmp.empty(); - }, - - _error = function() { - if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { - loading.hide(); - busy = false; - return; - } - - selectedOpts.titleShow = false; - - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - - tmp.html( '

    The requested content cannot be loaded.
    Please try again later.

    ' ); - - _process_inline(); - }, - - _start = function() { - var obj = selectedArray[ selectedIndex ], - href, - type, - title, - str, - emb, - ret; - - _abort(); - - selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); - - ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); - - if (ret === false) { - busy = false; - return; - } else if (typeof ret == 'object') { - selectedOpts = $.extend(selectedOpts, ret); - } - - title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; - - if (obj.nodeName && !selectedOpts.orig) { - selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); - } - - if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { - title = selectedOpts.orig.attr('alt'); - } - - title = title.replace(//, ">"); - - href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; - - if ((/^(?:javascript)/i).test(href) || href == '#') { - href = null; - } - - if (selectedOpts.type) { - type = selectedOpts.type; - - if (!href) { - href = selectedOpts.content; - } - - } else if (selectedOpts.content) { - type = 'html'; - - } else if (href) { - if (href.match(imgRegExp)) { - type = 'image'; - - } else if (href.match(swfRegExp)) { - type = 'swf'; - - } else if ($(obj).hasClass("iframe")) { - type = 'iframe'; - - } else if (href.indexOf("#") === 0) { - type = 'inline'; - - } - } - - if (!type) { - _error(); - return; - } - - if (type == 'inline') { - obj = href.substr(href.indexOf("#")); - type = $(obj).length > 0 ? 'inline' : 'ajax'; - } - - selectedOpts.type = type; - selectedOpts.href = href; - selectedOpts.title = title; - - if (selectedOpts.autoDimensions) { - if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - } else { - selectedOpts.autoDimensions = false; - } - } - - if (selectedOpts.modal) { - selectedOpts.overlayShow = true; - selectedOpts.hideOnOverlayClick = false; - selectedOpts.hideOnContentClick = false; - selectedOpts.enableEscapeButton = false; - selectedOpts.showCloseButton = false; - } - - selectedOpts.padding = parseInt(selectedOpts.padding, 10); - selectedOpts.margin = parseInt(selectedOpts.margin, 10); - - tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); - - $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { - $(this).replaceWith(content.children()); - }); - - switch (type) { - case 'html' : - tmp.html( selectedOpts.content ); - _process_inline(); - break; - - case 'inline' : - if ( $(obj).parent().is('#fancybox-content') === true) { - busy = false; - return; - } - - $('
    ') - .hide() - .insertBefore( $(obj) ) - .bind('fancybox-cleanup', function() { - $(this).replaceWith(content.children()); - }).bind('fancybox-cancel', function() { - $(this).replaceWith(tmp.children()); - }); - - $(obj).appendTo(tmp); - - _process_inline(); - break; - - case 'image': - busy = false; - - $.fancybox.showActivity(); - - imgPreloader = new Image(); - - imgPreloader.onerror = function() { - _error(); - }; - - imgPreloader.onload = function() { - busy = true; - - imgPreloader.onerror = imgPreloader.onload = null; - - _process_image(); - }; - - imgPreloader.src = href; - break; - - case 'swf': - selectedOpts.scrolling = 'no'; - - str = ''; - emb = ''; - - $.each(selectedOpts.swf, function(name, val) { - str += ''; - emb += ' ' + name + '="' + val + '"'; - }); - - str += ''; - - tmp.html(str); - - _process_inline(); - break; - - case 'ajax': - busy = false; - - $.fancybox.showActivity(); - - selectedOpts.ajax.win = selectedOpts.ajax.success; - - ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { - url : href, - data : selectedOpts.ajax.data || {}, - error : function(XMLHttpRequest, textStatus, errorThrown) { - if ( XMLHttpRequest.status > 0 ) { - _error(); - } - }, - success : function(data, textStatus, XMLHttpRequest) { - var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; - if (o.status == 200) { - if ( typeof selectedOpts.ajax.win == 'function' ) { - ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); - - if (ret === false) { - loading.hide(); - return; - } else if (typeof ret == 'string' || typeof ret == 'object') { - data = ret; - } - } - - tmp.html( data ); - _process_inline(); - } - } - })); - - break; - - case 'iframe': - _show(); - break; - } - }, - - _process_inline = function() { - var - w = selectedOpts.width, - h = selectedOpts.height; - - if (w.toString().indexOf('%') > -1) { - w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; - - } else { - w = w == 'auto' ? 'auto' : w + 'px'; - } - - if (h.toString().indexOf('%') > -1) { - h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; - - } else { - h = h == 'auto' ? 'auto' : h + 'px'; - } - - tmp.wrapInner('
    '); - - selectedOpts.width = tmp.width(); - selectedOpts.height = tmp.height(); - - _show(); - }, - - _process_image = function() { - selectedOpts.width = imgPreloader.width; - selectedOpts.height = imgPreloader.height; - - $("").attr({ - 'id' : 'fancybox-img', - 'src' : imgPreloader.src, - 'alt' : selectedOpts.title - }).appendTo( tmp ); - - _show(); - }, - - _show = function() { - var pos, equal; - - loading.hide(); - - if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - $.event.trigger('fancybox-cancel'); - - busy = false; - return; - } - - busy = true; - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { - wrap.css('height', wrap.height()); - } - - currentArray = selectedArray; - currentIndex = selectedIndex; - currentOpts = selectedOpts; - - if (currentOpts.overlayShow) { - overlay.css({ - 'background-color' : currentOpts.overlayColor, - 'opacity' : currentOpts.overlayOpacity, - 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', - 'height' : $(document).height() - }); - - if (!overlay.is(':visible')) { - if (isIE6) { - $('select:not(#fancybox-tmp select)').filter(function() { - return this.style.visibility !== 'hidden'; - }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { - this.style.visibility = 'inherit'; - }); - } - - overlay.show(); - } - } else { - overlay.hide(); - } - - final_pos = _get_zoom_to(); - - _process_title(); - - if (wrap.is(":visible")) { - $( close.add( nav_left ).add( nav_right ) ).hide(); - - pos = wrap.position(), - - start_pos = { - top : pos.top, - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); - - content.fadeTo(currentOpts.changeFade, 0.3, function() { - var finish_resizing = function() { - content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish); - }; - - $.event.trigger('fancybox-change'); - - content - .empty() - .removeAttr('filter') - .css({ - 'border-width' : currentOpts.padding, - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }); - - if (equal) { - finish_resizing(); - - } else { - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.changeSpeed, - easing : currentOpts.easingChange, - step : _draw, - complete : finish_resizing - }); - } - }); - - return; - } - - wrap.removeAttr("style"); - - content.css('border-width', currentOpts.padding); - - if (currentOpts.transitionIn == 'elastic') { - start_pos = _get_zoom_from(); - - content.html( tmp.contents() ); - - wrap.show(); - - if (currentOpts.opacity) { - final_pos.opacity = 0; - } - - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.speedIn, - easing : currentOpts.easingIn, - step : _draw, - complete : _finish - }); - - return; - } - - if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { - title.show(); - } - - content - .css({ - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }) - .html( tmp.contents() ); - - wrap - .css(final_pos) - .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); - }, - - _format_title = function(title) { - if (title && title.length) { - if (currentOpts.titlePosition == 'float') { - return '
    ' + title + '
    '; - } - - return '
    ' + title + '
    '; - } - - return false; - }, - - _process_title = function() { - titleStr = currentOpts.title || ''; - titleHeight = 0; - - title - .empty() - .removeAttr('style') - .removeClass(); - - if (currentOpts.titleShow === false) { - title.hide(); - return; - } - - titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); - - if (!titleStr || titleStr === '') { - title.hide(); - return; - } - - title - .addClass('fancybox-title-' + currentOpts.titlePosition) - .html( titleStr ) - .appendTo( 'body' ) - .show(); - - switch (currentOpts.titlePosition) { - case 'inside': - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'marginLeft' : currentOpts.padding, - 'marginRight' : currentOpts.padding - }); - - titleHeight = title.outerHeight(true); - - title.appendTo( outer ); - - final_pos.height += titleHeight; - break; - - case 'over': - title - .css({ - 'marginLeft' : currentOpts.padding, - 'width' : final_pos.width - (currentOpts.padding * 2), - 'bottom' : currentOpts.padding - }) - .appendTo( outer ); - break; - - case 'float': - title - .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) - .appendTo( wrap ); - break; - - default: - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'paddingLeft' : currentOpts.padding, - 'paddingRight' : currentOpts.padding - }) - .appendTo( wrap ); - break; - } - - title.hide(); - }, - - _set_navigation = function() { - if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { - $(document).bind('keydown.fb', function(e) { - if (e.keyCode == 27 && currentOpts.enableEscapeButton) { - e.preventDefault(); - $.fancybox.close(); - - } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { - e.preventDefault(); - $.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); - } - }); - } - - if (!currentOpts.showNavArrows) { - nav_left.hide(); - nav_right.hide(); - return; - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { - nav_left.show(); - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { - nav_right.show(); - } - }, - - _finish = function () { - if (!$.support.opacity) { - content.get(0).style.removeAttribute('filter'); - wrap.get(0).style.removeAttribute('filter'); - } - - if (selectedOpts.autoDimensions) { - content.css('height', 'auto'); - } - - wrap.css('height', 'auto'); - - if (titleStr && titleStr.length) { - title.show(); - } - - if (currentOpts.showCloseButton) { - close.show(); - } - - _set_navigation(); - - if (currentOpts.hideOnContentClick) { - content.bind('click', $.fancybox.close); - } - - if (currentOpts.hideOnOverlayClick) { - overlay.bind('click', $.fancybox.close); - } - - $(window).bind("resize.fb", $.fancybox.resize); - - if (currentOpts.centerOnScroll) { - $(window).bind("scroll.fb", $.fancybox.center); - } - - if (currentOpts.type == 'iframe') { - $('').appendTo(content); - } - - wrap.show(); - - busy = false; - - $.fancybox.center(); - - currentOpts.onComplete(currentArray, currentIndex, currentOpts); - - _preload_images(); - }, - - _preload_images = function() { - var href, - objNext; - - if ((currentArray.length -1) > currentIndex) { - href = currentArray[ currentIndex + 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - - if (currentIndex > 0) { - href = currentArray[ currentIndex - 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - }, - - _draw = function(pos) { - var dim = { - width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), - height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), - - top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), - left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) - }; - - if (typeof final_pos.opacity !== 'undefined') { - dim.opacity = pos < 0.5 ? 0.5 : pos; - } - - wrap.css(dim); - - content.css({ - 'width' : dim.width - currentOpts.padding * 2, - 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 - }); - }, - - _get_viewport = function() { - return [ - $(window).width() - (currentOpts.margin * 2), - $(window).height() - (currentOpts.margin * 2), - $(document).scrollLeft() + currentOpts.margin, - $(document).scrollTop() + currentOpts.margin - ]; - }, - - _get_zoom_to = function () { - var view = _get_viewport(), - to = {}, - resize = currentOpts.autoScale, - double_padding = currentOpts.padding * 2, - ratio; - - if (currentOpts.width.toString().indexOf('%') > -1) { - to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); - } else { - to.width = currentOpts.width + double_padding; - } - - if (currentOpts.height.toString().indexOf('%') > -1) { - to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); - } else { - to.height = currentOpts.height + double_padding; - } - - if (resize && (to.width > view[0] || to.height > view[1])) { - if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { - ratio = (currentOpts.width ) / (currentOpts.height ); - - if ((to.width ) > view[0]) { - to.width = view[0]; - to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); - } - - if ((to.height) > view[1]) { - to.height = view[1]; - to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); - } - - } else { - to.width = Math.min(to.width, view[0]); - to.height = Math.min(to.height, view[1]); - } - } - - to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); - to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); - - return to; - }, - - _get_obj_pos = function(obj) { - var pos = obj.offset(); - - pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; - pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; - - pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; - pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; - - pos.width = obj.width(); - pos.height = obj.height(); - - return pos; - }, - - _get_zoom_from = function() { - var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, - from = {}, - pos, - view; - - if (orig && orig.length) { - pos = _get_obj_pos(orig); - - from = { - width : pos.width + (currentOpts.padding * 2), - height : pos.height + (currentOpts.padding * 2), - top : pos.top - currentOpts.padding - 20, - left : pos.left - currentOpts.padding - 20 - }; - - } else { - view = _get_viewport(); - - from = { - width : currentOpts.padding * 2, - height : currentOpts.padding * 2, - top : parseInt(view[3] + view[1] * 0.5, 10), - left : parseInt(view[2] + view[0] * 0.5, 10) - }; - } - - return from; - }, - - _animate_loading = function() { - if (!loading.is(':visible')){ - clearInterval(loadingTimer); - return; - } - - $('div', loading).css('top', (loadingFrame * -40) + 'px'); - - loadingFrame = (loadingFrame + 1) % 12; - }; - - /* - * Public methods - */ - - $.fn.fancybox = function(options) { - if (!$(this).length) { - return this; - } - - $(this) - .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) - .unbind('click.fb') - .bind('click.fb', function(e) { - e.preventDefault(); - - if (busy) { - return; - } - - busy = true; - - $(this).blur(); - - selectedArray = []; - selectedIndex = 0; - - var rel = $(this).attr('rel') || ''; - - if (!rel || rel == '' || rel === 'nofollow') { - selectedArray.push(this); - - } else { - selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); - selectedIndex = selectedArray.index( this ); - } - - _start(); - - return; - }); - - return this; - }; - - $.fancybox = function(obj) { - var opts; - - if (busy) { - return; - } - - busy = true; - opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; - - selectedArray = []; - selectedIndex = parseInt(opts.index, 10) || 0; - - if ($.isArray(obj)) { - for (var i = 0, j = obj.length; i < j; i++) { - if (typeof obj[i] == 'object') { - $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); - } else { - obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); - } - } - - selectedArray = jQuery.merge(selectedArray, obj); - - } else { - if (typeof obj == 'object') { - $(obj).data('fancybox', $.extend({}, opts, obj)); - } else { - obj = $({}).data('fancybox', $.extend({content : obj}, opts)); - } - - selectedArray.push(obj); - } - - if (selectedIndex > selectedArray.length || selectedIndex < 0) { - selectedIndex = 0; - } - - _start(); - }; - - $.fancybox.showActivity = function() { - clearInterval(loadingTimer); - - loading.show(); - loadingTimer = setInterval(_animate_loading, 66); - }; - - $.fancybox.hideActivity = function() { - loading.hide(); - }; - - $.fancybox.next = function() { - return $.fancybox.pos( currentIndex + 1); - }; - - $.fancybox.prev = function() { - return $.fancybox.pos( currentIndex - 1); - }; - - $.fancybox.pos = function(pos) { - if (busy) { - return; - } - - pos = parseInt(pos); - - selectedArray = currentArray; - - if (pos > -1 && pos < currentArray.length) { - selectedIndex = pos; - _start(); - - } else if (currentOpts.cyclic && currentArray.length > 1) { - selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; - _start(); - } - - return; - }; - - $.fancybox.cancel = function() { - if (busy) { - return; - } - - busy = true; - - $.event.trigger('fancybox-cancel'); - - _abort(); - - selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); - - busy = false; - }; - - // Note: within an iframe use - parent.$.fancybox.close(); - $.fancybox.close = function() { - if (busy || wrap.is(':hidden')) { - return; - } - - busy = true; - - if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - busy = false; - return; - } - - _abort(); - - $(close.add( nav_left ).add( nav_right )).hide(); - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); - - if (currentOpts.titlePosition !== 'inside') { - title.empty(); - } - - wrap.stop(); - - function _cleanup() { - overlay.fadeOut('fast'); - - title.empty().hide(); - wrap.hide(); - - $.event.trigger('fancybox-cleanup'); - - content.empty(); - - currentOpts.onClosed(currentArray, currentIndex, currentOpts); - - currentArray = selectedOpts = []; - currentIndex = selectedIndex = 0; - currentOpts = selectedOpts = {}; - - busy = false; - } - - if (currentOpts.transitionOut == 'elastic') { - start_pos = _get_zoom_from(); - - var pos = wrap.position(); - - final_pos = { - top : pos.top , - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - if (currentOpts.opacity) { - final_pos.opacity = 1; - } - - title.empty().hide(); - - fx.prop = 1; - - $(fx).animate({ prop: 0 }, { - duration : currentOpts.speedOut, - easing : currentOpts.easingOut, - step : _draw, - complete : _cleanup - }); - - } else { - wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); - } - }; - - $.fancybox.resize = function() { - if (overlay.is(':visible')) { - overlay.css('height', $(document).height()); - } - - $.fancybox.center(true); - }; - - $.fancybox.center = function() { - var view, align; - - if (busy) { - return; - } - - align = arguments[0] === true ? 1 : 0; - view = _get_viewport(); - - if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { - return; - } - - wrap - .stop() - .animate({ - 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), - 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) - }, typeof arguments[0] == 'number' ? arguments[0] : 200); - }; - - $.fancybox.init = function() { - if ($("#fancybox-wrap").length) { - return; - } - - $('body').append( - tmp = $('
    '), - loading = $('
    '), - overlay = $('
    '), - wrap = $('
    ') - ); - - outer = $('
    ') - .append('
    ') - .appendTo( wrap ); - - outer.append( - content = $('
    '), - close = $(''), - title = $('
    '), - - nav_left = $(''), - nav_right = $('') - ); - - close.click($.fancybox.close); - loading.click($.fancybox.cancel); - - nav_left.click(function(e) { - e.preventDefault(); - $.fancybox.prev(); - }); - - nav_right.click(function(e) { - e.preventDefault(); - $.fancybox.next(); - }); - - if ($.fn.mousewheel) { - wrap.bind('mousewheel.fb', function(e, delta) { - if (busy) { - e.preventDefault(); - - } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { - e.preventDefault(); - $.fancybox[ delta > 0 ? 'prev' : 'next'](); - } - }); - } - - if (!$.support.opacity) { - wrap.addClass('fancybox-ie'); - } - - if (isIE6) { - loading.addClass('fancybox-ie6'); - wrap.addClass('fancybox-ie6'); - - $('').prependTo(outer); - } - }; - - $.fn.fancybox.defaults = { - padding : 10, - margin : 40, - opacity : false, - modal : false, - cyclic : false, - scrolling : 'auto', // 'auto', 'yes' or 'no' - - width : 560, - height : 340, - - autoScale : true, - autoDimensions : true, - centerOnScroll : false, - - ajax : {}, - swf : { wmode: 'transparent' }, - - hideOnOverlayClick : true, - hideOnContentClick : false, - - overlayShow : true, - overlayOpacity : 0.7, - overlayColor : '#777', - - titleShow : true, - titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' - titleFormat : null, - titleFromAlt : false, - - transitionIn : 'fade', // 'elastic', 'fade' or 'none' - transitionOut : 'fade', // 'elastic', 'fade' or 'none' - - speedIn : 300, - speedOut : 300, - - changeSpeed : 300, - changeFade : 'fast', - - easingIn : 'swing', - easingOut : 'swing', - - showCloseButton : true, - showNavArrows : true, - enableEscapeButton : true, - enableKeyboardNav : true, - - onStart : function(){}, - onCancel : function(){}, - onComplete : function(){}, - onCleanup : function(){}, - onClosed : function(){}, - onError : function(){} - }; - - $(document).ready(function() { - $.fancybox.init(); - }); - -})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js deleted file mode 100644 index 260f2c2d46..0000000000 --- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js +++ /dev/null @@ -1 +0,0 @@ -(function(B){var L,T,Q,M,d,m,J,A,O,z,C=0,H={},j=[],e=0,G={},y=[],f=null,o=new Image(),i=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,k=/[^\.]\.(swf)\s*$/i,p,N=1,h=0,t="",b,c,P=false,s=B.extend(B("
    ")[0],{prop:0}),S=B.browser.msie&&B.browser.version<7&&!window.XMLHttpRequest,r=function(){T.hide();o.onerror=o.onload=null;if(f){f.abort()}L.empty()},x=function(){if(false===H.onError(j,C,H)){T.hide();P=false;return}H.titleShow=false;H.width="auto";H.height="auto";L.html('

    The requested content cannot be loaded.
    Please try again later.

    ');n()},w=function(){var Z=j[C],W,Y,ab,aa,V,X;r();H=B.extend({},B.fn.fancybox.defaults,(typeof B(Z).data("fancybox")=="undefined"?H:B(Z).data("fancybox")));X=H.onStart(j,C,H);if(X===false){P=false;return}else{if(typeof X=="object"){H=B.extend(H,X)}}ab=H.title||(Z.nodeName?B(Z).attr("title"):Z.title)||"";if(Z.nodeName&&!H.orig){H.orig=B(Z).children("img:first").length?B(Z).children("img:first"):B(Z)}if(ab===""&&H.orig&&H.titleFromAlt){ab=H.orig.attr("alt")}ab=ab.replace(//,">");W=H.href||(Z.nodeName?B(Z).attr("href"):Z.href)||null;if((/^(?:javascript)/i).test(W)||W=="#"){W=null}if(H.type){Y=H.type;if(!W){W=H.content}}else{if(H.content){Y="html"}else{if(W){if(W.match(i)){Y="image"}else{if(W.match(k)){Y="swf"}else{if(B(Z).hasClass("iframe")){Y="iframe"}else{if(W.indexOf("#")===0){Y="inline"}}}}}}}if(!Y){x();return}if(Y=="inline"){Z=W.substr(W.indexOf("#"));Y=B(Z).length>0?"inline":"ajax"}H.type=Y;H.href=W;H.title=ab;if(H.autoDimensions){if(H.type=="html"||H.type=="inline"||H.type=="ajax"){H.width="auto";H.height="auto"}else{H.autoDimensions=false}}if(H.modal){H.overlayShow=true;H.hideOnOverlayClick=false;H.hideOnContentClick=false;H.enableEscapeButton=false;H.showCloseButton=false}H.padding=parseInt(H.padding,10);H.margin=parseInt(H.margin,10);L.css("padding",(H.padding+H.margin));B(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){B(this).replaceWith(m.children())});switch(Y){case"html":L.html(H.content);n();break;case"inline":if(B(Z).parent().is("#fancybox-content")===true){P=false;return}B('
    ').hide().insertBefore(B(Z)).bind("fancybox-cleanup",function(){B(this).replaceWith(m.children())}).bind("fancybox-cancel",function(){B(this).replaceWith(L.children())});B(Z).appendTo(L);n();break;case"image":P=false;B.fancybox.showActivity();o=new Image();o.onerror=function(){x()};o.onload=function(){P=true;o.onerror=o.onload=null;F()};o.src=W;break;case"swf":H.scrolling="no";aa='';V="";B.each(H.swf,function(ac,ad){aa+='';V+=" "+ac+'="'+ad+'"'});aa+='";L.html(aa);n();break;case"ajax":P=false;B.fancybox.showActivity();H.ajax.win=H.ajax.success;f=B.ajax(B.extend({},H.ajax,{url:W,data:H.ajax.data||{},error:function(ac,ae,ad){if(ac.status>0){x()}},success:function(ad,af,ac){var ae=typeof ac=="object"?ac:f;if(ae.status==200){if(typeof H.ajax.win=="function"){X=H.ajax.win(W,ad,af,ac);if(X===false){T.hide();return}else{if(typeof X=="string"||typeof X=="object"){ad=X}}}L.html(ad);n()}}}));break;case"iframe":E();break}},n=function(){var V=H.width,W=H.height;if(V.toString().indexOf("%")>-1){V=parseInt((B(window).width()-(H.margin*2))*parseFloat(V)/100,10)+"px"}else{V=V=="auto"?"auto":V+"px"}if(W.toString().indexOf("%")>-1){W=parseInt((B(window).height()-(H.margin*2))*parseFloat(W)/100,10)+"px"}else{W=W=="auto"?"auto":W+"px"}L.wrapInner('
    ');H.width=L.width();H.height=L.height();E()},F=function(){H.width=o.width;H.height=o.height;B("").attr({id:"fancybox-img",src:o.src,alt:H.title}).appendTo(L);E()},E=function(){var W,V;T.hide();if(M.is(":visible")&&false===G.onCleanup(y,e,G)){B.event.trigger("fancybox-cancel");P=false;return}P=true;B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");if(M.is(":visible")&&G.titlePosition!=="outside"){M.css("height",M.height())}y=j;e=C;G=H;if(G.overlayShow){Q.css({"background-color":G.overlayColor,opacity:G.overlayOpacity,cursor:G.hideOnOverlayClick?"pointer":"auto",height:B(document).height()});if(!Q.is(":visible")){if(S){B("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"})}Q.show()}}else{Q.hide()}c=R();l();if(M.is(":visible")){B(J.add(O).add(z)).hide();W=M.position(),b={top:W.top,left:W.left,width:M.width(),height:M.height()};V=(b.width==c.width&&b.height==c.height);m.fadeTo(G.changeFade,0.3,function(){var X=function(){m.html(L.contents()).fadeTo(G.changeFade,1,v)};B.event.trigger("fancybox-change");m.empty().removeAttr("filter").css({"border-width":G.padding,width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2});if(V){X()}else{s.prop=0;B(s).animate({prop:1},{duration:G.changeSpeed,easing:G.easingChange,step:U,complete:X})}});return}M.removeAttr("style");m.css("border-width",G.padding);if(G.transitionIn=="elastic"){b=I();m.html(L.contents());M.show();if(G.opacity){c.opacity=0}s.prop=0;B(s).animate({prop:1},{duration:G.speedIn,easing:G.easingIn,step:U,complete:v});return}if(G.titlePosition=="inside"&&h>0){A.show()}m.css({width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2}).html(L.contents());M.css(c).fadeIn(G.transitionIn=="none"?0:G.speedIn,v)},D=function(V){if(V&&V.length){if(G.titlePosition=="float"){return'
    '+V+'
    '}return'
    '+V+"
    "}return false},l=function(){t=G.title||"";h=0;A.empty().removeAttr("style").removeClass();if(G.titleShow===false){A.hide();return}t=B.isFunction(G.titleFormat)?G.titleFormat(t,y,e,G):D(t);if(!t||t===""){A.hide();return}A.addClass("fancybox-title-"+G.titlePosition).html(t).appendTo("body").show();switch(G.titlePosition){case"inside":A.css({width:c.width-(G.padding*2),marginLeft:G.padding,marginRight:G.padding});h=A.outerHeight(true);A.appendTo(d);c.height+=h;break;case"over":A.css({marginLeft:G.padding,width:c.width-(G.padding*2),bottom:G.padding}).appendTo(d);break;case"float":A.css("left",parseInt((A.width()-c.width-40)/2,10)*-1).appendTo(M);break;default:A.css({width:c.width-(G.padding*2),paddingLeft:G.padding,paddingRight:G.padding}).appendTo(M);break}A.hide()},g=function(){if(G.enableEscapeButton||G.enableKeyboardNav){B(document).bind("keydown.fb",function(V){if(V.keyCode==27&&G.enableEscapeButton){V.preventDefault();B.fancybox.close()}else{if((V.keyCode==37||V.keyCode==39)&&G.enableKeyboardNav&&V.target.tagName!=="INPUT"&&V.target.tagName!=="TEXTAREA"&&V.target.tagName!=="SELECT"){V.preventDefault();B.fancybox[V.keyCode==37?"prev":"next"]()}}})}if(!G.showNavArrows){O.hide();z.hide();return}if((G.cyclic&&y.length>1)||e!==0){O.show()}if((G.cyclic&&y.length>1)||e!=(y.length-1)){z.show()}},v=function(){if(!B.support.opacity){m.get(0).style.removeAttribute("filter");M.get(0).style.removeAttribute("filter")}if(H.autoDimensions){m.css("height","auto")}M.css("height","auto");if(t&&t.length){A.show()}if(G.showCloseButton){J.show()}g();if(G.hideOnContentClick){m.bind("click",B.fancybox.close)}if(G.hideOnOverlayClick){Q.bind("click",B.fancybox.close)}B(window).bind("resize.fb",B.fancybox.resize);if(G.centerOnScroll){B(window).bind("scroll.fb",B.fancybox.center)}if(G.type=="iframe"){B('').appendTo(m)}M.show();P=false;B.fancybox.center();G.onComplete(y,e,G);K()},K=function(){var V,W;if((y.length-1)>e){V=y[e+1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}if(e>0){V=y[e-1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}},U=function(W){var V={width:parseInt(b.width+(c.width-b.width)*W,10),height:parseInt(b.height+(c.height-b.height)*W,10),top:parseInt(b.top+(c.top-b.top)*W,10),left:parseInt(b.left+(c.left-b.left)*W,10)};if(typeof c.opacity!=="undefined"){V.opacity=W<0.5?0.5:W}M.css(V);m.css({width:V.width-G.padding*2,height:V.height-(h*W)-G.padding*2})},u=function(){return[B(window).width()-(G.margin*2),B(window).height()-(G.margin*2),B(document).scrollLeft()+G.margin,B(document).scrollTop()+G.margin]},R=function(){var V=u(),Z={},W=G.autoScale,X=G.padding*2,Y;if(G.width.toString().indexOf("%")>-1){Z.width=parseInt((V[0]*parseFloat(G.width))/100,10)}else{Z.width=G.width+X}if(G.height.toString().indexOf("%")>-1){Z.height=parseInt((V[1]*parseFloat(G.height))/100,10)}else{Z.height=G.height+X}if(W&&(Z.width>V[0]||Z.height>V[1])){if(H.type=="image"||H.type=="swf"){Y=(G.width)/(G.height);if((Z.width)>V[0]){Z.width=V[0];Z.height=parseInt(((Z.width-X)/Y)+X,10)}if((Z.height)>V[1]){Z.height=V[1];Z.width=parseInt(((Z.height-X)*Y)+X,10)}}else{Z.width=Math.min(Z.width,V[0]);Z.height=Math.min(Z.height,V[1])}}Z.top=parseInt(Math.max(V[3]-20,V[3]+((V[1]-Z.height-40)*0.5)),10);Z.left=parseInt(Math.max(V[2]-20,V[2]+((V[0]-Z.width-40)*0.5)),10);return Z},q=function(V){var W=V.offset();W.top+=parseInt(V.css("paddingTop"),10)||0;W.left+=parseInt(V.css("paddingLeft"),10)||0;W.top+=parseInt(V.css("border-top-width"),10)||0;W.left+=parseInt(V.css("border-left-width"),10)||0;W.width=V.width();W.height=V.height();return W},I=function(){var Y=H.orig?B(H.orig):false,X={},W,V;if(Y&&Y.length){W=q(Y);X={width:W.width+(G.padding*2),height:W.height+(G.padding*2),top:W.top-G.padding-20,left:W.left-G.padding-20}}else{V=u();X={width:G.padding*2,height:G.padding*2,top:parseInt(V[3]+V[1]*0.5,10),left:parseInt(V[2]+V[0]*0.5,10)}}return X},a=function(){if(!T.is(":visible")){clearInterval(p);return}B("div",T).css("top",(N*-40)+"px");N=(N+1)%12};B.fn.fancybox=function(V){if(!B(this).length){return this}B(this).data("fancybox",B.extend({},V,(B.metadata?B(this).metadata():{}))).unbind("click.fb").bind("click.fb",function(X){X.preventDefault();if(P){return}P=true;B(this).blur();j=[];C=0;var W=B(this).attr("rel")||"";if(!W||W==""||W==="nofollow"){j.push(this)}else{j=B("a[rel="+W+"], area[rel="+W+"]");C=j.index(this)}w();return});return this};B.fancybox=function(Y){var X;if(P){return}P=true;X=typeof arguments[1]!=="undefined"?arguments[1]:{};j=[];C=parseInt(X.index,10)||0;if(B.isArray(Y)){for(var W=0,V=Y.length;Wj.length||C<0){C=0}w()};B.fancybox.showActivity=function(){clearInterval(p);T.show();p=setInterval(a,66)};B.fancybox.hideActivity=function(){T.hide()};B.fancybox.next=function(){return B.fancybox.pos(e+1)};B.fancybox.prev=function(){return B.fancybox.pos(e-1)};B.fancybox.pos=function(V){if(P){return}V=parseInt(V);j=y;if(V>-1&&V1){C=V>=y.length?0:y.length-1;w()}}return};B.fancybox.cancel=function(){if(P){return}P=true;B.event.trigger("fancybox-cancel");r();H.onCancel(j,C,H);P=false};B.fancybox.close=function(){if(P||M.is(":hidden")){return}P=true;if(G&&false===G.onCleanup(y,e,G)){P=false;return}r();B(J.add(O).add(z)).hide();B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");m.find("iframe").attr("src",S&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");if(G.titlePosition!=="inside"){A.empty()}M.stop();function V(){Q.fadeOut("fast");A.empty().hide();M.hide();B.event.trigger("fancybox-cleanup");m.empty();G.onClosed(y,e,G);y=H=[];e=C=0;G=H={};P=false}if(G.transitionOut=="elastic"){b=I();var W=M.position();c={top:W.top,left:W.left,width:M.width(),height:M.height()};if(G.opacity){c.opacity=1}A.empty().hide();s.prop=1;B(s).animate({prop:0},{duration:G.speedOut,easing:G.easingOut,step:U,complete:V})}else{M.fadeOut(G.transitionOut=="none"?0:G.speedOut,V)}};B.fancybox.resize=function(){if(Q.is(":visible")){Q.css("height",B(document).height())}B.fancybox.center(true)};B.fancybox.center=function(){var V,W;if(P){return}W=arguments[0]===true?1:0;V=u();if(!W&&(M.width()>V[0]||M.height()>V[1])){return}M.stop().animate({top:parseInt(Math.max(V[3]-20,V[3]+((V[1]-m.height()-40)*0.5)-G.padding)),left:parseInt(Math.max(V[2]-20,V[2]+((V[0]-m.width()-40)*0.5)-G.padding))},typeof arguments[0]=="number"?arguments[0]:200)};B.fancybox.init=function(){if(B("#fancybox-wrap").length){return}B("body").append(L=B('
    '),T=B('
    '),Q=B('
    '),M=B('
    '));d=B('
    ').append('
    ').appendTo(M);d.append(m=B('
    '),J=B(''),A=B('
    '),O=B(''),z=B(''));J.click(B.fancybox.close);T.click(B.fancybox.cancel);O.click(function(V){V.preventDefault();B.fancybox.prev()});z.click(function(V){V.preventDefault();B.fancybox.next()});if(B.fn.mousewheel){M.bind("mousewheel.fb",function(V,W){if(P){V.preventDefault()}else{if(B(V.target).get(0).clientHeight==0||B(V.target).get(0).scrollHeight===B(V.target).get(0).clientHeight){V.preventDefault();B.fancybox[W>0?"prev":"next"]()}}})}if(!B.support.opacity){M.addClass("fancybox-ie")}if(S){T.addClass("fancybox-ie6");M.addClass("fancybox-ie6");B('').prependTo(d)}};B.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};B(document).ready(function(){B.fancybox.init()})})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js b/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js deleted file mode 100644 index b7932415ce..0000000000 --- a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js +++ /dev/null @@ -1,78 +0,0 @@ -/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.0.4 - * - * Requires: 1.2.2+ - */ - -(function($) { - -var types = ['DOMMouseScroll', 'mousewheel']; - -$.event.special.mousewheel = { - setup: function() { - if ( this.addEventListener ) { - for ( var i=types.length; i; ) { - this.addEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i=types.length; i; ) { - this.removeEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - } -}; - -$.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); - }, - - unmousewheel: function(fn) { - return this.unbind("mousewheel", fn); - } -}); - - -function handler(event) { - var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; - event = $.event.fix(orgEvent); - event.type = "mousewheel"; - - // Old school scrollwheel delta - if ( event.wheelDelta ) { delta = event.wheelDelta/120; } - if ( event.detail ) { delta = -event.detail/3; } - - // New school multidimensional scroll (touchpads) deltas - deltaY = delta; - - // Gecko - if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaY = 0; - deltaX = -1*delta; - } - - // Webkit - if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } - if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - return $.event.handle.apply(this, args); -} - -})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js b/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js deleted file mode 100644 index cb66588e29..0000000000 --- a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js +++ /dev/null @@ -1,14 +0,0 @@ -/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) -* Licensed under the MIT License (LICENSE.txt). -* -* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. -* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. -* Thanks to: Seamus Leahy for adding deltaX and deltaY -* -* Version: 3.0.4 -* -* Requires: 1.2.2+ -*/ - -(function(d){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0,e=0;a=d.event.fix(b);a.type="mousewheel";if(a.wheelDelta)c=a.wheelDelta/120;if(a.detail)c=-a.detail/3;e=c;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){e=0;h=-1*c}if(b.wheelDeltaY!==undefined)e=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,c,h,e);return d.event.handle.apply(this,i)}var f=["DOMMouseScroll","mousewheel"];d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a= -f.length;a;)this.addEventListener(f[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],g,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/lightbox.js b/apps/files_imageviewer/js/lightbox.js deleted file mode 100644 index ff12d808bc..0000000000 --- a/apps/files_imageviewer/js/lightbox.js +++ /dev/null @@ -1,31 +0,0 @@ -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - FileActions.register('image','View', FileActions.PERMISSION_READ, '',function(filename){ - viewImage($('#dir').val(),filename); - }); - FileActions.setDefault('image','View'); - } - OC.search.customResults.Images=function(row,item){ - var image=item.link.substr(item.link.indexOf('?file=')+6); - var a=row.find('a'); - a.attr('href','#'); - a.click(function(){ - var pos=image.lastIndexOf('/') - var file=image.substr(pos + 1); - var dir=image.substr(0,pos); - viewImage(dir,file); - }); - } -}); - -function viewImage(dir, file) { - if(file.indexOf('.psd')>0){//can't view those - return; - } - var location=OC.filePath('files','ajax','download.php')+encodeURIComponent('?files='+encodeURIComponent(file)+'&dir='+encodeURIComponent(dir)); - $.fancybox({ - "href": location, - "title": file.replace(//, ">"), - "titlePosition": "inside" - }); -} diff --git a/apps/files_odfviewer/appinfo/app.php b/apps/files_odfviewer/appinfo/app.php deleted file mode 100644 index f5fe338c0e..0000000000 --- a/apps/files_odfviewer/appinfo/app.php +++ /dev/null @@ -1,5 +0,0 @@ - - - files_odfviewer - ODF Viewer - Simple ODF viewer for owncloud - 0.1 - AGPL - Thomas Müller - 4 - true - - diff --git a/apps/files_odfviewer/css/odfviewer.css b/apps/files_odfviewer/css/odfviewer.css deleted file mode 100644 index 097276a00f..0000000000 --- a/apps/files_odfviewer/css/odfviewer.css +++ /dev/null @@ -1,20 +0,0 @@ -#odf-canvas{ - position: relative; - top: 37px; - left: 1px; - border:1px solid darkgray; - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; - -webkit-box-shadow: 0px 4px 10px #000; -} - -#odf_close{ - margin-left: auto; - margin-right: 167px; - float: right; -} - -#odf-toolbar{ - padding: 0 0 0 1em -} - diff --git a/apps/files_odfviewer/css/webodf.css b/apps/files_odfviewer/css/webodf.css deleted file mode 100644 index 0ceca2f851..0000000000 --- a/apps/files_odfviewer/css/webodf.css +++ /dev/null @@ -1,196 +0,0 @@ -@namespace draw url(urn:oasis:names:tc:opendocument:xmlns:drawing:1.0); -@namespace fo url(urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0); -@namespace office url(urn:oasis:names:tc:opendocument:xmlns:office:1.0); -@namespace presentation url(urn:oasis:names:tc:opendocument:xmlns:presentation:1.0); -@namespace style url(urn:oasis:names:tc:opendocument:xmlns:style:1.0); -@namespace svg url(urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0); -@namespace table url(urn:oasis:names:tc:opendocument:xmlns:table:1.0); -@namespace text url(urn:oasis:names:tc:opendocument:xmlns:text:1.0); -@namespace runtimens url(urn:webodf); /* namespace for runtime only */ - -office|document > *, office|document-content > * { - display: none; -} -office|body, office|document { - display: inline-block; - position: relative; -} - -text|p, text|h { - display: block; - padding: 3px 3px 3px 3px; - margin: 5px 5px 5px 5px; -} -text|h { - font-weight: bold; -} -*[runtimens|containsparagraphanchor] { - position: relative; -} -text|s:before { /* this needs to be the number of spaces given by text:c */ - content: ' '; -} -text|tab:before { - display: inline; - content: ' '; -} -text|line-break { - content: " "; - display: block; -} -text|tracked-changes { - /*Consumers that do not support change tracking, should ignore changes.*/ - display: none; -} -office|binary-data { - display: none; -} -office|text { - display: block; - width: 216mm; /* default to A4 width */ - min-height: 279mm; - padding-left: 32mm; - padding-right: 32mm; - padding-top: 25mm; - padding-bottom: 13mm; - margin: 2px; - text-align: left; - overflow: hidden; -} -office|spreadsheet { - display: block; - border-collapse: collapse; - empty-cells: show; - font-family: sans-serif; - font-size: 10pt; - text-align: left; - page-break-inside: avoid; - overflow: hidden; -} -office|presentation { - display: inline-block; - text-align: left; -} -draw|page { - display: block; - height: 21cm; - width: 28cm; - margin: 3px; - position: relative; - overflow: hidden; -} -presentation|notes { - display: none; -} -@media print { - draw|page { - border: 1pt solid black; - page-break-inside: avoid; - } - presentation|notes { - /*TODO*/ - } -} -office|spreadsheet text|p { - border: 0px; - padding: 1px; - margin: 0px; -} -office|spreadsheet table|table { - margin: 3px; -} -office|spreadsheet table|table:after { - /* show sheet name the end of the sheet */ - /*content: attr(table|name);*/ /* gives parsing error in opera */ -} -office|spreadsheet table|table-row { - counter-increment: row; -} -office|spreadsheet table|table-row:before { - width: 3em; - background: #cccccc; - border: 1px solid black; - text-align: center; - content: counter(row); -} -office|spreadsheet table|table-cell { - border: 1px solid #cccccc; -} -table|table { - display: table; -} -draw|frame table|table { - width: 100%; - height: 100%; - background: white; -} -table|table-row { - display: table-row; -} -table|table-column { - display: table-column; -} -table|table-cell { - display: table-cell; -} -draw|frame { - display: block; -} -draw|image { - display: block; - width: 100%; - height: 100%; - top: 0px; - left: 0px; - background-repeat: no-repeat; - background-size: 100% 100%; - -moz-background-size: 100% 100%; -} -/* only show the first image in frame */ -draw|frame > draw|image:nth-of-type(n+2) { - display: none; -} -text|list { - display: block; - padding-left: 1.5em; - counter-reset: list; -} -text|list-item { - display: block; -} -text|list-item:before { - display: inline-block; - content: '•'; - counter-increment: list; - width: 0.5em; - margin-left: -0.5em; - padding: 0px; - border: 0px; -} -text|list-item > *:first-child { - display: inline-block; -} -text|a { - color: blue; - text-decoration: underline; -} -text|note-citation { - vertical-align: super; - font-size: smaller; -} -text|note-body { - display: none; -} -text|note:hover text|note-citation { - background: #dddddd; -} -text|note:hover text|note-body { - display: block; - left:1em; - max-width: 80%; - position: absolute; - background: #ffffaa; -} -svg|title, svg|desc { - display: none; -} diff --git a/apps/files_odfviewer/js/viewer.js b/apps/files_odfviewer/js/viewer.js deleted file mode 100644 index 9455a9a0a0..0000000000 --- a/apps/files_odfviewer/js/viewer.js +++ /dev/null @@ -1,60 +0,0 @@ -function viewOdf(dir, file) { - var location=OC.filePath('files','ajax','download.php')+'?files='+file+'&dir='+dir; - - // fade out files menu and add odf menu - $('.actions,#file_action_panel').fadeOut('slow').promise().done(function() { - // odf action toolbar - var odfToolbarHtml = - '
    ' + - ''+t('files_odfviewer','Close')+ - '
    '; - $('#controls').append(odfToolbarHtml); - - }); - - // fade out file list and show pdf canvas - $('table').fadeOut('slow').promise().done(function(){; - var canvashtml = '
    '; - $('table').after(canvashtml); - - var odfelement = document.getElementById("odf-canvas"); - var odfcanvas = new odf.OdfCanvas(odfelement); - odfcanvas.load(location); - }); -} - -function closeOdfViewer(){ - // Fade out odf-toolbar - $('#odf-toolbar').fadeOut('slow'); - // Fade out editor - $('#odf-canvas').fadeOut('slow', function(){ - $('#odf-toolbar').remove(); - $('#odf-canvas').remove(); - $('.actions,#file_access_panel').fadeIn('slow'); - $('table').fadeIn('slow'); - }); - is_editor_shown = false; -} - -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - - var supportedMimes = new Array( - 'application/vnd.oasis.opendocument.text', - 'application/vnd.oasis.opendocument.spreadsheet', - 'application/vnd.oasis.opendocument.graphics', - 'application/vnd.oasis.opendocument.presentation'); - for (var i = 0; i < supportedMimes.length; ++i){ - var mime = supportedMimes[i]; - FileActions.register(mime,'View','',function(filename){ - viewOdf($('#dir').val(),filename); - }); - FileActions.setDefault(mime,'View'); - } - } - - $('#odf_close').live('click',function() { - closeOdfViewer(); - }); -}); - diff --git a/apps/files_odfviewer/js/webodf-debug.js b/apps/files_odfviewer/js/webodf-debug.js deleted file mode 100644 index 6c7c7e1d6f..0000000000 --- a/apps/files_odfviewer/js/webodf-debug.js +++ /dev/null @@ -1,7124 +0,0 @@ -/* - - @licstart - The JavaScript code in this page is free software: you can redistribute it - and/or modify it under the terms of the GNU Affero General Public License - (GNU AGPL) as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. The code is distributed - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - - As additional permission under GNU AGPL version 3 section 7, you - may distribute non-source (e.g., minimized or compacted) forms of - that code without the copy of the GNU GPL normally required by - section 4, provided you include this license notice and a URL - through which recipients can access the Corresponding Source. - - As a special exception to the AGPL, any HTML file which merely makes function - calls to this code, and for that purpose includes it by reference shall be - deemed a separate work for copyright law purposes. In addition, the copyright - holders of this code give you permission to combine this code with free - software libraries that are released under the GNU LGPL. You may copy and - distribute such a system following the terms of the GNU AGPL for this code - and the LGPL for the libraries. If you modify this code, you may extend this - exception to your version of the code, but you are not obligated to do so. - If you do not wish to do so, delete this exception statement from your - version. - - This license applies to this entire compilation. - @licend - @source: http://www.webodf.org/ - @source: http://gitorious.org/odfkit/webodf/ -*/ -var core = {}; -var gui = {}; -var xmldom = {}; -var odf = {}; -function Runtime() { -} -Runtime.ByteArray = function(size) { -}; -Runtime.ByteArray.prototype.slice = function(start, end) { -}; -Runtime.prototype.byteArrayFromArray = function(array) { -}; -Runtime.prototype.byteArrayFromString = function(string, encoding) { -}; -Runtime.prototype.byteArrayToString = function(bytearray, encoding) { -}; -Runtime.prototype.concatByteArrays = function(bytearray1, bytearray2) { -}; -Runtime.prototype.read = function(path, offset, length, callback) { -}; -Runtime.prototype.readFile = function(path, encoding, callback) { -}; -Runtime.prototype.readFileSync = function(path, encoding) { -}; -Runtime.prototype.loadXML = function(path, callback) { -}; -Runtime.prototype.writeFile = function(path, data, callback) { -}; -Runtime.prototype.isFile = function(path, callback) { -}; -Runtime.prototype.getFileSize = function(path, callback) { -}; -Runtime.prototype.deleteFile = function(path, callback) { -}; -Runtime.prototype.log = function(msgOrCategory, msg) { -}; -Runtime.prototype.setTimeout = function(callback, milliseconds) { -}; -Runtime.prototype.libraryPaths = function() { -}; -Runtime.prototype.type = function() { -}; -Runtime.prototype.getDOMImplementation = function() { -}; -Runtime.prototype.getWindow = function() { -}; -var IS_COMPILED_CODE = false; -Runtime.byteArrayToString = function(bytearray, encoding) { - function byteArrayToString(bytearray) { - var s = "", i, l = bytearray.length; - for(i = 0;i < l;i += 1) { - s += String.fromCharCode(bytearray[i] & 255) - } - return s - } - function utf8ByteArrayToString(bytearray) { - var s = "", i, l = bytearray.length, c0, c1, c2; - for(i = 0;i < l;i += 1) { - c0 = bytearray[i]; - if(c0 < 128) { - s += String.fromCharCode(c0) - }else { - i += 1; - c1 = bytearray[i]; - if(c0 < 224) { - s += String.fromCharCode((c0 & 31) << 6 | c1 & 63) - }else { - i += 1; - c2 = bytearray[i]; - s += String.fromCharCode((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) - } - } - } - return s - } - var result; - if(encoding === "utf8") { - result = utf8ByteArrayToString(bytearray) - }else { - if(encoding !== "binary") { - this.log("Unsupported encoding: " + encoding) - } - result = byteArrayToString(bytearray) - } - return result -}; -Runtime.getFunctionName = function getFunctionName(f) { - var m; - if(f.name === undefined) { - m = (new RegExp("function\\s+(\\w+)")).exec(f); - return m && m[1] - } - return f.name -}; -function BrowserRuntime(logoutput) { - var self = this, cache = {}, useNativeArray = window.ArrayBuffer && window.Uint8Array; - this.ByteArray = useNativeArray ? function ByteArray(size) { - Uint8Array.prototype.slice = function(begin, end) { - if(end === undefined) { - if(begin === undefined) { - begin = 0 - } - end = this.length - } - var view = this.subarray(begin, end), array, i; - end -= begin; - array = new Uint8Array(new ArrayBuffer(end)); - for(i = 0;i < end;i += 1) { - array[i] = view[i] - } - return array - }; - return new Uint8Array(new ArrayBuffer(size)) - } : function ByteArray(size) { - var a = []; - a.length = size; - return a - }; - this.concatByteArrays = useNativeArray ? function(bytearray1, bytearray2) { - var i, l1 = bytearray1.length, l2 = bytearray2.length, a = new this.ByteArray(l1 + l2); - for(i = 0;i < l1;i += 1) { - a[i] = bytearray1[i] - } - for(i = 0;i < l2;i += 1) { - a[i + l1] = bytearray2[i] - } - return a - } : function(bytearray1, bytearray2) { - return bytearray1.concat(bytearray2) - }; - function utf8ByteArrayFromString(string) { - var l = string.length, bytearray, i, n, j = 0; - for(i = 0;i < l;i += 1) { - n = string.charCodeAt(i); - j += 1 + (n > 128) + (n > 2048) - } - bytearray = new self.ByteArray(j); - j = 0; - for(i = 0;i < l;i += 1) { - n = string.charCodeAt(i); - if(n < 128) { - bytearray[j] = n; - j += 1 - }else { - if(n < 2048) { - bytearray[j] = 192 | n >>> 6; - bytearray[j + 1] = 128 | n & 63; - j += 2 - }else { - bytearray[j] = 224 | n >>> 12 & 15; - bytearray[j + 1] = 128 | n >>> 6 & 63; - bytearray[j + 2] = 128 | n & 63; - j += 3 - } - } - } - return bytearray - } - function byteArrayFromString(string) { - var l = string.length, a = new self.ByteArray(l), i; - for(i = 0;i < l;i += 1) { - a[i] = string.charCodeAt(i) & 255 - } - return a - } - this.byteArrayFromArray = function(array) { - return array.slice() - }; - this.byteArrayFromString = function(string, encoding) { - var result; - if(encoding === "utf8") { - result = utf8ByteArrayFromString(string) - }else { - if(encoding !== "binary") { - self.log("unknown encoding: " + encoding) - } - result = byteArrayFromString(string) - } - return result - }; - this.byteArrayToString = Runtime.byteArrayToString; - function log(msgOrCategory, msg) { - var node, doc, category; - if(msg) { - category = msgOrCategory - }else { - msg = msgOrCategory - } - if(logoutput) { - doc = logoutput.ownerDocument; - if(category) { - node = doc.createElement("span"); - node.className = category; - node.appendChild(doc.createTextNode(category)); - logoutput.appendChild(node); - logoutput.appendChild(doc.createTextNode(" ")) - } - node = doc.createElement("span"); - node.appendChild(doc.createTextNode(msg)); - logoutput.appendChild(node); - logoutput.appendChild(doc.createElement("br")) - }else { - if(console) { - console.log(msg) - } - } - } - function readFile(path, encoding, callback) { - if(cache.hasOwnProperty(path)) { - callback(null, cache[path]); - return - } - var xhr = new XMLHttpRequest; - function handleResult() { - var data; - if(xhr.readyState === 4) { - if(xhr.status === 0 && !xhr.responseText) { - callback("File " + path + " is empty.") - }else { - if(xhr.status === 200 || xhr.status === 0) { - if(encoding === "binary") { - if(typeof VBArray !== "undefined") { - data = (new VBArray(xhr.responseBody)).toArray() - }else { - data = self.byteArrayFromString(xhr.responseText, "binary") - } - }else { - data = xhr.responseText - } - cache[path] = data; - callback(null, data) - }else { - callback(xhr.responseText || xhr.statusText) - } - } - } - } - xhr.open("GET", path, true); - xhr.onreadystatechange = handleResult; - if(xhr.overrideMimeType) { - if(encoding !== "binary") { - xhr.overrideMimeType("text/plain; charset=" + encoding) - }else { - xhr.overrideMimeType("text/plain; charset=x-user-defined") - } - } - try { - xhr.send(null) - }catch(e) { - callback(e.message) - } - } - function read(path, offset, length, callback) { - if(cache.hasOwnProperty(path)) { - callback(null, cache[path].slice(offset, offset + length)); - return - } - var xhr = new XMLHttpRequest; - function handleResult() { - var data; - if(xhr.readyState === 4) { - if(xhr.status === 0 && !xhr.responseText) { - callback("File " + path + " is empty.") - }else { - if(xhr.status === 200 || xhr.status === 0) { - if(typeof VBArray !== "undefined") { - data = (new VBArray(xhr.responseBody)).toArray() - }else { - data = self.byteArrayFromString(xhr.responseText, "binary") - } - cache[path] = data; - callback(null, data.slice(offset, offset + length)) - }else { - callback(xhr.responseText || xhr.statusText) - } - } - } - } - xhr.open("GET", path, true); - xhr.onreadystatechange = handleResult; - if(xhr.overrideMimeType) { - xhr.overrideMimeType("text/plain; charset=x-user-defined") - } - try { - xhr.send(null) - }catch(e) { - callback(e.message) - } - } - function readFileSync(path, encoding) { - var xhr = new XMLHttpRequest, result; - xhr.open("GET", path, false); - if(xhr.overrideMimeType) { - if(encoding !== "binary") { - xhr.overrideMimeType("text/plain; charset=" + encoding) - }else { - xhr.overrideMimeType("text/plain; charset=x-user-defined") - } - } - try { - xhr.send(null); - if(xhr.status === 200 || xhr.status === 0) { - result = xhr.responseText - } - }catch(e) { - } - return result - } - function writeFile(path, data, callback) { - cache[path] = data; - var xhr = new XMLHttpRequest; - function handleResult() { - if(xhr.readyState === 4) { - if(xhr.status === 0 && !xhr.responseText) { - callback("File " + path + " is empty.") - }else { - if(xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) { - callback(null) - }else { - callback("Status " + String(xhr.status) + ": " + xhr.responseText || xhr.statusText) - } - } - } - } - xhr.open("PUT", path, true); - xhr.onreadystatechange = handleResult; - if(data.buffer && !xhr.sendAsBinary) { - data = data.buffer - }else { - data = self.byteArrayToString(data, "binary") - } - try { - if(xhr.sendAsBinary) { - xhr.sendAsBinary(data) - }else { - xhr.send(data) - } - }catch(e) { - self.log("HUH? " + e + " " + data); - callback(e.message) - } - } - function deleteFile(path, callback) { - var xhr = new XMLHttpRequest; - xhr.open("DELETE", path, true); - xhr.onreadystatechange = function() { - if(xhr.readyState === 4) { - if(xhr.status < 200 && xhr.status >= 300) { - callback(xhr.responseText) - }else { - callback(null) - } - } - }; - xhr.send(null) - } - function loadXML(path, callback) { - var xhr = new XMLHttpRequest; - function handleResult() { - if(xhr.readyState === 4) { - if(xhr.status === 0 && !xhr.responseText) { - callback("File " + path + " is empty.") - }else { - if(xhr.status === 200 || xhr.status === 0) { - callback(null, xhr.responseXML) - }else { - callback(xhr.responseText) - } - } - } - } - xhr.open("GET", path, true); - if(xhr.overrideMimeType) { - xhr.overrideMimeType("text/xml") - } - xhr.onreadystatechange = handleResult; - try { - xhr.send(null) - }catch(e) { - callback(e.message) - } - } - function isFile(path, callback) { - self.getFileSize(path, function(size) { - callback(size !== -1) - }) - } - function getFileSize(path, callback) { - var xhr = new XMLHttpRequest; - xhr.open("HEAD", path, true); - xhr.onreadystatechange = function() { - if(xhr.readyState !== 4) { - return - } - var cl = xhr.getResponseHeader("Content-Length"); - if(cl) { - callback(parseInt(cl, 10)) - }else { - callback(-1) - } - }; - xhr.send(null) - } - function wrap(nativeFunction, nargs) { - if(!nativeFunction) { - return null - } - return function() { - cache = {}; - var callback = arguments[nargs], args = Array.prototype.slice.call(arguments, 0, nargs), callbackname = "callback" + String(Math.random()).substring(2); - window[callbackname] = function() { - delete window[callbackname]; - callback.apply(this, arguments) - }; - args.push(callbackname); - nativeFunction.apply(this, args) - } - } - this.readFile = readFile; - this.read = read; - this.readFileSync = readFileSync; - this.writeFile = writeFile; - this.deleteFile = deleteFile; - this.loadXML = loadXML; - this.isFile = isFile; - this.getFileSize = getFileSize; - this.log = log; - this.setTimeout = function(f, msec) { - setTimeout(function() { - f() - }, msec) - }; - this.libraryPaths = function() { - return["lib"] - }; - this.setCurrentDirectory = function(dir) { - }; - this.type = function() { - return"BrowserRuntime" - }; - this.getDOMImplementation = function() { - return window.document.implementation - }; - this.exit = function(exitCode) { - log("Calling exit with code " + String(exitCode) + ", but exit() is not implemented.") - }; - this.getWindow = function() { - return window - } -} -function NodeJSRuntime() { - var self = this, fs = require("fs"), currentDirectory = ""; - this.ByteArray = function(size) { - return new Buffer(size) - }; - this.byteArrayFromArray = function(array) { - var ba = new Buffer(array.length), i, l = array.length; - for(i = 0;i < l;i += 1) { - ba[i] = array[i] - } - return ba - }; - this.concatByteArrays = function(a, b) { - var ba = new Buffer(a.length + b.length); - a.copy(ba, 0, 0); - b.copy(ba, a.length, 0); - return ba - }; - this.byteArrayFromString = function(string, encoding) { - return new Buffer(string, encoding) - }; - this.byteArrayToString = function(bytearray, encoding) { - return bytearray.toString(encoding) - }; - function isFile(path, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - fs.stat(path, function(err, stats) { - callback(!err && stats.isFile()) - }) - } - function loadXML(path, callback) { - throw"Not implemented."; - } - this.readFile = function(path, encoding, callback) { - if(encoding !== "binary") { - fs.readFile(path, encoding, callback) - }else { - fs.readFile(path, null, callback) - } - }; - this.writeFile = function(path, data, callback) { - fs.writeFile(path, data, "binary", function(err) { - callback(err || null) - }) - }; - this.deleteFile = fs.unlink; - this.read = function(path, offset, length, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - fs.open(path, "r+", 666, function(err, fd) { - if(err) { - callback(err); - return - } - var buffer = new Buffer(length); - fs.read(fd, buffer, 0, length, offset, function(err, bytesRead) { - fs.close(fd); - callback(err, buffer) - }) - }) - }; - this.readFileSync = function(path, encoding) { - if(!encoding) { - return"" - } - return fs.readFileSync(path, encoding) - }; - this.loadXML = loadXML; - this.isFile = isFile; - this.getFileSize = function(path, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - fs.stat(path, function(err, stats) { - if(err) { - callback(-1) - }else { - callback(stats.size) - } - }) - }; - this.log = function(msg) { - process.stderr.write(msg + "\n") - }; - this.setTimeout = function(f, msec) { - setTimeout(function() { - f() - }, msec) - }; - this.libraryPaths = function() { - return[__dirname] - }; - this.setCurrentDirectory = function(dir) { - currentDirectory = dir - }; - this.currentDirectory = function() { - return currentDirectory - }; - this.type = function() { - return"NodeJSRuntime" - }; - this.getDOMImplementation = function() { - return null - }; - this.exit = process.exit; - this.getWindow = function() { - return null - } -} -function RhinoRuntime() { - var self = this, dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), builder, entityresolver, currentDirectory = ""; - dom.setValidating(false); - dom.setNamespaceAware(true); - dom.setExpandEntityReferences(false); - dom.setSchema(null); - entityresolver = Packages.org.xml.sax.EntityResolver({resolveEntity:function(publicId, systemId) { - var file, open = function(path) { - var reader = new Packages.java.io.FileReader(path), source = new Packages.org.xml.sax.InputSource(reader); - return source - }; - file = systemId; - return open(file) - }}); - builder = dom.newDocumentBuilder(); - builder.setEntityResolver(entityresolver); - this.ByteArray = function ByteArray(size) { - return[size] - }; - this.byteArrayFromArray = function(array) { - return array - }; - this.byteArrayFromString = function(string, encoding) { - var a = [], i, l = string.length; - for(i = 0;i < l;i += 1) { - a[i] = string.charCodeAt(i) & 255 - } - return a - }; - this.byteArrayToString = Runtime.byteArrayToString; - this.concatByteArrays = function(bytearray1, bytearray2) { - return bytearray1.concat(bytearray2) - }; - function loadXML(path, callback) { - var file = new Packages.java.io.File(path), document; - try { - document = builder.parse(file) - }catch(err) { - print(err); - callback(err); - return - } - callback(null, document) - } - function runtimeReadFile(path, encoding, callback) { - var file = new Packages.java.io.File(path), data, rhinoencoding = encoding === "binary" ? "latin1" : encoding; - if(!file.isFile()) { - callback(path + " is not a file.") - }else { - data = readFile(path, rhinoencoding); - if(encoding === "binary") { - data = self.byteArrayFromString(data, "binary") - } - callback(null, data) - } - } - function runtimeReadFileSync(path, encoding) { - var file = new Packages.java.io.File(path), data, i; - if(!file.isFile()) { - return null - } - if(encoding === "binary") { - encoding = "latin1" - } - return readFile(path, encoding) - } - function isFile(path, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - var file = new Packages.java.io.File(path); - callback(file.isFile()) - } - this.loadXML = loadXML; - this.readFile = runtimeReadFile; - this.writeFile = function(path, data, callback) { - var out = new Packages.java.io.FileOutputStream(path), i, l = data.length; - for(i = 0;i < l;i += 1) { - out.write(data[i]) - } - out.close(); - callback(null) - }; - this.deleteFile = function(path, callback) { - var file = new Packages.java.io.File(path); - if(file["delete"]()) { - callback(null) - }else { - callback("Could not delete " + path) - } - }; - this.read = function(path, offset, length, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - var data = runtimeReadFileSync(path, "binary"); - if(data) { - callback(null, this.byteArrayFromString(data.substring(offset, offset + length), "binary")) - }else { - callback("Cannot read " + path) - } - }; - this.readFileSync = function(path, encoding) { - if(!encoding) { - return"" - } - return readFile(path, encoding) - }; - this.isFile = isFile; - this.getFileSize = function(path, callback) { - if(currentDirectory) { - path = currentDirectory + "/" + path - } - var file = new Packages.java.io.File(path); - callback(file.length()) - }; - this.log = print; - this.setTimeout = function(f, msec) { - f() - }; - this.libraryPaths = function() { - return["lib"] - }; - this.setCurrentDirectory = function(dir) { - currentDirectory = dir - }; - this.currentDirectory = function() { - return currentDirectory - }; - this.type = function() { - return"RhinoRuntime" - }; - this.getDOMImplementation = function() { - return builder.getDOMImplementation() - }; - this.exit = quit; - this.getWindow = function() { - return null - } -} -var runtime = function() { - var result; - if(typeof window !== "undefined") { - result = new BrowserRuntime(window.document.getElementById("logoutput")) - }else { - if(typeof require !== "undefined") { - result = new NodeJSRuntime - }else { - result = new RhinoRuntime - } - } - return result -}(); -(function() { - var cache = {}, dircontents = {}; - function getOrDefinePackage(packageNameComponents) { - var topname = packageNameComponents[0], i, pkg; - pkg = eval("if (typeof " + topname + " === 'undefined') {" + "eval('" + topname + " = {};');}" + topname); - for(i = 1;i < packageNameComponents.length - 1;i += 1) { - if(!pkg.hasOwnProperty(packageNameComponents[i])) { - pkg = pkg[packageNameComponents[i]] = {} - } - } - return pkg[packageNameComponents[packageNameComponents.length - 1]] - } - runtime.loadClass = function(classpath) { - if(IS_COMPILED_CODE) { - return - } - if(cache.hasOwnProperty(classpath)) { - return - } - var names = classpath.split("."), impl; - impl = getOrDefinePackage(names); - if(impl) { - cache[classpath] = true; - return - } - function getPathFromManifests(classpath) { - var path = classpath.replace(".", "/") + ".js", dirs = runtime.libraryPaths(), i, dir, code; - if(runtime.currentDirectory) { - dirs.push(runtime.currentDirectory()) - } - for(i = 0;i < dirs.length;i += 1) { - dir = dirs[i]; - if(!dircontents.hasOwnProperty(dir)) { - code = runtime.readFileSync(dirs[i] + "/manifest.js", "utf8"); - if(code && code.length) { - try { - dircontents[dir] = eval(code) - }catch(e1) { - dircontents[dir] = null; - runtime.log("Cannot load manifest for " + dir + ".") - } - }else { - dircontents[dir] = null - } - } - code = null; - dir = dircontents[dir]; - if(dir && dir.indexOf && dir.indexOf(path) !== -1) { - return dirs[i] + "/" + path - } - } - return null - } - function load(classpath) { - var code, path; - path = getPathFromManifests(classpath); - if(!path) { - throw classpath + " is not listed in any manifest.js."; - } - try { - code = runtime.readFileSync(path, "utf8") - }catch(e2) { - runtime.log("Error loading " + classpath + " " + e2); - throw e2; - } - if(code === undefined) { - throw"Cannot load class " + classpath; - } - try { - code = eval(classpath + " = eval(code);") - }catch(e4) { - runtime.log("Error loading " + classpath + " " + e4); - throw e4; - } - return code - } - impl = load(classpath); - if(!impl || Runtime.getFunctionName(impl) !== names[names.length - 1]) { - runtime.log("Loaded code is not for " + names[names.length - 1]); - throw"Loaded code is not for " + names[names.length - 1]; - } - cache[classpath] = true - } -})(); -(function(args) { - args = Array.prototype.slice.call(args); - function run(argv) { - if(!argv.length) { - return - } - var script = argv[0]; - runtime.readFile(script, "utf8", function(err, code) { - var path = "", paths = runtime.libraryPaths(); - if(script.indexOf("/") !== -1) { - path = script.substring(0, script.indexOf("/")) - } - runtime.setCurrentDirectory(path); - function run() { - var script, path, paths, args, argv, result; - result = eval(code); - if(result) { - runtime.exit(result) - } - return - } - if(err) { - runtime.log(err); - runtime.exit(1) - }else { - run.apply(null, argv) - } - }) - } - if(runtime.type() === "NodeJSRuntime") { - run(process.argv.slice(2)) - }else { - if(runtime.type() === "RhinoRuntime") { - run(args) - }else { - run(args.slice(1)) - } - } -})(typeof arguments !== "undefined" && arguments); -core.Base64 = function() { - var b64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", b64charcodes = function() { - var a = [], i, codeA = "A".charCodeAt(0), codea = "a".charCodeAt(0), code0 = "0".charCodeAt(0); - for(i = 0;i < 26;i += 1) { - a.push(codeA + i) - } - for(i = 0;i < 26;i += 1) { - a.push(codea + i) - } - for(i = 0;i < 10;i += 1) { - a.push(code0 + i) - } - a.push("+".charCodeAt(0)); - a.push("/".charCodeAt(0)); - return a - }(), b64tab = function(bin) { - var t = {}, i, l; - for(i = 0, l = bin.length;i < l;i += 1) { - t[bin.charAt(i)] = i - } - return t - }(b64chars), convertUTF16StringToBase64, convertBase64ToUTF16String, btoa, atob; - function stringToArray(s) { - var a = [], i, l = s.length; - for(i = 0;i < l;i += 1) { - a[i] = s.charCodeAt(i) & 255 - } - return a - } - function convertUTF8ArrayToBase64(bin) { - var n, b64 = "", i, l = bin.length - 2; - for(i = 0;i < l;i += 3) { - n = bin[i] << 16 | bin[i + 1] << 8 | bin[i + 2]; - b64 += b64chars[n >>> 18]; - b64 += b64chars[n >>> 12 & 63]; - b64 += b64chars[n >>> 6 & 63]; - b64 += b64chars[n & 63] - } - if(i === l + 1) { - n = bin[i] << 4; - b64 += b64chars[n >>> 6]; - b64 += b64chars[n & 63]; - b64 += "==" - }else { - if(i === l) { - n = bin[i] << 10 | bin[i + 1] << 2; - b64 += b64chars[n >>> 12]; - b64 += b64chars[n >>> 6 & 63]; - b64 += b64chars[n & 63]; - b64 += "=" - } - } - return b64 - } - function convertBase64ToUTF8Array(b64) { - b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ""); - var bin = [], padlen = b64.length % 4, i, l = b64.length, n; - for(i = 0;i < l;i += 4) { - n = (b64tab[b64.charAt(i)] || 0) << 18 | (b64tab[b64.charAt(i + 1)] || 0) << 12 | (b64tab[b64.charAt(i + 2)] || 0) << 6 | (b64tab[b64.charAt(i + 3)] || 0); - bin.push(n >> 16, n >> 8 & 255, n & 255) - } - bin.length -= [0, 0, 2, 1][padlen]; - return bin - } - function convertUTF16ArrayToUTF8Array(uni) { - var bin = [], i, l = uni.length, n; - for(i = 0;i < l;i += 1) { - n = uni[i]; - if(n < 128) { - bin.push(n) - }else { - if(n < 2048) { - bin.push(192 | n >>> 6, 128 | n & 63) - }else { - bin.push(224 | n >>> 12 & 15, 128 | n >>> 6 & 63, 128 | n & 63) - } - } - } - return bin - } - function convertUTF8ArrayToUTF16Array(bin) { - var uni = [], i, l = bin.length, c0, c1, c2; - for(i = 0;i < l;i += 1) { - c0 = bin[i]; - if(c0 < 128) { - uni.push(c0) - }else { - i += 1; - c1 = bin[i]; - if(c0 < 224) { - uni.push((c0 & 31) << 6 | c1 & 63) - }else { - i += 1; - c2 = bin[i]; - uni.push((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) - } - } - } - return uni - } - function convertUTF8StringToBase64(bin) { - return convertUTF8ArrayToBase64(stringToArray(bin)) - } - function convertBase64ToUTF8String(b64) { - return String.fromCharCode.apply(String, convertBase64ToUTF8Array(b64)) - } - function convertUTF8StringToUTF16Array(bin) { - return convertUTF8ArrayToUTF16Array(stringToArray(bin)) - } - function convertUTF8ArrayToUTF16String(bin) { - var b = convertUTF8ArrayToUTF16Array(bin), r = "", i = 0, chunksize = 45E3; - while(i < b.length) { - r += String.fromCharCode.apply(String, b.slice(i, i + chunksize)); - i += chunksize - } - return r - } - function convertUTF8StringToUTF16String_internal(bin, i, end) { - var str = "", c0, c1, c2, j; - for(j = i;j < end;j += 1) { - c0 = bin.charCodeAt(j) & 255; - if(c0 < 128) { - str += String.fromCharCode(c0) - }else { - j += 1; - c1 = bin.charCodeAt(j) & 255; - if(c0 < 224) { - str += String.fromCharCode((c0 & 31) << 6 | c1 & 63) - }else { - j += 1; - c2 = bin.charCodeAt(j) & 255; - str += String.fromCharCode((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) - } - } - } - return str - } - function convertUTF8StringToUTF16String(bin, callback) { - var partsize = 1E5, numparts = bin.length / partsize, str = "", pos = 0; - if(bin.length < partsize) { - callback(convertUTF8StringToUTF16String_internal(bin, 0, bin.length), true); - return - } - if(typeof bin !== "string") { - bin = bin.slice() - } - function f() { - var end = pos + partsize; - if(end > bin.length) { - end = bin.length - } - str += convertUTF8StringToUTF16String_internal(bin, pos, end); - pos = end; - end = pos === bin.length; - if(callback(str, end) && !end) { - runtime.setTimeout(f, 0) - } - } - f() - } - function convertUTF16StringToUTF8Array(uni) { - return convertUTF16ArrayToUTF8Array(stringToArray(uni)) - } - function convertUTF16ArrayToUTF8String(uni) { - return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(uni)) - } - function convertUTF16StringToUTF8String(uni) { - return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(stringToArray(uni))) - } - btoa = runtime.getWindow() && runtime.getWindow().btoa; - if(btoa) { - convertUTF16StringToBase64 = function(uni) { - return btoa(convertUTF16StringToUTF8String(uni)) - } - }else { - btoa = convertUTF8StringToBase64; - convertUTF16StringToBase64 = function(uni) { - return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)) - } - } - atob = runtime.getWindow() && runtime.getWindow().atob; - if(atob) { - convertBase64ToUTF16String = function(b64) { - var b = atob(b64); - return convertUTF8StringToUTF16String_internal(b, 0, b.length) - } - }else { - atob = convertBase64ToUTF8String; - convertBase64ToUTF16String = function(b64) { - return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)) - } - } - function Base64() { - this.convertUTF8ArrayToBase64 = convertUTF8ArrayToBase64; - this.convertByteArrayToBase64 = convertUTF8ArrayToBase64; - this.convertBase64ToUTF8Array = convertBase64ToUTF8Array; - this.convertBase64ToByteArray = convertBase64ToUTF8Array; - this.convertUTF16ArrayToUTF8Array = convertUTF16ArrayToUTF8Array; - this.convertUTF16ArrayToByteArray = convertUTF16ArrayToUTF8Array; - this.convertUTF8ArrayToUTF16Array = convertUTF8ArrayToUTF16Array; - this.convertByteArrayToUTF16Array = convertUTF8ArrayToUTF16Array; - this.convertUTF8StringToBase64 = convertUTF8StringToBase64; - this.convertBase64ToUTF8String = convertBase64ToUTF8String; - this.convertUTF8StringToUTF16Array = convertUTF8StringToUTF16Array; - this.convertUTF8ArrayToUTF16String = convertUTF8ArrayToUTF16String; - this.convertByteArrayToUTF16String = convertUTF8ArrayToUTF16String; - this.convertUTF8StringToUTF16String = convertUTF8StringToUTF16String; - this.convertUTF16StringToUTF8Array = convertUTF16StringToUTF8Array; - this.convertUTF16StringToByteArray = convertUTF16StringToUTF8Array; - this.convertUTF16ArrayToUTF8String = convertUTF16ArrayToUTF8String; - this.convertUTF16StringToUTF8String = convertUTF16StringToUTF8String; - this.convertUTF16StringToBase64 = convertUTF16StringToBase64; - this.convertBase64ToUTF16String = convertBase64ToUTF16String; - this.fromBase64 = convertBase64ToUTF8String; - this.toBase64 = convertUTF8StringToBase64; - this.atob = atob; - this.btoa = btoa; - this.utob = convertUTF16StringToUTF8String; - this.btou = convertUTF8StringToUTF16String; - this.encode = convertUTF16StringToBase64; - this.encodeURI = function(u) { - return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0) { - return m0 === "+" ? "-" : "_" - }).replace(/\\=+$/, "") - }; - this.decode = function(a) { - return convertBase64ToUTF16String(a.replace(/[\-_]/g, function(m0) { - return m0 === "-" ? "+" : "/" - })) - } - } - return Base64 -}(); -core.RawDeflate = function() { - var zip_WSIZE = 32768, zip_STORED_BLOCK = 0, zip_STATIC_TREES = 1, zip_DYN_TREES = 2, zip_DEFAULT_LEVEL = 6, zip_FULL_SEARCH = true, zip_INBUFSIZ = 32768, zip_INBUF_EXTRA = 64, zip_OUTBUFSIZ = 1024 * 8, zip_window_size = 2 * zip_WSIZE, zip_MIN_MATCH = 3, zip_MAX_MATCH = 258, zip_BITS = 16, zip_LIT_BUFSIZE = 8192, zip_HASH_BITS = 13, zip_DIST_BUFSIZE = zip_LIT_BUFSIZE, zip_HASH_SIZE = 1 << zip_HASH_BITS, zip_HASH_MASK = zip_HASH_SIZE - 1, zip_WMASK = zip_WSIZE - 1, zip_NIL = 0, zip_TOO_FAR = 4096, - zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1, zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD, zip_SMALLEST = 1, zip_MAX_BITS = 15, zip_MAX_BL_BITS = 7, zip_LENGTH_CODES = 29, zip_LITERALS = 256, zip_END_BLOCK = 256, zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES, zip_D_CODES = 30, zip_BL_CODES = 19, zip_REP_3_6 = 16, zip_REPZ_3_10 = 17, zip_REPZ_11_138 = 18, zip_HEAP_SIZE = 2 * zip_L_CODES + 1, zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / zip_MIN_MATCH, 10), zip_free_queue, - zip_qhead, zip_qtail, zip_initflag, zip_outbuf = null, zip_outcnt, zip_outoff, zip_complete, zip_window, zip_d_buf, zip_l_buf, zip_prev, zip_bi_buf, zip_bi_valid, zip_block_start, zip_ins_h, zip_hash_head, zip_prev_match, zip_match_available, zip_match_length, zip_prev_length, zip_strstart, zip_match_start, zip_eofile, zip_lookahead, zip_max_chain_length, zip_max_lazy_match, zip_compr_level, zip_good_match, zip_nice_match, zip_dyn_ltree, zip_dyn_dtree, zip_static_ltree, zip_static_dtree, zip_bl_tree, - zip_l_desc, zip_d_desc, zip_bl_desc, zip_bl_count, zip_heap, zip_heap_len, zip_heap_max, zip_depth, zip_length_code, zip_dist_code, zip_base_length, zip_base_dist, zip_flag_buf, zip_last_lit, zip_last_dist, zip_last_flags, zip_flags, zip_flag_bit, zip_opt_len, zip_static_len, zip_deflate_data, zip_deflate_pos, zip_extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], zip_extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, - 9, 10, 10, 11, 11, 12, 12, 13, 13], zip_extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], zip_configuration_table; - if(zip_LIT_BUFSIZE > zip_INBUFSIZ) { - runtime.log("error: zip_INBUFSIZ is too small") - } - if(zip_WSIZE << 1 > 1 << zip_BITS) { - runtime.log("error: zip_WSIZE is too large") - } - if(zip_HASH_BITS > zip_BITS - 1) { - runtime.log("error: zip_HASH_BITS is too large") - } - if(zip_HASH_BITS < 8 || zip_MAX_MATCH !== 258) { - runtime.log("error: Code too clever") - } - function Zip_DeflateCT() { - this.fc = 0; - this.dl = 0 - } - function Zip_DeflateTreeDesc() { - this.dyn_tree = null; - this.static_tree = null; - this.extra_bits = null; - this.extra_base = 0; - this.elems = 0; - this.max_length = 0; - this.max_code = 0 - } - function Zip_DeflateConfiguration(a, b, c, d) { - this.good_length = a; - this.max_lazy = b; - this.nice_length = c; - this.max_chain = d - } - function Zip_DeflateBuffer() { - this.next = null; - this.len = 0; - this.ptr = []; - this.ptr.length = zip_OUTBUFSIZ; - this.off = 0 - } - zip_configuration_table = [new Zip_DeflateConfiguration(0, 0, 0, 0), new Zip_DeflateConfiguration(4, 4, 8, 4), new Zip_DeflateConfiguration(4, 5, 16, 8), new Zip_DeflateConfiguration(4, 6, 32, 32), new Zip_DeflateConfiguration(4, 4, 16, 16), new Zip_DeflateConfiguration(8, 16, 32, 32), new Zip_DeflateConfiguration(8, 16, 128, 128), new Zip_DeflateConfiguration(8, 32, 128, 256), new Zip_DeflateConfiguration(32, 128, 258, 1024), new Zip_DeflateConfiguration(32, 258, 258, 4096)]; - function zip_deflate_start(level) { - var i; - if(!level) { - level = zip_DEFAULT_LEVEL - }else { - if(level < 1) { - level = 1 - }else { - if(level > 9) { - level = 9 - } - } - } - zip_compr_level = level; - zip_initflag = false; - zip_eofile = false; - if(zip_outbuf !== null) { - return - } - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = []; - zip_outbuf.length = zip_OUTBUFSIZ; - zip_window = []; - zip_window.length = zip_window_size; - zip_d_buf = []; - zip_d_buf.length = zip_DIST_BUFSIZE; - zip_l_buf = []; - zip_l_buf.length = zip_INBUFSIZ + zip_INBUF_EXTRA; - zip_prev = []; - zip_prev.length = 1 << zip_BITS; - zip_dyn_ltree = []; - zip_dyn_ltree.length = zip_HEAP_SIZE; - for(i = 0;i < zip_HEAP_SIZE;i++) { - zip_dyn_ltree[i] = new Zip_DeflateCT - } - zip_dyn_dtree = []; - zip_dyn_dtree.length = 2 * zip_D_CODES + 1; - for(i = 0;i < 2 * zip_D_CODES + 1;i++) { - zip_dyn_dtree[i] = new Zip_DeflateCT - } - zip_static_ltree = []; - zip_static_ltree.length = zip_L_CODES + 2; - for(i = 0;i < zip_L_CODES + 2;i++) { - zip_static_ltree[i] = new Zip_DeflateCT - } - zip_static_dtree = []; - zip_static_dtree.length = zip_D_CODES; - for(i = 0;i < zip_D_CODES;i++) { - zip_static_dtree[i] = new Zip_DeflateCT - } - zip_bl_tree = []; - zip_bl_tree.length = 2 * zip_BL_CODES + 1; - for(i = 0;i < 2 * zip_BL_CODES + 1;i++) { - zip_bl_tree[i] = new Zip_DeflateCT - } - zip_l_desc = new Zip_DeflateTreeDesc; - zip_d_desc = new Zip_DeflateTreeDesc; - zip_bl_desc = new Zip_DeflateTreeDesc; - zip_bl_count = []; - zip_bl_count.length = zip_MAX_BITS + 1; - zip_heap = []; - zip_heap.length = 2 * zip_L_CODES + 1; - zip_depth = []; - zip_depth.length = 2 * zip_L_CODES + 1; - zip_length_code = []; - zip_length_code.length = zip_MAX_MATCH - zip_MIN_MATCH + 1; - zip_dist_code = []; - zip_dist_code.length = 512; - zip_base_length = []; - zip_base_length.length = zip_LENGTH_CODES; - zip_base_dist = []; - zip_base_dist.length = zip_D_CODES; - zip_flag_buf = []; - zip_flag_buf.length = parseInt(zip_LIT_BUFSIZE / 8, 10) - } - var zip_deflate_end = function() { - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = null; - zip_window = null; - zip_d_buf = null; - zip_l_buf = null; - zip_prev = null; - zip_dyn_ltree = null; - zip_dyn_dtree = null; - zip_static_ltree = null; - zip_static_dtree = null; - zip_bl_tree = null; - zip_l_desc = null; - zip_d_desc = null; - zip_bl_desc = null; - zip_bl_count = null; - zip_heap = null; - zip_depth = null; - zip_length_code = null; - zip_dist_code = null; - zip_base_length = null; - zip_base_dist = null; - zip_flag_buf = null - }; - var zip_reuse_queue = function(p) { - p.next = zip_free_queue; - zip_free_queue = p - }; - var zip_new_queue = function() { - var p; - if(zip_free_queue !== null) { - p = zip_free_queue; - zip_free_queue = zip_free_queue.next - }else { - p = new Zip_DeflateBuffer - } - p.next = null; - p.len = p.off = 0; - return p - }; - var zip_head1 = function(i) { - return zip_prev[zip_WSIZE + i] - }; - var zip_head2 = function(i, val) { - zip_prev[zip_WSIZE + i] = val; - return val - }; - var zip_qoutbuf = function() { - var q, i; - if(zip_outcnt !== 0) { - q = zip_new_queue(); - if(zip_qhead === null) { - zip_qhead = zip_qtail = q - }else { - zip_qtail = zip_qtail.next = q - } - q.len = zip_outcnt - zip_outoff; - for(i = 0;i < q.len;i++) { - q.ptr[i] = zip_outbuf[zip_outoff + i] - } - zip_outcnt = zip_outoff = 0 - } - }; - var zip_put_byte = function(c) { - zip_outbuf[zip_outoff + zip_outcnt++] = c; - if(zip_outoff + zip_outcnt === zip_OUTBUFSIZ) { - zip_qoutbuf() - } - }; - var zip_put_short = function(w) { - w &= 65535; - if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { - zip_outbuf[zip_outoff + zip_outcnt++] = w & 255; - zip_outbuf[zip_outoff + zip_outcnt++] = w >>> 8 - }else { - zip_put_byte(w & 255); - zip_put_byte(w >>> 8) - } - }; - var zip_INSERT_STRING = function() { - zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[zip_strstart + zip_MIN_MATCH - 1] & 255) & zip_HASH_MASK; - zip_hash_head = zip_head1(zip_ins_h); - zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; - zip_head2(zip_ins_h, zip_strstart) - }; - var zip_Buf_size = 16; - var zip_send_bits = function(value, length) { - if(zip_bi_valid > zip_Buf_size - length) { - zip_bi_buf |= value << zip_bi_valid; - zip_put_short(zip_bi_buf); - zip_bi_buf = value >> zip_Buf_size - zip_bi_valid; - zip_bi_valid += length - zip_Buf_size - }else { - zip_bi_buf |= value << zip_bi_valid; - zip_bi_valid += length - } - }; - var zip_SEND_CODE = function(c, tree) { - zip_send_bits(tree[c].fc, tree[c].dl) - }; - var zip_D_CODE = function(dist) { - return(dist < 256 ? zip_dist_code[dist] : zip_dist_code[256 + (dist >> 7)]) & 255 - }; - var zip_SMALLER = function(tree, n, m) { - return tree[n].fc < tree[m].fc || tree[n].fc === tree[m].fc && zip_depth[n] <= zip_depth[m] - }; - var zip_read_buff = function(buff, offset, n) { - var i; - for(i = 0;i < n && zip_deflate_pos < zip_deflate_data.length;i++) { - buff[offset + i] = zip_deflate_data.charCodeAt(zip_deflate_pos++) & 255 - } - return i - }; - var zip_fill_window = function() { - var n, m; - var more = zip_window_size - zip_lookahead - zip_strstart; - if(more === -1) { - more-- - }else { - if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) { - for(n = 0;n < zip_WSIZE;n++) { - zip_window[n] = zip_window[n + zip_WSIZE] - } - zip_match_start -= zip_WSIZE; - zip_strstart -= zip_WSIZE; - zip_block_start -= zip_WSIZE; - for(n = 0;n < zip_HASH_SIZE;n++) { - m = zip_head1(n); - zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL) - } - for(n = 0;n < zip_WSIZE;n++) { - m = zip_prev[n]; - zip_prev[n] = m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL - } - more += zip_WSIZE - } - } - if(!zip_eofile) { - n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); - if(n <= 0) { - zip_eofile = true - }else { - zip_lookahead += n - } - } - }; - var zip_lm_init = function() { - var j; - for(j = 0;j < zip_HASH_SIZE;j++) { - zip_prev[zip_WSIZE + j] = 0 - } - zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; - zip_good_match = zip_configuration_table[zip_compr_level].good_length; - if(!zip_FULL_SEARCH) { - zip_nice_match = zip_configuration_table[zip_compr_level].nice_length - } - zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; - zip_strstart = 0; - zip_block_start = 0; - zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); - if(zip_lookahead <= 0) { - zip_eofile = true; - zip_lookahead = 0; - return - } - zip_eofile = false; - while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window() - } - zip_ins_h = 0; - for(j = 0;j < zip_MIN_MATCH - 1;j++) { - zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[j] & 255) & zip_HASH_MASK - } - }; - var zip_longest_match = function(cur_match) { - var chain_length = zip_max_chain_length; - var scanp = zip_strstart; - var matchp; - var len; - var best_len = zip_prev_length; - var limit = zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL; - var strendp = zip_strstart + zip_MAX_MATCH; - var scan_end1 = zip_window[scanp + best_len - 1]; - var scan_end = zip_window[scanp + best_len]; - if(zip_prev_length >= zip_good_match) { - chain_length >>= 2 - } - do { - matchp = cur_match; - if(zip_window[matchp + best_len] !== scan_end || zip_window[matchp + best_len - 1] !== scan_end1 || zip_window[matchp] !== zip_window[scanp] || zip_window[++matchp] !== zip_window[scanp + 1]) { - continue - } - scanp += 2; - matchp++; - do { - ++scanp - }while(zip_window[scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && scanp < strendp); - len = zip_MAX_MATCH - (strendp - scanp); - scanp = strendp - zip_MAX_MATCH; - if(len > best_len) { - zip_match_start = cur_match; - best_len = len; - if(zip_FULL_SEARCH) { - if(len >= zip_MAX_MATCH) { - break - } - }else { - if(len >= zip_nice_match) { - break - } - } - scan_end1 = zip_window[scanp + best_len - 1]; - scan_end = zip_window[scanp + best_len] - } - }while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit && --chain_length !== 0); - return best_len - }; - var zip_ct_tally = function(dist, lc) { - zip_l_buf[zip_last_lit++] = lc; - if(dist === 0) { - zip_dyn_ltree[lc].fc++ - }else { - dist--; - zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; - zip_dyn_dtree[zip_D_CODE(dist)].fc++; - zip_d_buf[zip_last_dist++] = dist; - zip_flags |= zip_flag_bit - } - zip_flag_bit <<= 1; - if((zip_last_lit & 7) === 0) { - zip_flag_buf[zip_last_flags++] = zip_flags; - zip_flags = 0; - zip_flag_bit = 1 - } - if(zip_compr_level > 2 && (zip_last_lit & 4095) === 0) { - var out_length = zip_last_lit * 8; - var in_length = zip_strstart - zip_block_start; - var dcode; - for(dcode = 0;dcode < zip_D_CODES;dcode++) { - out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]) - } - out_length >>= 3; - if(zip_last_dist < parseInt(zip_last_lit / 2, 10) && out_length < parseInt(in_length / 2, 10)) { - return true - } - } - return zip_last_lit === zip_LIT_BUFSIZE - 1 || zip_last_dist === zip_DIST_BUFSIZE - }; - var zip_pqdownheap = function(tree, k) { - var v = zip_heap[k]; - var j = k << 1; - while(j <= zip_heap_len) { - if(j < zip_heap_len && zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) { - j++ - } - if(zip_SMALLER(tree, v, zip_heap[j])) { - break - } - zip_heap[k] = zip_heap[j]; - k = j; - j <<= 1 - } - zip_heap[k] = v - }; - var zip_gen_bitlen = function(desc) { - var tree = desc.dyn_tree; - var extra = desc.extra_bits; - var base = desc.extra_base; - var max_code = desc.max_code; - var max_length = desc.max_length; - var stree = desc.static_tree; - var h; - var n, m; - var bits; - var xbits; - var f; - var overflow = 0; - for(bits = 0;bits <= zip_MAX_BITS;bits++) { - zip_bl_count[bits] = 0 - } - tree[zip_heap[zip_heap_max]].dl = 0; - for(h = zip_heap_max + 1;h < zip_HEAP_SIZE;h++) { - n = zip_heap[h]; - bits = tree[tree[n].dl].dl + 1; - if(bits > max_length) { - bits = max_length; - overflow++ - } - tree[n].dl = bits; - if(n > max_code) { - continue - } - zip_bl_count[bits]++; - xbits = 0; - if(n >= base) { - xbits = extra[n - base] - } - f = tree[n].fc; - zip_opt_len += f * (bits + xbits); - if(stree !== null) { - zip_static_len += f * (stree[n].dl + xbits) - } - } - if(overflow === 0) { - return - } - do { - bits = max_length - 1; - while(zip_bl_count[bits] === 0) { - bits-- - } - zip_bl_count[bits]--; - zip_bl_count[bits + 1] += 2; - zip_bl_count[max_length]--; - overflow -= 2 - }while(overflow > 0); - for(bits = max_length;bits !== 0;bits--) { - n = zip_bl_count[bits]; - while(n !== 0) { - m = zip_heap[--h]; - if(m > max_code) { - continue - } - if(tree[m].dl !== bits) { - zip_opt_len += (bits - tree[m].dl) * tree[m].fc; - tree[m].fc = bits - } - n-- - } - } - }; - var zip_bi_reverse = function(code, len) { - var res = 0; - do { - res |= code & 1; - code >>= 1; - res <<= 1 - }while(--len > 0); - return res >> 1 - }; - var zip_gen_codes = function(tree, max_code) { - var next_code = []; - next_code.length = zip_MAX_BITS + 1; - var code = 0; - var bits; - var n; - for(bits = 1;bits <= zip_MAX_BITS;bits++) { - code = code + zip_bl_count[bits - 1] << 1; - next_code[bits] = code - } - for(n = 0;n <= max_code;n++) { - var len = tree[n].dl; - if(len === 0) { - continue - } - tree[n].fc = zip_bi_reverse(next_code[len]++, len) - } - }; - var zip_build_tree = function(desc) { - var tree = desc.dyn_tree; - var stree = desc.static_tree; - var elems = desc.elems; - var n, m; - var max_code = -1; - var node = elems; - zip_heap_len = 0; - zip_heap_max = zip_HEAP_SIZE; - for(n = 0;n < elems;n++) { - if(tree[n].fc !== 0) { - zip_heap[++zip_heap_len] = max_code = n; - zip_depth[n] = 0 - }else { - tree[n].dl = 0 - } - } - while(zip_heap_len < 2) { - var xnew = zip_heap[++zip_heap_len] = max_code < 2 ? ++max_code : 0; - tree[xnew].fc = 1; - zip_depth[xnew] = 0; - zip_opt_len--; - if(stree !== null) { - zip_static_len -= stree[xnew].dl - } - } - desc.max_code = max_code; - for(n = zip_heap_len >> 1;n >= 1;n--) { - zip_pqdownheap(tree, n) - } - do { - n = zip_heap[zip_SMALLEST]; - zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; - zip_pqdownheap(tree, zip_SMALLEST); - m = zip_heap[zip_SMALLEST]; - zip_heap[--zip_heap_max] = n; - zip_heap[--zip_heap_max] = m; - tree[node].fc = tree[n].fc + tree[m].fc; - if(zip_depth[n] > zip_depth[m] + 1) { - zip_depth[node] = zip_depth[n] - }else { - zip_depth[node] = zip_depth[m] + 1 - } - tree[n].dl = tree[m].dl = node; - zip_heap[zip_SMALLEST] = node++; - zip_pqdownheap(tree, zip_SMALLEST) - }while(zip_heap_len >= 2); - zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; - zip_gen_bitlen(desc); - zip_gen_codes(tree, max_code) - }; - var zip_scan_tree = function(tree, max_code) { - var n; - var prevlen = -1; - var curlen; - var nextlen = tree[0].dl; - var count = 0; - var max_count = 7; - var min_count = 4; - if(nextlen === 0) { - max_count = 138; - min_count = 3 - } - tree[max_code + 1].dl = 65535; - for(n = 0;n <= max_code;n++) { - curlen = nextlen; - nextlen = tree[n + 1].dl; - if(++count < max_count && curlen === nextlen) { - continue - }else { - if(count < min_count) { - zip_bl_tree[curlen].fc += count - }else { - if(curlen !== 0) { - if(curlen !== prevlen) { - zip_bl_tree[curlen].fc++ - } - zip_bl_tree[zip_REP_3_6].fc++ - }else { - if(count <= 10) { - zip_bl_tree[zip_REPZ_3_10].fc++ - }else { - zip_bl_tree[zip_REPZ_11_138].fc++ - } - } - } - } - count = 0; - prevlen = curlen; - if(nextlen === 0) { - max_count = 138; - min_count = 3 - }else { - if(curlen === nextlen) { - max_count = 6; - min_count = 3 - }else { - max_count = 7; - min_count = 4 - } - } - } - }; - var zip_build_bl_tree = function() { - var max_blindex; - zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); - zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); - zip_build_tree(zip_bl_desc); - for(max_blindex = zip_BL_CODES - 1;max_blindex >= 3;max_blindex--) { - if(zip_bl_tree[zip_bl_order[max_blindex]].dl !== 0) { - break - } - } - zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - return max_blindex - }; - var zip_bi_windup = function() { - if(zip_bi_valid > 8) { - zip_put_short(zip_bi_buf) - }else { - if(zip_bi_valid > 0) { - zip_put_byte(zip_bi_buf) - } - } - zip_bi_buf = 0; - zip_bi_valid = 0 - }; - var zip_compress_block = function(ltree, dtree) { - var dist; - var lc; - var lx = 0; - var dx = 0; - var fx = 0; - var flag = 0; - var code; - var extra; - if(zip_last_lit !== 0) { - do { - if((lx & 7) === 0) { - flag = zip_flag_buf[fx++] - } - lc = zip_l_buf[lx++] & 255; - if((flag & 1) === 0) { - zip_SEND_CODE(lc, ltree) - }else { - code = zip_length_code[lc]; - zip_SEND_CODE(code + zip_LITERALS + 1, ltree); - extra = zip_extra_lbits[code]; - if(extra !== 0) { - lc -= zip_base_length[code]; - zip_send_bits(lc, extra) - } - dist = zip_d_buf[dx++]; - code = zip_D_CODE(dist); - zip_SEND_CODE(code, dtree); - extra = zip_extra_dbits[code]; - if(extra !== 0) { - dist -= zip_base_dist[code]; - zip_send_bits(dist, extra) - } - } - flag >>= 1 - }while(lx < zip_last_lit) - } - zip_SEND_CODE(zip_END_BLOCK, ltree) - }; - var zip_send_tree = function(tree, max_code) { - var n; - var prevlen = -1; - var curlen; - var nextlen = tree[0].dl; - var count = 0; - var max_count = 7; - var min_count = 4; - if(nextlen === 0) { - max_count = 138; - min_count = 3 - } - for(n = 0;n <= max_code;n++) { - curlen = nextlen; - nextlen = tree[n + 1].dl; - if(++count < max_count && curlen === nextlen) { - continue - }else { - if(count < min_count) { - do { - zip_SEND_CODE(curlen, zip_bl_tree) - }while(--count !== 0) - }else { - if(curlen !== 0) { - if(curlen !== prevlen) { - zip_SEND_CODE(curlen, zip_bl_tree); - count-- - } - zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); - zip_send_bits(count - 3, 2) - }else { - if(count <= 10) { - zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); - zip_send_bits(count - 3, 3) - }else { - zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); - zip_send_bits(count - 11, 7) - } - } - } - } - count = 0; - prevlen = curlen; - if(nextlen === 0) { - max_count = 138; - min_count = 3 - }else { - if(curlen === nextlen) { - max_count = 6; - min_count = 3 - }else { - max_count = 7; - min_count = 4 - } - } - } - }; - var zip_send_all_trees = function(lcodes, dcodes, blcodes) { - var rank; - zip_send_bits(lcodes - 257, 5); - zip_send_bits(dcodes - 1, 5); - zip_send_bits(blcodes - 4, 4); - for(rank = 0;rank < blcodes;rank++) { - zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3) - } - zip_send_tree(zip_dyn_ltree, lcodes - 1); - zip_send_tree(zip_dyn_dtree, dcodes - 1) - }; - var zip_init_block = function() { - var n; - for(n = 0;n < zip_L_CODES;n++) { - zip_dyn_ltree[n].fc = 0 - } - for(n = 0;n < zip_D_CODES;n++) { - zip_dyn_dtree[n].fc = 0 - } - for(n = 0;n < zip_BL_CODES;n++) { - zip_bl_tree[n].fc = 0 - } - zip_dyn_ltree[zip_END_BLOCK].fc = 1; - zip_opt_len = zip_static_len = 0; - zip_last_lit = zip_last_dist = zip_last_flags = 0; - zip_flags = 0; - zip_flag_bit = 1 - }; - var zip_flush_block = function(eof) { - var opt_lenb, static_lenb; - var max_blindex; - var stored_len; - stored_len = zip_strstart - zip_block_start; - zip_flag_buf[zip_last_flags] = zip_flags; - zip_build_tree(zip_l_desc); - zip_build_tree(zip_d_desc); - max_blindex = zip_build_bl_tree(); - opt_lenb = zip_opt_len + 3 + 7 >> 3; - static_lenb = zip_static_len + 3 + 7 >> 3; - if(static_lenb <= opt_lenb) { - opt_lenb = static_lenb - } - if(stored_len + 4 <= opt_lenb && zip_block_start >= 0) { - var i; - zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); - zip_bi_windup(); - zip_put_short(stored_len); - zip_put_short(~stored_len); - for(i = 0;i < stored_len;i++) { - zip_put_byte(zip_window[zip_block_start + i]) - } - }else { - if(static_lenb === opt_lenb) { - zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); - zip_compress_block(zip_static_ltree, zip_static_dtree) - }else { - zip_send_bits((zip_DYN_TREES << 1) + eof, 3); - zip_send_all_trees(zip_l_desc.max_code + 1, zip_d_desc.max_code + 1, max_blindex + 1); - zip_compress_block(zip_dyn_ltree, zip_dyn_dtree) - } - } - zip_init_block(); - if(eof !== 0) { - zip_bi_windup() - } - }; - var zip_deflate_fast = function() { - while(zip_lookahead !== 0 && zip_qhead === null) { - var flush; - zip_INSERT_STRING(); - if(zip_hash_head !== zip_NIL && zip_strstart - zip_hash_head <= zip_MAX_DIST) { - zip_match_length = zip_longest_match(zip_hash_head); - if(zip_match_length > zip_lookahead) { - zip_match_length = zip_lookahead - } - } - if(zip_match_length >= zip_MIN_MATCH) { - flush = zip_ct_tally(zip_strstart - zip_match_start, zip_match_length - zip_MIN_MATCH); - zip_lookahead -= zip_match_length; - if(zip_match_length <= zip_max_lazy_match) { - zip_match_length--; - do { - zip_strstart++; - zip_INSERT_STRING() - }while(--zip_match_length !== 0); - zip_strstart++ - }else { - zip_strstart += zip_match_length; - zip_match_length = 0; - zip_ins_h = zip_window[zip_strstart] & 255; - zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[zip_strstart + 1] & 255) & zip_HASH_MASK - } - }else { - flush = zip_ct_tally(0, zip_window[zip_strstart] & 255); - zip_lookahead--; - zip_strstart++ - } - if(flush) { - zip_flush_block(0); - zip_block_start = zip_strstart - } - while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window() - } - } - }; - var zip_deflate_better = function() { - while(zip_lookahead !== 0 && zip_qhead === null) { - zip_INSERT_STRING(); - zip_prev_length = zip_match_length; - zip_prev_match = zip_match_start; - zip_match_length = zip_MIN_MATCH - 1; - if(zip_hash_head !== zip_NIL && zip_prev_length < zip_max_lazy_match && zip_strstart - zip_hash_head <= zip_MAX_DIST) { - zip_match_length = zip_longest_match(zip_hash_head); - if(zip_match_length > zip_lookahead) { - zip_match_length = zip_lookahead - } - if(zip_match_length === zip_MIN_MATCH && zip_strstart - zip_match_start > zip_TOO_FAR) { - zip_match_length-- - } - } - if(zip_prev_length >= zip_MIN_MATCH && zip_match_length <= zip_prev_length) { - var flush; - flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, zip_prev_length - zip_MIN_MATCH); - zip_lookahead -= zip_prev_length - 1; - zip_prev_length -= 2; - do { - zip_strstart++; - zip_INSERT_STRING() - }while(--zip_prev_length !== 0); - zip_match_available = 0; - zip_match_length = zip_MIN_MATCH - 1; - zip_strstart++; - if(flush) { - zip_flush_block(0); - zip_block_start = zip_strstart - } - }else { - if(zip_match_available !== 0) { - if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 255)) { - zip_flush_block(0); - zip_block_start = zip_strstart - } - zip_strstart++; - zip_lookahead-- - }else { - zip_match_available = 1; - zip_strstart++; - zip_lookahead-- - } - } - while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window() - } - } - }; - var zip_ct_init = function() { - var n; - var bits; - var length; - var code; - var dist; - if(zip_static_dtree[0].dl !== 0) { - return - } - zip_l_desc.dyn_tree = zip_dyn_ltree; - zip_l_desc.static_tree = zip_static_ltree; - zip_l_desc.extra_bits = zip_extra_lbits; - zip_l_desc.extra_base = zip_LITERALS + 1; - zip_l_desc.elems = zip_L_CODES; - zip_l_desc.max_length = zip_MAX_BITS; - zip_l_desc.max_code = 0; - zip_d_desc.dyn_tree = zip_dyn_dtree; - zip_d_desc.static_tree = zip_static_dtree; - zip_d_desc.extra_bits = zip_extra_dbits; - zip_d_desc.extra_base = 0; - zip_d_desc.elems = zip_D_CODES; - zip_d_desc.max_length = zip_MAX_BITS; - zip_d_desc.max_code = 0; - zip_bl_desc.dyn_tree = zip_bl_tree; - zip_bl_desc.static_tree = null; - zip_bl_desc.extra_bits = zip_extra_blbits; - zip_bl_desc.extra_base = 0; - zip_bl_desc.elems = zip_BL_CODES; - zip_bl_desc.max_length = zip_MAX_BL_BITS; - zip_bl_desc.max_code = 0; - length = 0; - for(code = 0;code < zip_LENGTH_CODES - 1;code++) { - zip_base_length[code] = length; - for(n = 0;n < 1 << zip_extra_lbits[code];n++) { - zip_length_code[length++] = code - } - } - zip_length_code[length - 1] = code; - dist = 0; - for(code = 0;code < 16;code++) { - zip_base_dist[code] = dist; - for(n = 0;n < 1 << zip_extra_dbits[code];n++) { - zip_dist_code[dist++] = code - } - } - dist >>= 7; - n = code; - for(code = n;code < zip_D_CODES;code++) { - zip_base_dist[code] = dist << 7; - for(n = 0;n < 1 << zip_extra_dbits[code] - 7;n++) { - zip_dist_code[256 + dist++] = code - } - } - for(bits = 0;bits <= zip_MAX_BITS;bits++) { - zip_bl_count[bits] = 0 - } - n = 0; - while(n <= 143) { - zip_static_ltree[n++].dl = 8; - zip_bl_count[8]++ - } - while(n <= 255) { - zip_static_ltree[n++].dl = 9; - zip_bl_count[9]++ - } - while(n <= 279) { - zip_static_ltree[n++].dl = 7; - zip_bl_count[7]++ - } - while(n <= 287) { - zip_static_ltree[n++].dl = 8; - zip_bl_count[8]++ - } - zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); - for(n = 0;n < zip_D_CODES;n++) { - zip_static_dtree[n].dl = 5; - zip_static_dtree[n].fc = zip_bi_reverse(n, 5) - } - zip_init_block() - }; - var zip_init_deflate = function() { - if(zip_eofile) { - return - } - zip_bi_buf = 0; - zip_bi_valid = 0; - zip_ct_init(); - zip_lm_init(); - zip_qhead = null; - zip_outcnt = 0; - zip_outoff = 0; - if(zip_compr_level <= 3) { - zip_prev_length = zip_MIN_MATCH - 1; - zip_match_length = 0 - }else { - zip_match_length = zip_MIN_MATCH - 1; - zip_match_available = 0 - } - zip_complete = false - }; - var zip_qcopy = function(buff, off, buff_size) { - var n, i, j; - n = 0; - while(zip_qhead !== null && n < buff_size) { - i = buff_size - n; - if(i > zip_qhead.len) { - i = zip_qhead.len - } - for(j = 0;j < i;j++) { - buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j] - } - zip_qhead.off += i; - zip_qhead.len -= i; - n += i; - if(zip_qhead.len === 0) { - var p; - p = zip_qhead; - zip_qhead = zip_qhead.next; - zip_reuse_queue(p) - } - } - if(n === buff_size) { - return n - } - if(zip_outoff < zip_outcnt) { - i = buff_size - n; - if(i > zip_outcnt - zip_outoff) { - i = zip_outcnt - zip_outoff - } - for(j = 0;j < i;j++) { - buff[off + n + j] = zip_outbuf[zip_outoff + j] - } - zip_outoff += i; - n += i; - if(zip_outcnt === zip_outoff) { - zip_outcnt = zip_outoff = 0 - } - } - return n - }; - var zip_deflate_internal = function(buff, off, buff_size) { - var n; - if(!zip_initflag) { - zip_init_deflate(); - zip_initflag = true; - if(zip_lookahead === 0) { - zip_complete = true; - return 0 - } - } - if((n = zip_qcopy(buff, off, buff_size)) === buff_size) { - return buff_size - } - if(zip_complete) { - return n - } - if(zip_compr_level <= 3) { - zip_deflate_fast() - }else { - zip_deflate_better() - } - if(zip_lookahead === 0) { - if(zip_match_available !== 0) { - zip_ct_tally(0, zip_window[zip_strstart - 1] & 255) - } - zip_flush_block(1); - zip_complete = true - } - return n + zip_qcopy(buff, n + off, buff_size - n) - }; - var zip_deflate = function(str, level) { - var i, j; - zip_deflate_data = str; - zip_deflate_pos = 0; - if(typeof level === "undefined") { - level = zip_DEFAULT_LEVEL - } - zip_deflate_start(level); - var buff = new Array(1024); - var aout = []; - while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { - var cbuf = []; - cbuf.length = i; - for(j = 0;j < i;j++) { - cbuf[j] = String.fromCharCode(buff[j]) - } - aout[aout.length] = cbuf.join("") - } - zip_deflate_data = null; - return aout.join("") - }; - this.deflate = zip_deflate -}; -core.ByteArray = function ByteArray(data) { - this.pos = 0; - this.data = data; - this.readUInt32LE = function() { - var data = this.data, pos = this.pos += 4; - return data[--pos] << 24 | data[--pos] << 16 | data[--pos] << 8 | data[--pos] - }; - this.readUInt16LE = function() { - var data = this.data, pos = this.pos += 2; - return data[--pos] << 8 | data[--pos] - } -}; -core.ByteArrayWriter = function ByteArrayWriter(encoding) { - var self = this, data = new runtime.ByteArray(0); - this.appendByteArrayWriter = function(writer) { - data = runtime.concatByteArrays(data, writer.getByteArray()) - }; - this.appendByteArray = function(array) { - data = runtime.concatByteArrays(data, array) - }; - this.appendArray = function(array) { - data = runtime.concatByteArrays(data, runtime.byteArrayFromArray(array)) - }; - this.appendUInt16LE = function(value) { - self.appendArray([value & 255, value >> 8 & 255]) - }; - this.appendUInt32LE = function(value) { - self.appendArray([value & 255, value >> 8 & 255, value >> 16 & 255, value >> 24 & 255]) - }; - this.appendString = function(string) { - data = runtime.concatByteArrays(data, runtime.byteArrayFromString(string, encoding)) - }; - this.getLength = function() { - return data.length - }; - this.getByteArray = function() { - return data - } -}; -core.RawInflate = function RawInflate() { - var zip_WSIZE = 32768; - var zip_STORED_BLOCK = 0; - var zip_STATIC_TREES = 1; - var zip_DYN_TREES = 2; - var zip_lbits = 9; - var zip_dbits = 6; - var zip_INBUFSIZ = 32768; - var zip_INBUF_EXTRA = 64; - var zip_slide; - var zip_wp; - var zip_fixed_tl = null; - var zip_fixed_td; - var zip_fixed_bl, fixed_bd; - var zip_bit_buf; - var zip_bit_len; - var zip_method; - var zip_eof; - var zip_copy_leng; - var zip_copy_dist; - var zip_tl, zip_td; - var zip_bl, zip_bd; - var zip_inflate_data; - var zip_inflate_pos; - var zip_MASK_BITS = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535); - var zip_cplens = new Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); - var zip_cplext = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); - var zip_cpdist = new Array(1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577); - var zip_cpdext = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13); - var zip_border = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); - var zip_HuftList = function() { - this.next = null; - this.list = null - }; - var zip_HuftNode = function() { - this.e = 0; - this.b = 0; - this.n = 0; - this.t = null - }; - var zip_HuftBuild = function(b, n, s, d, e, mm) { - this.BMAX = 16; - this.N_MAX = 288; - this.status = 0; - this.root = null; - this.m = 0; - var a; - var c = new Array(this.BMAX + 1); - var el; - var f; - var g; - var h; - var i; - var j; - var k; - var lx = new Array(this.BMAX + 1); - var p; - var pidx; - var q; - var r = new zip_HuftNode; - var u = new Array(this.BMAX); - var v = new Array(this.N_MAX); - var w; - var x = new Array(this.BMAX + 1); - var xp; - var y; - var z; - var o; - var tail; - tail = this.root = null; - for(i = 0;i < c.length;i++) { - c[i] = 0 - } - for(i = 0;i < lx.length;i++) { - lx[i] = 0 - } - for(i = 0;i < u.length;i++) { - u[i] = null - } - for(i = 0;i < v.length;i++) { - v[i] = 0 - } - for(i = 0;i < x.length;i++) { - x[i] = 0 - } - el = n > 256 ? b[256] : this.BMAX; - p = b; - pidx = 0; - i = n; - do { - c[p[pidx]]++; - pidx++ - }while(--i > 0); - if(c[0] == n) { - this.root = null; - this.m = 0; - this.status = 0; - return - } - for(j = 1;j <= this.BMAX;j++) { - if(c[j] != 0) { - break - } - } - k = j; - if(mm < j) { - mm = j - } - for(i = this.BMAX;i != 0;i--) { - if(c[i] != 0) { - break - } - } - g = i; - if(mm > i) { - mm = i - } - for(y = 1 << j;j < i;j++, y <<= 1) { - if((y -= c[j]) < 0) { - this.status = 2; - this.m = mm; - return - } - } - if((y -= c[i]) < 0) { - this.status = 2; - this.m = mm; - return - } - c[i] += y; - x[1] = j = 0; - p = c; - pidx = 1; - xp = 2; - while(--i > 0) { - x[xp++] = j += p[pidx++] - } - p = b; - pidx = 0; - i = 0; - do { - if((j = p[pidx++]) != 0) { - v[x[j]++] = i - } - }while(++i < n); - n = x[g]; - x[0] = i = 0; - p = v; - pidx = 0; - h = -1; - w = lx[0] = 0; - q = null; - z = 0; - for(;k <= g;k++) { - a = c[k]; - while(a-- > 0) { - while(k > w + lx[1 + h]) { - w += lx[1 + h]; - h++; - z = (z = g - w) > mm ? mm : z; - if((f = 1 << (j = k - w)) > a + 1) { - f -= a + 1; - xp = k; - while(++j < z) { - if((f <<= 1) <= c[++xp]) { - break - } - f -= c[xp] - } - } - if(w + j > el && w < el) { - j = el - w - } - z = 1 << j; - lx[1 + h] = j; - q = new Array(z); - for(o = 0;o < z;o++) { - q[o] = new zip_HuftNode - } - if(tail == null) { - tail = this.root = new zip_HuftList - }else { - tail = tail.next = new zip_HuftList - } - tail.next = null; - tail.list = q; - u[h] = q; - if(h > 0) { - x[h] = i; - r.b = lx[h]; - r.e = 16 + j; - r.t = q; - j = (i & (1 << w) - 1) >> w - lx[h]; - u[h - 1][j].e = r.e; - u[h - 1][j].b = r.b; - u[h - 1][j].n = r.n; - u[h - 1][j].t = r.t - } - } - r.b = k - w; - if(pidx >= n) { - r.e = 99 - }else { - if(p[pidx] < s) { - r.e = p[pidx] < 256 ? 16 : 15; - r.n = p[pidx++] - }else { - r.e = e[p[pidx] - s]; - r.n = d[p[pidx++] - s] - } - } - f = 1 << k - w; - for(j = i >> w;j < z;j += f) { - q[j].e = r.e; - q[j].b = r.b; - q[j].n = r.n; - q[j].t = r.t - } - for(j = 1 << k - 1;(i & j) != 0;j >>= 1) { - i ^= j - } - i ^= j; - while((i & (1 << w) - 1) != x[h]) { - w -= lx[h]; - h-- - } - } - } - this.m = lx[1]; - this.status = y != 0 && g != 1 ? 1 : 0 - }; - var zip_GET_BYTE = function() { - if(zip_inflate_data.length == zip_inflate_pos) { - return-1 - } - return zip_inflate_data[zip_inflate_pos++] - }; - var zip_NEEDBITS = function(n) { - while(zip_bit_len < n) { - zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; - zip_bit_len += 8 - } - }; - var zip_GETBITS = function(n) { - return zip_bit_buf & zip_MASK_BITS[n] - }; - var zip_DUMPBITS = function(n) { - zip_bit_buf >>= n; - zip_bit_len -= n - }; - var zip_inflate_codes = function(buff, off, size) { - var e; - var t; - var n; - if(size == 0) { - return 0 - } - n = 0; - for(;;) { - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - e = t.e; - while(e > 16) { - if(e == 99) { - return-1 - } - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e - } - zip_DUMPBITS(t.b); - if(e == 16) { - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = t.n; - if(n == size) { - return size - } - continue - } - if(e == 15) { - break - } - zip_NEEDBITS(e); - zip_copy_leng = t.n + zip_GETBITS(e); - zip_DUMPBITS(e); - zip_NEEDBITS(zip_bd); - t = zip_td.list[zip_GETBITS(zip_bd)]; - e = t.e; - while(e > 16) { - if(e == 99) { - return-1 - } - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e - } - zip_DUMPBITS(t.b); - zip_NEEDBITS(e); - zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); - zip_DUMPBITS(e); - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++] - } - if(n == size) { - return size - } - } - zip_method = -1; - return n - }; - var zip_inflate_stored = function(buff, off, size) { - var n; - n = zip_bit_len & 7; - zip_DUMPBITS(n); - zip_NEEDBITS(16); - n = zip_GETBITS(16); - zip_DUMPBITS(16); - zip_NEEDBITS(16); - if(n != (~zip_bit_buf & 65535)) { - return-1 - } - zip_DUMPBITS(16); - zip_copy_leng = n; - n = 0; - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); - zip_DUMPBITS(8) - } - if(zip_copy_leng == 0) { - zip_method = -1 - } - return n - }; - var zip_fixed_bd; - var zip_inflate_fixed = function(buff, off, size) { - if(zip_fixed_tl == null) { - var i; - var l = new Array(288); - var h; - for(i = 0;i < 144;i++) { - l[i] = 8 - } - for(;i < 256;i++) { - l[i] = 9 - } - for(;i < 280;i++) { - l[i] = 7 - } - for(;i < 288;i++) { - l[i] = 8 - } - zip_fixed_bl = 7; - h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, zip_fixed_bl); - if(h.status != 0) { - alert("HufBuild error: " + h.status); - return-1 - } - zip_fixed_tl = h.root; - zip_fixed_bl = h.m; - for(i = 0;i < 30;i++) { - l[i] = 5 - } - zip_fixed_bd = 5; - h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); - if(h.status > 1) { - zip_fixed_tl = null; - alert("HufBuild error: " + h.status); - return-1 - } - zip_fixed_td = h.root; - zip_fixed_bd = h.m - } - zip_tl = zip_fixed_tl; - zip_td = zip_fixed_td; - zip_bl = zip_fixed_bl; - zip_bd = zip_fixed_bd; - return zip_inflate_codes(buff, off, size) - }; - var zip_inflate_dynamic = function(buff, off, size) { - var i; - var j; - var l; - var n; - var t; - var nb; - var nl; - var nd; - var ll = new Array(286 + 30); - var h; - for(i = 0;i < ll.length;i++) { - ll[i] = 0 - } - zip_NEEDBITS(5); - nl = 257 + zip_GETBITS(5); - zip_DUMPBITS(5); - zip_NEEDBITS(5); - nd = 1 + zip_GETBITS(5); - zip_DUMPBITS(5); - zip_NEEDBITS(4); - nb = 4 + zip_GETBITS(4); - zip_DUMPBITS(4); - if(nl > 286 || nd > 30) { - return-1 - } - for(j = 0;j < nb;j++) { - zip_NEEDBITS(3); - ll[zip_border[j]] = zip_GETBITS(3); - zip_DUMPBITS(3) - } - for(;j < 19;j++) { - ll[zip_border[j]] = 0 - } - zip_bl = 7; - h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); - if(h.status != 0) { - return-1 - } - zip_tl = h.root; - zip_bl = h.m; - n = nl + nd; - i = l = 0; - while(i < n) { - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - j = t.b; - zip_DUMPBITS(j); - j = t.n; - if(j < 16) { - ll[i++] = l = j - }else { - if(j == 16) { - zip_NEEDBITS(2); - j = 3 + zip_GETBITS(2); - zip_DUMPBITS(2); - if(i + j > n) { - return-1 - } - while(j-- > 0) { - ll[i++] = l - } - }else { - if(j == 17) { - zip_NEEDBITS(3); - j = 3 + zip_GETBITS(3); - zip_DUMPBITS(3); - if(i + j > n) { - return-1 - } - while(j-- > 0) { - ll[i++] = 0 - } - l = 0 - }else { - zip_NEEDBITS(7); - j = 11 + zip_GETBITS(7); - zip_DUMPBITS(7); - if(i + j > n) { - return-1 - } - while(j-- > 0) { - ll[i++] = 0 - } - l = 0 - } - } - } - } - zip_bl = zip_lbits; - h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); - if(zip_bl == 0) { - h.status = 1 - } - if(h.status != 0) { - return-1 - } - zip_tl = h.root; - zip_bl = h.m; - for(i = 0;i < nd;i++) { - ll[i] = ll[i + nl] - } - zip_bd = zip_dbits; - h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); - zip_td = h.root; - zip_bd = h.m; - if(zip_bd == 0 && nl > 257) { - return-1 - } - if(h.status != 0) { - return-1 - } - return zip_inflate_codes(buff, off, size) - }; - var zip_inflate_start = function() { - var i; - if(zip_slide == null) { - zip_slide = new Array(2 * zip_WSIZE) - } - zip_wp = 0; - zip_bit_buf = 0; - zip_bit_len = 0; - zip_method = -1; - zip_eof = false; - zip_copy_leng = zip_copy_dist = 0; - zip_tl = null - }; - var zip_inflate_internal = function(buff, off, size) { - var n, i; - n = 0; - while(n < size) { - if(zip_eof && zip_method == -1) { - return n - } - if(zip_copy_leng > 0) { - if(zip_method != zip_STORED_BLOCK) { - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++] - } - }else { - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); - zip_DUMPBITS(8) - } - if(zip_copy_leng == 0) { - zip_method = -1 - } - } - if(n == size) { - return n - } - } - if(zip_method == -1) { - if(zip_eof) { - break - } - zip_NEEDBITS(1); - if(zip_GETBITS(1) != 0) { - zip_eof = true - } - zip_DUMPBITS(1); - zip_NEEDBITS(2); - zip_method = zip_GETBITS(2); - zip_DUMPBITS(2); - zip_tl = null; - zip_copy_leng = 0 - } - switch(zip_method) { - case 0: - i = zip_inflate_stored(buff, off + n, size - n); - break; - case 1: - if(zip_tl != null) { - i = zip_inflate_codes(buff, off + n, size - n) - }else { - i = zip_inflate_fixed(buff, off + n, size - n) - } - break; - case 2: - if(zip_tl != null) { - i = zip_inflate_codes(buff, off + n, size - n) - }else { - i = zip_inflate_dynamic(buff, off + n, size - n) - } - break; - default: - i = -1; - break - } - if(i == -1) { - if(zip_eof) { - return 0 - } - return-1 - } - n += i - } - return n - }; - var zip_inflate = function(data, size) { - var i, j; - zip_inflate_start(); - zip_inflate_data = data; - zip_inflate_pos = 0; - var buff = new runtime.ByteArray(size); - zip_inflate_internal(buff, 0, size); - zip_inflate_data = null; - return buff - }; - this.inflate = zip_inflate -}; -core.Cursor = function Cursor(selection, document) { - var cursorns, cursorNode; - cursorns = "urn:webodf:names:cursor"; - cursorNode = document.createElementNS(cursorns, "cursor"); - function putCursorIntoTextNode(container, offset) { - var len, ref, textnode, parent; - parent = container.parentNode; - if(offset === 0) { - parent.insertBefore(cursorNode, container) - }else { - if(offset === container.length) { - parent.appendChild(cursorNode) - }else { - len = container.length; - ref = container.nextSibling; - textnode = document.createTextNode(container.substringData(offset, len)); - container.deleteData(offset, len); - if(ref) { - parent.insertBefore(textnode, ref) - }else { - parent.appendChild(textnode) - } - parent.insertBefore(cursorNode, textnode) - } - } - } - function putCursorIntoContainer(container, offset) { - var node; - node = container.firstChild; - while(node && offset) { - node = node.nextSibling; - offset -= 1 - } - container.insertBefore(cursorNode, node) - } - function getPotentialParentOrNode(parent, node) { - var n = node; - while(n && n !== parent) { - n = n.parentNode - } - return n || node - } - function removeCursorFromSelectionRange(range, cursorpos) { - var cursorParent, start, end; - cursorParent = cursorNode.parentNode; - start = getPotentialParentOrNode(cursorNode, range.startContainer); - end = getPotentialParentOrNode(cursorNode, range.endContainer); - if(start === cursorNode) { - range.setStart(cursorParent, cursorpos) - }else { - if(start === cursorParent && range.startOffset > cursorpos) { - range.setStart(cursorParent, range.startOffset - 1) - } - } - if(range.endContainer === cursorNode) { - range.setEnd(cursorParent, cursorpos) - }else { - if(range.endContainer === cursorParent && range.endOffset > cursorpos) { - range.setEnd(cursorParent, range.endOffset - 1) - } - } - } - function adaptRangeToMergedText(range, prev, textnodetomerge, cursorpos) { - var diff = prev.length - textnodetomerge.length; - if(range.startContainer === textnodetomerge) { - range.setStart(prev, diff + range.startOffset) - }else { - if(range.startContainer === prev.parentNode && range.startOffset === cursorpos) { - range.setStart(prev, diff) - } - } - if(range.endContainer === textnodetomerge) { - range.setEnd(prev, diff + range.endOffset) - }else { - if(range.endContainer === prev.parentNode && range.endOffset === cursorpos) { - range.setEnd(prev, diff) - } - } - } - function removeCursor() { - var i, cursorpos, node, textnodetoremove, range; - if(!cursorNode.parentNode) { - return - } - cursorpos = 0; - node = cursorNode.parentNode.firstChild; - while(node && node !== cursorNode) { - cursorpos += 1; - node = node.nextSibling - } - if(cursorNode.previousSibling && cursorNode.previousSibling.nodeType === 3 && cursorNode.nextSibling && cursorNode.nextSibling.nodeType === 3) { - textnodetoremove = cursorNode.nextSibling; - cursorNode.previousSibling.appendData(textnodetoremove.nodeValue) - } - for(i = 0;i < selection.rangeCount;i += 1) { - removeCursorFromSelectionRange(selection.getRangeAt(i), cursorpos) - } - if(textnodetoremove) { - for(i = 0;i < selection.rangeCount;i += 1) { - adaptRangeToMergedText(selection.getRangeAt(i), cursorNode.previousSibling, textnodetoremove, cursorpos) - } - textnodetoremove.parentNode.removeChild(textnodetoremove) - } - cursorNode.parentNode.removeChild(cursorNode) - } - function putCursor(container, offset) { - if(container.nodeType === 3) { - putCursorIntoTextNode(container, offset) - }else { - if(container.nodeType !== 9) { - putCursorIntoContainer(container, offset) - } - } - } - this.getNode = function() { - return cursorNode - }; - this.updateToSelection = function() { - var range; - removeCursor(); - if(selection.focusNode) { - putCursor(selection.focusNode, selection.focusOffset) - } - }; - this.remove = function() { - removeCursor() - } -}; -core.UnitTest = function UnitTest() { -}; -core.UnitTest.prototype.setUp = function() { -}; -core.UnitTest.prototype.tearDown = function() { -}; -core.UnitTest.prototype.description = function() { -}; -core.UnitTest.prototype.tests = function() { -}; -core.UnitTest.prototype.asyncTests = function() { -}; -core.UnitTestRunner = function UnitTestRunner() { - var failedTests = 0; - function debug(msg) { - runtime.log(msg) - } - function testFailed(msg) { - failedTests += 1; - runtime.log("fail", msg) - } - function testPassed(msg) { - runtime.log("pass", msg) - } - function areArraysEqual(a, b) { - var i; - try { - if(a.length !== b.length) { - return false - } - for(i = 0;i < a.length;i += 1) { - if(a[i] !== b[i]) { - return false - } - } - }catch(ex) { - return false - } - return true - } - function isResultCorrect(actual, expected) { - if(expected === 0) { - return actual === expected && 1 / actual === 1 / expected - } - if(actual === expected) { - return true - } - if(typeof expected === "number" && isNaN(expected)) { - return typeof actual === "number" && isNaN(actual) - } - if(Object.prototype.toString.call(expected) === Object.prototype.toString.call([])) { - return areArraysEqual(actual, expected) - } - return false - } - function stringify(v) { - if(v === 0 && 1 / v < 0) { - return"-0" - } - return String(v) - } - function shouldBe(t, a, b) { - if(typeof a !== "string" || typeof b !== "string") { - debug("WARN: shouldBe() expects string arguments") - } - var exception, av, bv; - try { - av = eval(a) - }catch(e) { - exception = e - } - bv = eval(b); - if(exception) { - testFailed(a + " should be " + bv + ". Threw exception " + exception) - }else { - if(isResultCorrect(av, bv)) { - testPassed(a + " is " + b) - }else { - if(typeof av === typeof bv) { - testFailed(a + " should be " + bv + ". Was " + stringify(av) + ".") - }else { - testFailed(a + " should be " + bv + " (of type " + typeof bv + "). Was " + av + " (of type " + typeof av + ").") - } - } - } - } - function shouldBeNonNull(t, a) { - var exception, av; - try { - av = eval(a) - }catch(e) { - exception = e - } - if(exception) { - testFailed(a + " should be non-null. Threw exception " + exception) - }else { - if(av !== null) { - testPassed(a + " is non-null.") - }else { - testFailed(a + " should be non-null. Was " + av) - } - } - } - function shouldBeNull(t, a) { - shouldBe(t, a, "null") - } - this.shouldBeNull = shouldBeNull; - this.shouldBeNonNull = shouldBeNonNull; - this.shouldBe = shouldBe; - this.countFailedTests = function() { - return failedTests - } -}; -core.UnitTester = function UnitTester() { - var failedTests = 0, results = {}; - this.runTests = function(TestClass, callback) { - var testName = Runtime.getFunctionName(TestClass), tname, runner = new core.UnitTestRunner, test = new TestClass(runner), testResults = {}, i, t, tests, lastFailCount; - if(testName.hasOwnProperty(results)) { - runtime.log("Test " + testName + " has already run."); - return - } - runtime.log("Running " + testName + ": " + test.description()); - tests = test.tests(); - for(i = 0;i < tests.length;i += 1) { - t = tests[i]; - tname = Runtime.getFunctionName(t); - runtime.log("Running " + tname); - lastFailCount = runner.countFailedTests(); - test.setUp(); - t(); - test.tearDown(); - testResults[tname] = lastFailCount === runner.countFailedTests() - } - function runAsyncTests(todo) { - if(todo.length === 0) { - results[testName] = testResults; - failedTests += runner.countFailedTests(); - callback(); - return - } - t = todo[0]; - var tname = Runtime.getFunctionName(t); - runtime.log("Running " + tname); - lastFailCount = runner.countFailedTests(); - test.setUp(); - t(function() { - test.tearDown(); - testResults[tname] = lastFailCount === runner.countFailedTests(); - runAsyncTests(todo.slice(1)) - }) - } - runAsyncTests(test.asyncTests()) - }; - this.countFailedTests = function() { - return failedTests - }; - this.results = function() { - return results - } -}; -core.PointWalker = function PointWalker(node) { - var currentNode = node, before = null, after = node && node.firstChild, root = node, pos = 0; - function getPosition(node) { - var p = -1, n = node; - while(n) { - n = n.previousSibling; - p += 1 - } - return p - } - this.setPoint = function(node, position) { - currentNode = node; - pos = position; - if(currentNode.nodeType === 3) { - after = null; - before = null - }else { - after = currentNode.firstChild; - while(position) { - position -= 1; - after = after.nextSibling - } - if(after) { - before = after.previousSibling - }else { - before = currentNode.lastChild - } - } - }; - this.stepForward = function() { - var len; - if(currentNode.nodeType === 3) { - if(typeof currentNode.nodeValue.length === "number") { - len = currentNode.nodeValue.length - }else { - len = currentNode.nodeValue.length() - } - if(pos < len) { - pos += 1; - return true - } - } - if(after) { - if(after.nodeType === 1) { - currentNode = after; - before = null; - after = currentNode.firstChild; - pos = 0 - }else { - if(after.nodeType === 3) { - currentNode = after; - before = null; - after = null; - pos = 0 - }else { - before = after; - after = after.nextSibling; - pos += 1 - } - } - return true - } - if(currentNode !== root) { - before = currentNode; - after = before.nextSibling; - currentNode = currentNode.parentNode; - pos = getPosition(before) + 1; - return true - } - return false - }; - this.stepBackward = function() { - if(currentNode.nodeType === 3) { - if(pos > 0) { - pos -= 1; - return true - } - } - if(before) { - if(before.nodeType === 1) { - currentNode = before; - before = currentNode.lastChild; - after = null; - pos = getPosition(before) + 1 - }else { - if(before.nodeType === 3) { - currentNode = before; - before = null; - after = null; - if(typeof currentNode.nodeValue.length === "number") { - pos = currentNode.nodeValue.length - }else { - pos = currentNode.nodeValue.length() - } - }else { - after = before; - before = before.previousSibling; - pos -= 1 - } - } - return true - } - if(currentNode !== root) { - after = currentNode; - before = after.previousSibling; - currentNode = currentNode.parentNode; - pos = getPosition(after); - return true - } - return false - }; - this.node = function() { - return currentNode - }; - this.position = function() { - return pos - }; - this.precedingSibling = function() { - return before - }; - this.followingSibling = function() { - return after - } -}; -core.Async = function Async() { - this.forEach = function(items, f, callback) { - var i, l = items.length, itemsDone = 0; - function end(err) { - if(itemsDone !== l) { - if(err) { - itemsDone = l; - callback(err) - }else { - itemsDone += 1; - if(itemsDone === l) { - callback(null) - } - } - } - } - for(i = 0;i < l;i += 1) { - f(items[i], end) - } - } -}; -runtime.loadClass("core.RawInflate"); -runtime.loadClass("core.ByteArray"); -runtime.loadClass("core.ByteArrayWriter"); -runtime.loadClass("core.Base64"); -core.Zip = function Zip(url, entriesReadCallback) { - var entries, filesize, nEntries, inflate = (new core.RawInflate).inflate, zip = this, base64 = new core.Base64; - function crc32(data) { - var table = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, - 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, - 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, - 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, - 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, - 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918E3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117], crc = - 0, i, iTop = data.length, x = 0, y = 0; - crc = crc ^ -1; - for(i = 0;i < iTop;i += 1) { - y = (crc ^ data[i]) & 255; - x = table[y]; - crc = crc >>> 8 ^ x - } - return crc ^ -1 - } - function dosTime2Date(dostime) { - var year = (dostime >> 25 & 127) + 1980, month = (dostime >> 21 & 15) - 1, mday = dostime >> 16 & 31, hour = dostime >> 11 & 15, min = dostime >> 5 & 63, sec = (dostime & 31) << 1, d = new Date(year, month, mday, hour, min, sec); - return d - } - function date2DosTime(date) { - var y = date.getFullYear(); - return y < 1980 ? 0 : y - 1980 << 25 | date.getMonth() + 1 << 21 | date.getDate() << 16 | date.getHours() << 11 | date.getMinutes() << 5 | date.getSeconds() >> 1 - } - function ZipEntry(url, stream) { - var sig, namelen, extralen, commentlen, compressionMethod, compressedSize, uncompressedSize, offset, crc, entry = this; - function handleEntryData(data, callback) { - var stream = new core.ByteArray(data), sig = stream.readUInt32LE(), filenamelen, extralen; - if(sig !== 67324752) { - callback("File entry signature is wrong." + sig.toString() + " " + data.length.toString(), null); - return - } - stream.pos += 22; - filenamelen = stream.readUInt16LE(); - extralen = stream.readUInt16LE(); - stream.pos += filenamelen + extralen; - if(compressionMethod) { - data = data.slice(stream.pos, stream.pos + compressedSize); - if(compressedSize !== data.length) { - callback("The amount of compressed bytes read was " + data.length.toString() + " instead of " + compressedSize.toString() + " for " + entry.filename + " in " + url + ".", null); - return - } - data = inflate(data, uncompressedSize) - }else { - data = data.slice(stream.pos, stream.pos + uncompressedSize) - } - if(uncompressedSize !== data.length) { - callback("The amount of bytes read was " + data.length.toString() + " instead of " + uncompressedSize.toString() + " for " + entry.filename + " in " + url + ".", null); - return - } - entry.data = data; - callback(null, data) - } - function load(callback) { - if(entry.data !== undefined) { - callback(null, entry.data); - return - } - var size = compressedSize + 34 + namelen + extralen + 256; - if(size + offset > filesize) { - size = filesize - offset - } - runtime.read(url, offset, size, function(err, data) { - if(err) { - callback(err, data) - }else { - handleEntryData(data, callback) - } - }) - } - this.load = load; - function set(filename, data, compressed, date) { - entry.filename = filename; - entry.data = data; - entry.compressed = compressed; - entry.date = date - } - this.set = set; - this.error = null; - if(!stream) { - return - } - sig = stream.readUInt32LE(); - if(sig !== 33639248) { - this.error = "Central directory entry has wrong signature at position " + (stream.pos - 4).toString() + ' for file "' + url + '": ' + stream.data.length.toString(); - return - } - stream.pos += 6; - compressionMethod = stream.readUInt16LE(); - this.date = dosTime2Date(stream.readUInt32LE()); - crc = stream.readUInt32LE(); - compressedSize = stream.readUInt32LE(); - uncompressedSize = stream.readUInt32LE(); - namelen = stream.readUInt16LE(); - extralen = stream.readUInt16LE(); - commentlen = stream.readUInt16LE(); - stream.pos += 8; - offset = stream.readUInt32LE(); - this.filename = runtime.byteArrayToString(stream.data.slice(stream.pos, stream.pos + namelen), "utf8"); - stream.pos += namelen + extralen + commentlen - } - function handleCentralDirectory(data, callback) { - var stream = new core.ByteArray(data), i, e; - entries = []; - for(i = 0;i < nEntries;i += 1) { - e = new ZipEntry(url, stream); - if(e.error) { - callback(e.error, zip); - return - } - entries[entries.length] = e - } - callback(null, zip) - } - function handleCentralDirectoryEnd(data, callback) { - if(data.length !== 22) { - callback("Central directory length should be 22.", zip); - return - } - var stream = new core.ByteArray(data), sig, disk, cddisk, diskNEntries, cdsSize, cdsOffset; - sig = stream.readUInt32LE(); - if(sig !== 101010256) { - callback("Central directory signature is wrong: " + sig.toString(), zip); - return - } - disk = stream.readUInt16LE(); - if(disk !== 0) { - callback("Zip files with non-zero disk numbers are not supported.", zip); - return - } - cddisk = stream.readUInt16LE(); - if(cddisk !== 0) { - callback("Zip files with non-zero disk numbers are not supported.", zip); - return - } - diskNEntries = stream.readUInt16LE(); - nEntries = stream.readUInt16LE(); - if(diskNEntries !== nEntries) { - callback("Number of entries is inconsistent.", zip); - return - } - cdsSize = stream.readUInt32LE(); - cdsOffset = stream.readUInt16LE(); - cdsOffset = filesize - 22 - cdsSize; - runtime.read(url, cdsOffset, filesize - cdsOffset, function(err, data) { - handleCentralDirectory(data, callback) - }) - } - function load(filename, callback) { - var entry = null, end = filesize, e, i; - for(i = 0;i < entries.length;i += 1) { - e = entries[i]; - if(e.filename === filename) { - entry = e; - break - } - } - if(entry) { - if(entry.data) { - callback(null, entry.data) - }else { - entry.load(callback) - } - }else { - callback(filename + " not found.", null) - } - } - function loadAsString(filename, callback) { - load(filename, function(err, data) { - if(err) { - return callback(err, null) - } - data = runtime.byteArrayToString(data, "utf8"); - callback(null, data) - }) - } - function loadContentXmlAsFragments(filename, handler) { - loadAsString(filename, function(err, data) { - if(err) { - return handler.rootElementReady(err) - } - handler.rootElementReady(null, data, true) - }) - } - function loadAsDataURL(filename, mimetype, callback) { - load(filename, function(err, data) { - if(err) { - return callback(err, null) - } - var p = data, chunksize = 45E3, i = 0, url; - if(!mimetype) { - if(p[1] === 80 && p[2] === 78 && p[3] === 71) { - mimetype = "image/png" - }else { - if(p[0] === 255 && p[1] === 216 && p[2] === 255) { - mimetype = "image/jpeg" - }else { - if(p[0] === 71 && p[1] === 73 && p[2] === 70) { - mimetype = "image/gif" - }else { - mimetype = "" - } - } - } - } - url = "data:" + mimetype + ";base64,"; - while(i < data.length) { - url += base64.convertUTF8ArrayToBase64(p.slice(i, Math.min(i + chunksize, p.length))); - i += chunksize - } - callback(null, url) - }) - } - function loadAsDOM(filename, callback) { - loadAsString(filename, function(err, xmldata) { - if(err) { - callback(err, null); - return - } - var parser = new DOMParser; - xmldata = parser.parseFromString(xmldata, "text/xml"); - callback(null, xmldata) - }) - } - function save(filename, data, compressed, date) { - var i, entry; - for(i = 0;i < entries.length;i += 1) { - entry = entries[i]; - if(entry.filename === filename) { - entry.set(filename, data, compressed, date); - return - } - } - entry = new ZipEntry(url); - entry.set(filename, data, compressed, date); - entries.push(entry) - } - function writeEntry(entry) { - var data = new core.ByteArrayWriter("utf8"), length = 0; - data.appendArray([80, 75, 3, 4, 20, 0, 0, 0, 0, 0]); - if(entry.data) { - length = entry.data.length - } - data.appendUInt32LE(date2DosTime(entry.date)); - data.appendUInt32LE(crc32(entry.data)); - data.appendUInt32LE(length); - data.appendUInt32LE(length); - data.appendUInt16LE(entry.filename.length); - data.appendUInt16LE(0); - data.appendString(entry.filename); - if(entry.data) { - data.appendByteArray(entry.data) - } - return data - } - function writeCODEntry(entry, offset) { - var data = new core.ByteArrayWriter("utf8"), length = 0; - data.appendArray([80, 75, 1, 2, 20, 0, 20, 0, 0, 0, 0, 0]); - if(entry.data) { - length = entry.data.length - } - data.appendUInt32LE(date2DosTime(entry.date)); - data.appendUInt32LE(crc32(entry.data)); - data.appendUInt32LE(length); - data.appendUInt32LE(length); - data.appendUInt16LE(entry.filename.length); - data.appendArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - data.appendUInt32LE(offset); - data.appendString(entry.filename); - return data - } - function loadAllEntries(position, callback) { - if(position === entries.length) { - callback(null); - return - } - var entry = entries[position]; - if(entry.data !== undefined) { - loadAllEntries(position + 1, callback); - return - } - entry.load(function(err) { - if(err) { - callback(err); - return - } - loadAllEntries(position + 1, callback) - }) - } - function write(callback) { - loadAllEntries(0, function(err) { - if(err) { - callback(err); - return - } - var data = new core.ByteArrayWriter("utf8"), i, e, codoffset, codsize, offsets = [0]; - for(i = 0;i < entries.length;i += 1) { - data.appendByteArrayWriter(writeEntry(entries[i])); - offsets.push(data.getLength()) - } - codoffset = data.getLength(); - for(i = 0;i < entries.length;i += 1) { - e = entries[i]; - data.appendByteArrayWriter(writeCODEntry(e, offsets[i])) - } - codsize = data.getLength() - codoffset; - data.appendArray([80, 75, 5, 6, 0, 0, 0, 0]); - data.appendUInt16LE(entries.length); - data.appendUInt16LE(entries.length); - data.appendUInt32LE(codsize); - data.appendUInt32LE(codoffset); - data.appendArray([0, 0]); - runtime.writeFile(url, data.getByteArray(), callback) - }) - } - this.load = load; - this.save = save; - this.write = write; - this.loadContentXmlAsFragments = loadContentXmlAsFragments; - this.loadAsString = loadAsString; - this.loadAsDOM = loadAsDOM; - this.loadAsDataURL = loadAsDataURL; - this.getEntries = function() { - return entries.slice() - }; - filesize = -1; - if(entriesReadCallback === null) { - entries = []; - return - } - runtime.getFileSize(url, function(size) { - filesize = size; - if(filesize < 0) { - entriesReadCallback("File '" + url + "' cannot be read.", zip) - }else { - runtime.read(url, filesize - 22, 22, function(err, data) { - if(err || entriesReadCallback === null) { - entriesReadCallback(err, zip) - }else { - handleCentralDirectoryEnd(data, entriesReadCallback) - } - }) - } - }) -}; -xmldom.LSSerializerFilter = function LSSerializerFilter() { -}; -if(typeof Object.create !== "function") { - Object["create"] = function(o) { - var F = function() { - }; - F.prototype = o; - return new F - } -} -xmldom.LSSerializer = function LSSerializer() { - var self = this; - function serializeAttribute(prefix, attr) { - var s = prefix + attr.localName + '="' + attr.nodeValue + '"'; - return s - } - function attributePrefix(nsmap, prefix, ns) { - if(nsmap.hasOwnProperty(ns)) { - return nsmap[ns] + ":" - } - if(nsmap[ns] !== prefix) { - nsmap[ns] = prefix - } - return prefix + ":" - } - function startNode(nsmap, node) { - var s = "", atts = node.attributes, length, i, attr, attstr = "", accept, prefix; - if(atts) { - if(nsmap[node.namespaceURI] !== node.prefix) { - nsmap[node.namespaceURI] = node.prefix - } - s += "<" + node.nodeName; - length = atts.length; - for(i = 0;i < length;i += 1) { - attr = atts.item(i); - if(attr.namespaceURI !== "http://www.w3.org/2000/xmlns/") { - accept = self.filter ? self.filter.acceptNode(attr) : 1; - if(accept === 1) { - if(attr.namespaceURI) { - prefix = attributePrefix(nsmap, attr.prefix, attr.namespaceURI) - }else { - prefix = "" - } - attstr += " " + serializeAttribute(prefix, attr) - } - } - } - for(i in nsmap) { - if(nsmap.hasOwnProperty(i)) { - prefix = nsmap[i]; - if(!prefix) { - s += ' xmlns="' + i + '"' - }else { - if(prefix !== "xmlns") { - s += " xmlns:" + nsmap[i] + '="' + i + '"' - } - } - } - } - s += attstr + ">" - } - return s - } - function endNode(node) { - var s = ""; - if(node.nodeType === 1) { - s += "" - } - return s - } - function serializeNode(parentnsmap, node) { - var s = "", nsmap = Object.create(parentnsmap), accept = self.filter ? self.filter.acceptNode(node) : 1, child; - if(accept === 1) { - s += startNode(nsmap, node) - } - if(accept === 1 || accept === 3) { - child = node.firstChild; - while(child) { - s += serializeNode(nsmap, child); - child = child.nextSibling - } - if(node.nodeValue) { - s += node.nodeValue - } - } - if(accept === 1) { - s += endNode(node) - } - return s - } - function invertMap(map) { - var m = {}, i; - for(i in map) { - if(map.hasOwnProperty(i)) { - m[map[i]] = i - } - } - return m - } - this.filter = null; - this.writeToString = function(node, nsmap) { - if(!node) { - return"" - } - nsmap = nsmap ? invertMap(nsmap) : {}; - return serializeNode(nsmap, node) - } -}; -xmldom.RelaxNGParser = function RelaxNGParser() { - var self = this, rngns = "http://relaxng.org/ns/structure/1.0", xmlnsns = "http://www.w3.org/2000/xmlns/", start, nsmap = {"http://www.w3.org/XML/1998/namespace":"xml"}, parse; - function RelaxNGParseError(error, context) { - this.message = function() { - if(context) { - error += context.nodeType === 1 ? " Element " : " Node "; - error += context.nodeName; - if(context.nodeValue) { - error += " with value '" + context.nodeValue + "'" - } - error += "." - } - return error - } - } - function splitToDuos(e) { - if(e.e.length <= 2) { - return e - } - var o = {name:e.name, e:e.e.slice(0, 2)}; - return splitToDuos({name:e.name, e:[o].concat(e.e.slice(2))}) - } - function splitQName(name) { - var r = name.split(":", 2), prefix = "", i; - if(r.length === 1) { - r = ["", r[0]] - }else { - prefix = r[0] - } - for(i in nsmap) { - if(nsmap[i] === prefix) { - r[0] = i - } - } - return r - } - function splitQNames(def) { - var i, l = def.names ? def.names.length : 0, name, localnames = def.localnames = [l], namespaces = def.namespaces = [l]; - for(i = 0;i < l;i += 1) { - name = splitQName(def.names[i]); - namespaces[i] = name[0]; - localnames[i] = name[1] - } - } - function trim(str) { - str = str.replace(/^\s\s*/, ""); - var ws = /\s/, i = str.length - 1; - while(ws.test(str.charAt(i))) { - i -= 1 - } - return str.slice(0, i + 1) - } - function copyAttributes(atts, name, names) { - var a = {}, i, att; - for(i = 0;i < atts.length;i += 1) { - att = atts.item(i); - if(!att.namespaceURI) { - if(att.localName === "name" && (name === "element" || name === "attribute")) { - names.push(att.value) - } - if(att.localName === "name" || att.localName === "combine" || att.localName === "type") { - att.value = trim(att.value) - } - a[att.localName] = att.value - }else { - if(att.namespaceURI === xmlnsns) { - nsmap[att.value] = att.localName - } - } - } - return a - } - function parseChildren(c, e, elements, names) { - var text = "", ce; - while(c) { - if(c.nodeType === 1 && c.namespaceURI === rngns) { - ce = parse(c, elements, e); - if(ce) { - if(ce.name === "name") { - names.push(nsmap[ce.a.ns] + ":" + ce.text); - e.push(ce) - }else { - if(ce.name === "choice" && ce.names && ce.names.length) { - names = names.concat(ce.names); - delete ce.names; - e.push(ce) - }else { - e.push(ce) - } - } - } - }else { - if(c.nodeType === 3) { - text += c.nodeValue - } - } - c = c.nextSibling - } - return text - } - function combineDefines(combine, name, e, siblings) { - var i, ce; - for(i = 0;siblings && i < siblings.length;i += 1) { - ce = siblings[i]; - if(ce.name === "define" && ce.a && ce.a.name === name) { - ce.e = [{name:combine, e:ce.e.concat(e)}]; - return ce - } - } - return null - } - parse = function parse(element, elements, siblings) { - var e = [], a, ce, i, text, name = element.localName, names = []; - a = copyAttributes(element.attributes, name, names); - a.combine = a.combine || undefined; - text = parseChildren(element.firstChild, e, elements, names); - if(name !== "value" && name !== "param") { - text = /^\s*([\s\S]*\S)?\s*$/.exec(text)[1] - } - if(name === "value" && a.type === undefined) { - a.type = "token"; - a.datatypeLibrary = "" - } - if((name === "attribute" || name === "element") && a.name !== undefined) { - i = splitQName(a.name); - e = [{name:"name", text:i[1], a:{ns:i[0]}}].concat(e); - delete a.name - } - if(name === "name" || name === "nsName" || name === "value") { - if(a.ns === undefined) { - a.ns = "" - } - }else { - delete a.ns - } - if(name === "name") { - i = splitQName(text); - a.ns = i[0]; - text = i[1] - } - if(e.length > 1 && (name === "define" || name === "oneOrMore" || name === "zeroOrMore" || name === "optional" || name === "list" || name === "mixed")) { - e = [{name:"group", e:splitToDuos({name:"group", e:e}).e}] - } - if(e.length > 2 && name === "element") { - e = [e[0]].concat({name:"group", e:splitToDuos({name:"group", e:e.slice(1)}).e}) - } - if(e.length === 1 && name === "attribute") { - e.push({name:"text", text:text}) - } - if(e.length === 1 && (name === "choice" || name === "group" || name === "interleave")) { - name = e[0].name; - names = e[0].names; - a = e[0].a; - text = e[0].text; - e = e[0].e - }else { - if(e.length > 2 && (name === "choice" || name === "group" || name === "interleave")) { - e = splitToDuos({name:name, e:e}).e - } - } - if(name === "mixed") { - name = "interleave"; - e = [e[0], {name:"text"}] - } - if(name === "optional") { - name = "choice"; - e = [e[0], {name:"empty"}] - } - if(name === "zeroOrMore") { - name = "choice"; - e = [{name:"oneOrMore", e:[e[0]]}, {name:"empty"}] - } - if(name === "define" && a.combine) { - ce = combineDefines(a.combine, a.name, e, siblings); - if(ce) { - return - } - } - ce = {name:name}; - if(e && e.length > 0) { - ce.e = e - } - for(i in a) { - if(a.hasOwnProperty(i)) { - ce.a = a; - break - } - } - if(text !== undefined) { - ce.text = text - } - if(names && names.length > 0) { - ce.names = names - } - if(name === "element") { - ce.id = elements.length; - elements.push(ce); - ce = {name:"elementref", id:ce.id} - } - return ce - }; - function resolveDefines(def, defines) { - var i = 0, e, defs, end, name = def.name; - while(def.e && i < def.e.length) { - e = def.e[i]; - if(e.name === "ref") { - defs = defines[e.a.name]; - if(!defs) { - throw e.a.name + " was not defined."; - } - end = def.e.slice(i + 1); - def.e = def.e.slice(0, i); - def.e = def.e.concat(defs.e); - def.e = def.e.concat(end) - }else { - i += 1; - resolveDefines(e, defines) - } - } - e = def.e; - if(name === "choice") { - if(!e || !e[1] || e[1].name === "empty") { - if(!e || !e[0] || e[0].name === "empty") { - delete def.e; - def.name = "empty" - }else { - e[1] = e[0]; - e[0] = {name:"empty"} - } - } - } - if(name === "group" || name === "interleave") { - if(e[0].name === "empty") { - if(e[1].name === "empty") { - delete def.e; - def.name = "empty" - }else { - name = def.name = e[1].name; - def.names = e[1].names; - e = def.e = e[1].e - } - }else { - if(e[1].name === "empty") { - name = def.name = e[0].name; - def.names = e[0].names; - e = def.e = e[0].e - } - } - } - if(name === "oneOrMore" && e[0].name === "empty") { - delete def.e; - def.name = "empty" - } - if(name === "attribute") { - splitQNames(def) - } - if(name === "interleave") { - if(e[0].name === "interleave") { - if(e[1].name === "interleave") { - e = def.e = e[0].e.concat(e[1].e) - }else { - e = def.e = [e[1]].concat(e[0].e) - } - }else { - if(e[1].name === "interleave") { - e = def.e = [e[0]].concat(e[1].e) - } - } - } - } - function resolveElements(def, elements) { - var i = 0, e, name; - while(def.e && i < def.e.length) { - e = def.e[i]; - if(e.name === "elementref") { - e.id = e.id || 0; - def.e[i] = elements[e.id] - }else { - if(e.name !== "element") { - resolveElements(e, elements) - } - } - i += 1 - } - } - function main(dom, callback) { - var elements = [], grammar = parse(dom && dom.documentElement, elements, undefined), i, e, defines = {}; - for(i = 0;i < grammar.e.length;i += 1) { - e = grammar.e[i]; - if(e.name === "define") { - defines[e.a.name] = e - }else { - if(e.name === "start") { - start = e - } - } - } - if(!start) { - return[new RelaxNGParseError("No Relax NG start element was found.")] - } - resolveDefines(start, defines); - for(i in defines) { - if(defines.hasOwnProperty(i)) { - resolveDefines(defines[i], defines) - } - } - for(i = 0;i < elements.length;i += 1) { - resolveDefines(elements[i], defines) - } - if(callback) { - self.rootPattern = callback(start.e[0], elements) - } - resolveElements(start, elements); - for(i = 0;i < elements.length;i += 1) { - resolveElements(elements[i], elements) - } - self.start = start; - self.elements = elements; - self.nsmap = nsmap; - return null - } - this.parseRelaxNGDOM = main -}; -runtime.loadClass("xmldom.RelaxNGParser"); -xmldom.RelaxNG = function RelaxNG() { - var xmlnsns = "http://www.w3.org/2000/xmlns/", createChoice, createInterleave, createGroup, createAfter, createOneOrMore, createValue, createAttribute, createNameClass, createData, makePattern, notAllowed = {type:"notAllowed", nullable:false, hash:"notAllowed", textDeriv:function() { - return notAllowed - }, startTagOpenDeriv:function() { - return notAllowed - }, attDeriv:function() { - return notAllowed - }, startTagCloseDeriv:function() { - return notAllowed - }, endTagDeriv:function() { - return notAllowed - }}, empty = {type:"empty", nullable:true, hash:"empty", textDeriv:function() { - return notAllowed - }, startTagOpenDeriv:function() { - return notAllowed - }, attDeriv:function(context, attribute) { - return notAllowed - }, startTagCloseDeriv:function() { - return empty - }, endTagDeriv:function() { - return notAllowed - }}, text = {type:"text", nullable:true, hash:"text", textDeriv:function() { - return text - }, startTagOpenDeriv:function() { - return notAllowed - }, attDeriv:function() { - return notAllowed - }, startTagCloseDeriv:function() { - return text - }, endTagDeriv:function() { - return notAllowed - }}, applyAfter, childDeriv, rootPattern; - function memoize0arg(func) { - return function() { - var cache; - return function() { - if(cache === undefined) { - cache = func() - } - return cache - } - }() - } - function memoize1arg(type, func) { - return function() { - var cache = {}, cachecount = 0; - return function(a) { - var ahash = a.hash || a.toString(), v; - v = cache[ahash]; - if(v !== undefined) { - return v - } - cache[ahash] = v = func(a); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v - } - }() - } - function memoizeNode(func) { - return function() { - var cache = {}; - return function(node) { - var v, m; - m = cache[node.localName]; - if(m === undefined) { - cache[node.localName] = m = {} - }else { - v = m[node.namespaceURI]; - if(v !== undefined) { - return v - } - } - m[node.namespaceURI] = v = func(node); - return v - } - }() - } - function memoize2arg(type, fastfunc, func) { - return function() { - var cache = {}, cachecount = 0; - return function(a, b) { - var v = fastfunc && fastfunc(a, b), ahash, bhash, m; - if(v !== undefined) { - return v - } - ahash = a.hash || a.toString(); - bhash = b.hash || b.toString(); - m = cache[ahash]; - if(m === undefined) { - cache[ahash] = m = {} - }else { - v = m[bhash]; - if(v !== undefined) { - return v - } - } - m[bhash] = v = func(a, b); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v - } - }() - } - function unorderedMemoize2arg(type, fastfunc, func) { - return function() { - var cache = {}, cachecount = 0; - return function(a, b) { - var v = fastfunc && fastfunc(a, b), ahash, bhash, m; - if(v !== undefined) { - return v - } - ahash = a.hash || a.toString(); - bhash = b.hash || b.toString(); - if(ahash < bhash) { - m = ahash; - ahash = bhash; - bhash = m; - m = a; - a = b; - b = m - } - m = cache[ahash]; - if(m === undefined) { - cache[ahash] = m = {} - }else { - v = m[bhash]; - if(v !== undefined) { - return v - } - } - m[bhash] = v = func(a, b); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v - } - }() - } - function getUniqueLeaves(leaves, pattern) { - if(pattern.p1.type === "choice") { - getUniqueLeaves(leaves, pattern.p1) - }else { - leaves[pattern.p1.hash] = pattern.p1 - } - if(pattern.p2.type === "choice") { - getUniqueLeaves(leaves, pattern.p2) - }else { - leaves[pattern.p2.hash] = pattern.p2 - } - } - createChoice = memoize2arg("choice", function(p1, p2) { - if(p1 === notAllowed) { - return p2 - } - if(p2 === notAllowed) { - return p1 - } - if(p1 === p2) { - return p1 - } - }, function(p1, p2) { - function makeChoice(p1, p2) { - return{type:"choice", p1:p1, p2:p2, nullable:p1.nullable || p2.nullable, textDeriv:function(context, text) { - return createChoice(p1.textDeriv(context, text), p2.textDeriv(context, text)) - }, startTagOpenDeriv:memoizeNode(function(node) { - return createChoice(p1.startTagOpenDeriv(node), p2.startTagOpenDeriv(node)) - }), attDeriv:function(context, attribute) { - return createChoice(p1.attDeriv(context, attribute), p2.attDeriv(context, attribute)) - }, startTagCloseDeriv:memoize0arg(function() { - return createChoice(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) - }), endTagDeriv:memoize0arg(function() { - return createChoice(p1.endTagDeriv(), p2.endTagDeriv()) - })} - } - var leaves = {}, i; - getUniqueLeaves(leaves, {p1:p1, p2:p2}); - p1 = undefined; - p2 = undefined; - for(i in leaves) { - if(leaves.hasOwnProperty(i)) { - if(p1 === undefined) { - p1 = leaves[i] - }else { - if(p2 === undefined) { - p2 = leaves[i] - }else { - p2 = createChoice(p2, leaves[i]) - } - } - } - } - return makeChoice(p1, p2) - }); - createInterleave = unorderedMemoize2arg("interleave", function(p1, p2) { - if(p1 === notAllowed || p2 === notAllowed) { - return notAllowed - } - if(p1 === empty) { - return p2 - } - if(p2 === empty) { - return p1 - } - }, function(p1, p2) { - return{type:"interleave", p1:p1, p2:p2, nullable:p1.nullable && p2.nullable, textDeriv:function(context, text) { - return createChoice(createInterleave(p1.textDeriv(context, text), p2), createInterleave(p1, p2.textDeriv(context, text))) - }, startTagOpenDeriv:memoizeNode(function(node) { - return createChoice(applyAfter(function(p) { - return createInterleave(p, p2) - }, p1.startTagOpenDeriv(node)), applyAfter(function(p) { - return createInterleave(p1, p) - }, p2.startTagOpenDeriv(node))) - }), attDeriv:function(context, attribute) { - return createChoice(createInterleave(p1.attDeriv(context, attribute), p2), createInterleave(p1, p2.attDeriv(context, attribute))) - }, startTagCloseDeriv:memoize0arg(function() { - return createInterleave(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) - })} - }); - createGroup = memoize2arg("group", function(p1, p2) { - if(p1 === notAllowed || p2 === notAllowed) { - return notAllowed - } - if(p1 === empty) { - return p2 - } - if(p2 === empty) { - return p1 - } - }, function(p1, p2) { - return{type:"group", p1:p1, p2:p2, nullable:p1.nullable && p2.nullable, textDeriv:function(context, text) { - var p = createGroup(p1.textDeriv(context, text), p2); - if(p1.nullable) { - return createChoice(p, p2.textDeriv(context, text)) - } - return p - }, startTagOpenDeriv:function(node) { - var x = applyAfter(function(p) { - return createGroup(p, p2) - }, p1.startTagOpenDeriv(node)); - if(p1.nullable) { - return createChoice(x, p2.startTagOpenDeriv(node)) - } - return x - }, attDeriv:function(context, attribute) { - return createChoice(createGroup(p1.attDeriv(context, attribute), p2), createGroup(p1, p2.attDeriv(context, attribute))) - }, startTagCloseDeriv:memoize0arg(function() { - return createGroup(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) - })} - }); - createAfter = memoize2arg("after", function(p1, p2) { - if(p1 === notAllowed || p2 === notAllowed) { - return notAllowed - } - }, function(p1, p2) { - return{type:"after", p1:p1, p2:p2, nullable:false, textDeriv:function(context, text) { - return createAfter(p1.textDeriv(context, text), p2) - }, startTagOpenDeriv:memoizeNode(function(node) { - return applyAfter(function(p) { - return createAfter(p, p2) - }, p1.startTagOpenDeriv(node)) - }), attDeriv:function(context, attribute) { - return createAfter(p1.attDeriv(context, attribute), p2) - }, startTagCloseDeriv:memoize0arg(function() { - return createAfter(p1.startTagCloseDeriv(), p2) - }), endTagDeriv:memoize0arg(function() { - return p1.nullable ? p2 : notAllowed - })} - }); - createOneOrMore = memoize1arg("oneormore", function(p) { - if(p === notAllowed) { - return notAllowed - } - return{type:"oneOrMore", p:p, nullable:p.nullable, textDeriv:function(context, text) { - return createGroup(p.textDeriv(context, text), createChoice(this, empty)) - }, startTagOpenDeriv:function(node) { - var oneOrMore = this; - return applyAfter(function(pf) { - return createGroup(pf, createChoice(oneOrMore, empty)) - }, p.startTagOpenDeriv(node)) - }, attDeriv:function(context, attribute) { - var oneOrMore = this; - return createGroup(p.attDeriv(context, attribute), createChoice(oneOrMore, empty)) - }, startTagCloseDeriv:memoize0arg(function() { - return createOneOrMore(p.startTagCloseDeriv()) - })} - }); - function createElement(nc, p) { - return{type:"element", nc:nc, nullable:false, textDeriv:function() { - return notAllowed - }, startTagOpenDeriv:function(node) { - if(nc.contains(node)) { - return createAfter(p, empty) - } - return notAllowed - }, attDeriv:function(context, attribute) { - return notAllowed - }, startTagCloseDeriv:function() { - return this - }} - } - function valueMatch(context, pattern, text) { - return pattern.nullable && /^\s+$/.test(text) || pattern.textDeriv(context, text).nullable - } - createAttribute = memoize2arg("attribute", undefined, function(nc, p) { - return{type:"attribute", nullable:false, nc:nc, p:p, attDeriv:function(context, attribute) { - if(nc.contains(attribute) && valueMatch(context, p, attribute.nodeValue)) { - return empty - } - return notAllowed - }, startTagCloseDeriv:function() { - return notAllowed - }} - }); - function createList() { - return{type:"list", nullable:false, hash:"list", textDeriv:function(context, text) { - return empty - }} - } - createValue = memoize1arg("value", function(value) { - return{type:"value", nullable:false, value:value, textDeriv:function(context, text) { - return text === value ? empty : notAllowed - }, attDeriv:function() { - return notAllowed - }, startTagCloseDeriv:function() { - return this - }} - }); - createData = memoize1arg("data", function(type) { - return{type:"data", nullable:false, dataType:type, textDeriv:function() { - return empty - }, attDeriv:function() { - return notAllowed - }, startTagCloseDeriv:function() { - return this - }} - }); - function createDataExcept() { - return{type:"dataExcept", nullable:false, hash:"dataExcept"} - } - applyAfter = function applyAfter(f, p) { - var result; - if(p.type === "after") { - result = createAfter(p.p1, f(p.p2)) - }else { - if(p.type === "choice") { - result = createChoice(applyAfter(f, p.p1), applyAfter(f, p.p2)) - }else { - result = p - } - } - return result - }; - function attsDeriv(context, pattern, attributes, position) { - if(pattern === notAllowed) { - return notAllowed - } - if(position >= attributes.length) { - return pattern - } - if(position === 0) { - position = 0 - } - var a = attributes.item(position); - while(a.namespaceURI === xmlnsns) { - position += 1; - if(position >= attributes.length) { - return pattern - } - a = attributes.item(position) - } - a = attsDeriv(context, pattern.attDeriv(context, attributes.item(position)), attributes, position + 1); - return a - } - function childrenDeriv(context, pattern, walker) { - var element = walker.currentNode, childNode = walker.firstChild(), numberOfTextNodes = 0, childNodes = [], i, p; - while(childNode) { - if(childNode.nodeType === 1) { - childNodes.push(childNode) - }else { - if(childNode.nodeType === 3 && !/^\s*$/.test(childNode.nodeValue)) { - childNodes.push(childNode.nodeValue); - numberOfTextNodes += 1 - } - } - childNode = walker.nextSibling() - } - if(childNodes.length === 0) { - childNodes = [""] - } - p = pattern; - for(i = 0;p !== notAllowed && i < childNodes.length;i += 1) { - childNode = childNodes[i]; - if(typeof childNode === "string") { - if(/^\s*$/.test(childNode)) { - p = createChoice(p, p.textDeriv(context, childNode)) - }else { - p = p.textDeriv(context, childNode) - } - }else { - walker.currentNode = childNode; - p = childDeriv(context, p, walker) - } - } - walker.currentNode = element; - return p - } - childDeriv = function childDeriv(context, pattern, walker) { - var childNode = walker.currentNode, p; - p = pattern.startTagOpenDeriv(childNode); - p = attsDeriv(context, p, childNode.attributes, 0); - p = p.startTagCloseDeriv(); - p = childrenDeriv(context, p, walker); - p = p.endTagDeriv(); - return p - }; - function addNames(name, ns, pattern) { - if(pattern.e[0].a) { - name.push(pattern.e[0].text); - ns.push(pattern.e[0].a.ns) - }else { - addNames(name, ns, pattern.e[0]) - } - if(pattern.e[1].a) { - name.push(pattern.e[1].text); - ns.push(pattern.e[1].a.ns) - }else { - addNames(name, ns, pattern.e[1]) - } - } - createNameClass = function createNameClass(pattern) { - var name, ns, hash, i, result; - if(pattern.name === "name") { - name = pattern.text; - ns = pattern.a.ns; - result = {name:name, ns:ns, hash:"{" + ns + "}" + name, contains:function(node) { - return node.namespaceURI === ns && node.localName === name - }} - }else { - if(pattern.name === "choice") { - name = []; - ns = []; - addNames(name, ns, pattern); - hash = ""; - for(i = 0;i < name.length;i += 1) { - hash += "{" + ns[i] + "}" + name[i] + "," - } - result = {hash:hash, contains:function(node) { - var i; - for(i = 0;i < name.length;i += 1) { - if(name[i] === node.localName && ns[i] === node.namespaceURI) { - return true - } - } - return false - }} - }else { - result = {hash:"anyName", contains:function() { - return true - }} - } - } - return result - }; - function resolveElement(pattern, elements) { - var element, p, i, hash; - hash = "element" + pattern.id.toString(); - p = elements[pattern.id] = {hash:hash}; - element = createElement(createNameClass(pattern.e[0]), makePattern(pattern.e[1], elements)); - for(i in element) { - if(element.hasOwnProperty(i)) { - p[i] = element[i] - } - } - return p - } - makePattern = function makePattern(pattern, elements) { - var p, i; - if(pattern.name === "elementref") { - p = pattern.id || 0; - pattern = elements[p]; - if(pattern.name !== undefined) { - return resolveElement(pattern, elements) - } - return pattern - } - switch(pattern.name) { - case "empty": - return empty; - case "notAllowed": - return notAllowed; - case "text": - return text; - case "choice": - return createChoice(makePattern(pattern.e[0], elements), makePattern(pattern.e[1], elements)); - case "interleave": - p = makePattern(pattern.e[0], elements); - for(i = 1;i < pattern.e.length;i += 1) { - p = createInterleave(p, makePattern(pattern.e[i], elements)) - } - return p; - case "group": - return createGroup(makePattern(pattern.e[0], elements), makePattern(pattern.e[1], elements)); - case "oneOrMore": - return createOneOrMore(makePattern(pattern.e[0], elements)); - case "attribute": - return createAttribute(createNameClass(pattern.e[0]), makePattern(pattern.e[1], elements)); - case "value": - return createValue(pattern.text); - case "data": - p = pattern.a && pattern.a.type; - if(p === undefined) { - p = "" - } - return createData(p); - case "list": - return createList() - } - throw"No support for " + pattern.name; - }; - this.makePattern = function(pattern, elements) { - var copy = {}, i; - for(i in elements) { - if(elements.hasOwnProperty(i)) { - copy[i] = elements[i] - } - } - i = makePattern(pattern, copy); - return i - }; - this.validate = function validate(walker, callback) { - var errors; - walker.currentNode = walker.root; - errors = childDeriv(null, rootPattern, walker); - if(!errors.nullable) { - runtime.log("Error in Relax NG validation: " + errors); - callback(["Error in Relax NG validation: " + errors]) - }else { - callback(null) - } - }; - this.init = function init(rootPattern1) { - rootPattern = rootPattern1 - } -}; -runtime.loadClass("xmldom.RelaxNGParser"); -xmldom.RelaxNG2 = function RelaxNG2() { - var start, validateNonEmptyPattern, nsmap, depth = 0, p = " "; - function RelaxNGParseError(error, context) { - this.message = function() { - if(context) { - error += context.nodeType === 1 ? " Element " : " Node "; - error += context.nodeName; - if(context.nodeValue) { - error += " with value '" + context.nodeValue + "'" - } - error += "." - } - return error - } - } - function validateOneOrMore(elementdef, walker, element) { - var node, i = 0, err; - do { - node = walker.currentNode; - err = validateNonEmptyPattern(elementdef.e[0], walker, element); - i += 1 - }while(!err && node !== walker.currentNode); - if(i > 1) { - walker.currentNode = node; - return null - } - return err - } - function qName(node) { - return nsmap[node.namespaceURI] + ":" + node.localName - } - function isWhitespace(node) { - return node && node.nodeType === 3 && /^\s+$/.test(node.nodeValue) - } - function validatePattern(elementdef, walker, element, data) { - if(elementdef.name === "empty") { - return null - } - return validateNonEmptyPattern(elementdef, walker, element, data) - } - function validateAttribute(elementdef, walker, element) { - if(elementdef.e.length !== 2) { - throw"Attribute with wrong # of elements: " + elementdef.e.length; - } - var att, a, l = elementdef.localnames.length, i; - for(i = 0;i < l;i += 1) { - a = element.getAttributeNS(elementdef.namespaces[i], elementdef.localnames[i]); - if(a === "" && !element.hasAttributeNS(elementdef.namespaces[i], elementdef.localnames[i])) { - a = undefined - } - if(att !== undefined && a !== undefined) { - return[new RelaxNGParseError("Attribute defined too often.", element)] - } - att = a - } - if(att === undefined) { - return[new RelaxNGParseError("Attribute not found: " + elementdef.names, element)] - } - return validatePattern(elementdef.e[1], walker, element, att) - } - function validateTop(elementdef, walker, element) { - return validatePattern(elementdef, walker, element) - } - function validateElement(elementdef, walker, element) { - if(elementdef.e.length !== 2) { - throw"Element with wrong # of elements: " + elementdef.e.length; - } - depth += 1; - var node = walker.currentNode, type = node ? node.nodeType : 0, error = null; - while(type > 1) { - if(type !== 8 && (type !== 3 || !/^\s+$/.test(walker.currentNode.nodeValue))) { - depth -= 1; - return[new RelaxNGParseError("Not allowed node of type " + type + ".")] - } - node = walker.nextSibling(); - type = node ? node.nodeType : 0 - } - if(!node) { - depth -= 1; - return[new RelaxNGParseError("Missing element " + elementdef.names)] - } - if(elementdef.names && elementdef.names.indexOf(qName(node)) === -1) { - depth -= 1; - return[new RelaxNGParseError("Found " + node.nodeName + " instead of " + elementdef.names + ".", node)] - } - if(walker.firstChild()) { - error = validateTop(elementdef.e[1], walker, node); - while(walker.nextSibling()) { - type = walker.currentNode.nodeType; - if(!isWhitespace(walker.currentNode) && type !== 8) { - depth -= 1; - return[new RelaxNGParseError("Spurious content.", walker.currentNode)] - } - } - if(walker.parentNode() !== node) { - depth -= 1; - return[new RelaxNGParseError("Implementation error.")] - } - }else { - error = validateTop(elementdef.e[1], walker, node) - } - depth -= 1; - node = walker.nextSibling(); - return error - } - function validateChoice(elementdef, walker, element, data) { - if(elementdef.e.length !== 2) { - throw"Choice with wrong # of options: " + elementdef.e.length; - } - var node = walker.currentNode, err; - if(elementdef.e[0].name === "empty") { - err = validateNonEmptyPattern(elementdef.e[1], walker, element, data); - if(err) { - walker.currentNode = node - } - return null - } - err = validatePattern(elementdef.e[0], walker, element, data); - if(err) { - walker.currentNode = node; - err = validateNonEmptyPattern(elementdef.e[1], walker, element, data) - } - return err - } - function validateInterleave(elementdef, walker, element) { - var l = elementdef.e.length, n = [l], err, i, todo = l, donethisround, node, subnode, e; - while(todo > 0) { - donethisround = 0; - node = walker.currentNode; - for(i = 0;i < l;i += 1) { - subnode = walker.currentNode; - if(n[i] !== true && n[i] !== subnode) { - e = elementdef.e[i]; - err = validateNonEmptyPattern(e, walker, element); - if(err) { - walker.currentNode = subnode; - if(n[i] === undefined) { - n[i] = false - } - }else { - if(subnode === walker.currentNode || e.name === "oneOrMore" || e.name === "choice" && (e.e[0].name === "oneOrMore" || e.e[1].name === "oneOrMore")) { - donethisround += 1; - n[i] = subnode - }else { - donethisround += 1; - n[i] = true - } - } - } - } - if(node === walker.currentNode && donethisround === todo) { - return null - } - if(donethisround === 0) { - for(i = 0;i < l;i += 1) { - if(n[i] === false) { - return[new RelaxNGParseError("Interleave does not match.", element)] - } - } - return null - } - todo = 0; - for(i = 0;i < l;i += 1) { - if(n[i] !== true) { - todo += 1 - } - } - } - return null - } - function validateGroup(elementdef, walker, element) { - if(elementdef.e.length !== 2) { - throw"Group with wrong # of members: " + elementdef.e.length; - } - return validateNonEmptyPattern(elementdef.e[0], walker, element) || validateNonEmptyPattern(elementdef.e[1], walker, element) - } - function validateText(elementdef, walker, element) { - var node = walker.currentNode, type = node ? node.nodeType : 0, error = null; - while(node !== element && type !== 3) { - if(type === 1) { - return[new RelaxNGParseError("Element not allowed here.", node)] - } - node = walker.nextSibling(); - type = node ? node.nodeType : 0 - } - walker.nextSibling(); - return null - } - validateNonEmptyPattern = function validateNonEmptyPattern(elementdef, walker, element, data) { - var name = elementdef.name, err = null; - if(name === "text") { - err = validateText(elementdef, walker, element) - }else { - if(name === "data") { - err = null - }else { - if(name === "value") { - if(data !== elementdef.text) { - err = [new RelaxNGParseError("Wrong value, should be '" + elementdef.text + "', not '" + data + "'", element)] - } - }else { - if(name === "list") { - err = null - }else { - if(name === "attribute") { - err = validateAttribute(elementdef, walker, element) - }else { - if(name === "element") { - err = validateElement(elementdef, walker, element) - }else { - if(name === "oneOrMore") { - err = validateOneOrMore(elementdef, walker, element) - }else { - if(name === "choice") { - err = validateChoice(elementdef, walker, element, data) - }else { - if(name === "group") { - err = validateGroup(elementdef, walker, element) - }else { - if(name === "interleave") { - err = validateInterleave(elementdef, walker, element) - }else { - throw name + " not allowed in nonEmptyPattern."; - } - } - } - } - } - } - } - } - } - } - return err - }; - this.validate = function validate(walker, callback) { - walker.currentNode = walker.root; - var errors = validatePattern(start.e[0], walker, walker.root); - callback(errors) - }; - this.init = function init(start1, nsmap1) { - start = start1; - nsmap = nsmap1 - } -}; -xmldom.OperationalTransformInterface = function() { -}; -xmldom.OperationalTransformInterface.prototype.retain = function(amount) { -}; -xmldom.OperationalTransformInterface.prototype.insertCharacters = function(chars) { -}; -xmldom.OperationalTransformInterface.prototype.insertElementStart = function(tagname, attributes) { -}; -xmldom.OperationalTransformInterface.prototype.insertElementEnd = function() { -}; -xmldom.OperationalTransformInterface.prototype.deleteCharacters = function(amount) { -}; -xmldom.OperationalTransformInterface.prototype.deleteElementStart = function() { -}; -xmldom.OperationalTransformInterface.prototype.deleteElementEnd = function() { -}; -xmldom.OperationalTransformInterface.prototype.replaceAttributes = function(atts) { -}; -xmldom.OperationalTransformInterface.prototype.updateAttributes = function(atts) { -}; -xmldom.OperationalTransformDOM = function OperationalTransformDOM(root, serializer) { - var pos, length; - function retain(amount) { - } - function insertCharacters(chars) { - } - function insertElementStart(tagname, attributes) { - } - function insertElementEnd() { - } - function deleteCharacters(amount) { - } - function deleteElementStart() { - } - function deleteElementEnd() { - } - function replaceAttributes(atts) { - } - function updateAttributes(atts) { - } - function atEnd() { - return pos === length - } - this.retain = retain; - this.insertCharacters = insertCharacters; - this.insertElementStart = insertElementStart; - this.insertElementEnd = insertElementEnd; - this.deleteCharacters = deleteCharacters; - this.deleteElementStart = deleteElementStart; - this.deleteElementEnd = deleteElementEnd; - this.replaceAttributes = replaceAttributes; - this.updateAttributes = updateAttributes; - this.atEnd = atEnd -}; -xmldom.XPath = function() { - var createXPathPathIterator, parsePredicates; - function isSmallestPositive(a, b, c) { - return a !== -1 && (a < b || b === -1) && (a < c || c === -1) - } - function parseXPathStep(xpath, pos, end, steps) { - var location = "", predicates = [], value, brapos = xpath.indexOf("[", pos), slapos = xpath.indexOf("/", pos), eqpos = xpath.indexOf("=", pos), depth = 0, start = 0; - if(isSmallestPositive(slapos, brapos, eqpos)) { - location = xpath.substring(pos, slapos); - pos = slapos + 1 - }else { - if(isSmallestPositive(brapos, slapos, eqpos)) { - location = xpath.substring(pos, brapos); - pos = parsePredicates(xpath, brapos, predicates) - }else { - if(isSmallestPositive(eqpos, slapos, brapos)) { - location = xpath.substring(pos, eqpos); - pos = eqpos - }else { - location = xpath.substring(pos, end); - pos = end - } - } - } - steps.push({location:location, predicates:predicates}); - return pos - } - function parseXPath(xpath) { - var steps = [], p = 0, end = xpath.length, value; - while(p < end) { - p = parseXPathStep(xpath, p, end, steps); - if(p < end && xpath[p] === "=") { - value = xpath.substring(p + 1, end); - if(value.length > 2 && (value[0] === "'" || value[0] === '"')) { - value = value.slice(1, value.length - 1) - }else { - try { - value = parseInt(value, 10) - }catch(e) { - } - } - p = end - } - } - return{steps:steps, value:value} - } - parsePredicates = function parsePredicates(xpath, start, predicates) { - var pos = start, l = xpath.length, selector, depth = 0; - while(pos < l) { - if(xpath[pos] === "]") { - depth -= 1; - if(depth <= 0) { - predicates.push(parseXPath(xpath.substring(start, pos))) - } - }else { - if(xpath[pos] === "[") { - if(depth <= 0) { - start = pos + 1 - } - depth += 1 - } - } - pos += 1 - } - return pos - }; - function XPathIterator() { - } - XPathIterator.prototype.next = function() { - }; - XPathIterator.prototype.reset = function() { - }; - function NodeIterator() { - var node, done = false; - this.setNode = function setNode(n) { - node = n - }; - this.reset = function() { - done = false - }; - this.next = function next() { - var val = done ? null : node; - done = true; - return val - } - } - function AttributeIterator(it, namespace, localName) { - this.reset = function reset() { - it.reset() - }; - this.next = function next() { - var node = it.next(), attr; - while(node) { - node = node.getAttributeNodeNS(namespace, localName); - if(node) { - return node - } - node = it.next() - } - return node - } - } - function AllChildElementIterator(it, recurse) { - var root = it.next(), node = null; - this.reset = function reset() { - it.reset(); - root = it.next(); - node = null - }; - this.next = function next() { - while(root) { - if(node) { - if(recurse && node.firstChild) { - node = node.firstChild - }else { - while(!node.nextSibling && node !== root) { - node = node.parentNode - } - if(node === root) { - root = it.next() - }else { - node = node.nextSibling - } - } - }else { - do { - node = root.firstChild; - if(!node) { - root = it.next() - } - }while(root && !node) - } - if(node && node.nodeType === 1) { - return node - } - } - return null - } - } - function ConditionIterator(it, condition) { - this.reset = function reset() { - it.reset() - }; - this.next = function next() { - var n = it.next(); - while(n && !condition(n)) { - n = it.next() - } - return n - } - } - function createNodenameFilter(it, name, namespaceResolver) { - var s = name.split(":", 2), namespace = namespaceResolver(s[0]), localName = s[1]; - return new ConditionIterator(it, function(node) { - return node.localName === localName && node.namespaceURI === namespace - }) - } - function createPredicateFilteredIterator(it, p, namespaceResolver) { - var nit = new NodeIterator, pit = createXPathPathIterator(nit, p, namespaceResolver), value = p.value; - if(value === undefined) { - return new ConditionIterator(it, function(node) { - nit.setNode(node); - pit.reset(); - return pit.next() - }) - } - return new ConditionIterator(it, function(node) { - nit.setNode(node); - pit.reset(); - var n = pit.next(); - return n && n.nodeValue === value - }) - } - createXPathPathIterator = function createXPathPathIterator(it, xpath, namespaceResolver) { - var i, j, step, location, namespace, localName, prefix, p; - for(i = 0;i < xpath.steps.length;i += 1) { - step = xpath.steps[i]; - location = step.location; - if(location === "") { - it = new AllChildElementIterator(it, false) - }else { - if(location[0] === "@") { - p = location.slice(1).split(":", 2); - it = new AttributeIterator(it, namespaceResolver(p[0]), p[1]) - }else { - if(location !== ".") { - it = new AllChildElementIterator(it, false); - if(location.indexOf(":") !== -1) { - it = createNodenameFilter(it, location, namespaceResolver) - } - } - } - } - for(j = 0;j < step.predicates.length;j += 1) { - p = step.predicates[j]; - it = createPredicateFilteredIterator(it, p, namespaceResolver) - } - } - return it - }; - function fallback(node, xpath, namespaceResolver) { - var it = new NodeIterator, i, nodelist, parsedXPath, pos; - it.setNode(node); - parsedXPath = parseXPath(xpath); - it = createXPathPathIterator(it, parsedXPath, namespaceResolver); - nodelist = []; - i = it.next(); - while(i) { - nodelist.push(i); - i = it.next() - } - return nodelist - } - function getODFElementsWithXPath(node, xpath, namespaceResolver) { - var doc = node.ownerDocument, nodes, elements = [], n = null; - if(!doc || !doc.evaluate || !n) { - elements = fallback(node, xpath, namespaceResolver) - }else { - nodes = doc.evaluate(xpath, node, namespaceResolver, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); - n = nodes.iterateNext(); - while(n !== null) { - if(n.nodeType === 1) { - elements.push(n) - } - n = nodes.iterateNext() - } - } - return elements - } - xmldom.XPath = function XPath() { - this.getODFElementsWithXPath = getODFElementsWithXPath - }; - return xmldom.XPath -}(); -odf.StyleInfo = function StyleInfo() { - var chartns = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0", dbns = "urn:oasis:names:tc:opendocument:xmlns:database:1.0", dr3dns = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", formns = "urn:oasis:names:tc:opendocument:xmlns:form:1.0", numberns = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0", officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", - presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", elementstyles = {"text":[{ens:stylens, en:"tab-stop", ans:stylens, a:"leader-text-style"}, {ens:stylens, en:"drop-cap", ans:stylens, a:"style-name"}, {ens:textns, en:"notes-configuration", - ans:textns, a:"citation-body-style-name"}, {ens:textns, en:"notes-configuration", ans:textns, a:"citation-style-name"}, {ens:textns, en:"a", ans:textns, a:"style-name"}, {ens:textns, en:"alphabetical-index", ans:textns, a:"style-name"}, {ens:textns, en:"linenumbering-configuration", ans:textns, a:"style-name"}, {ens:textns, en:"list-level-style-number", ans:textns, a:"style-name"}, {ens:textns, en:"ruby-text", ans:textns, a:"style-name"}, {ens:textns, en:"span", ans:textns, a:"style-name"}, {ens:textns, - en:"a", ans:textns, a:"visited-style-name"}, {ens:stylens, en:"text-properties", ans:stylens, a:"text-line-through-text-style"}, {ens:textns, en:"alphabetical-index-source", ans:textns, a:"main-entry-style-name"}, {ens:textns, en:"index-entry-bibliography", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-chapter", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-link-end", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-link-start", ans:textns, a:"style-name"}, {ens:textns, - en:"index-entry-page-number", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-span", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-tab-stop", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-text", ans:textns, a:"style-name"}, {ens:textns, en:"index-title-template", ans:textns, a:"style-name"}, {ens:textns, en:"list-level-style-bullet", ans:textns, a:"style-name"}, {ens:textns, en:"outline-level-style", ans:textns, a:"style-name"}], "paragraph":[{ens:drawns, en:"caption", - ans:drawns, a:"text-style-name"}, {ens:drawns, en:"circle", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"connector", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"control", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"custom-shape", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"ellipse", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"frame", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"line", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"measure", ans:drawns, - a:"text-style-name"}, {ens:drawns, en:"path", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"polygon", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"polyline", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"rect", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"regular-polygon", ans:drawns, a:"text-style-name"}, {ens:officens, en:"annotation", ans:drawns, a:"text-style-name"}, {ens:formns, en:"column", ans:formns, a:"text-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"next-style-name"}, - {ens:tablens, en:"body", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"even-rows", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"first-column", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"first-row", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"last-column", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"last-row", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, - en:"odd-columns", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"odd-rows", ans:tablens, a:"paragraph-style-name"}, {ens:textns, en:"notes-configuration", ans:textns, a:"default-style-name"}, {ens:textns, en:"alphabetical-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"bibliography-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"h", ans:textns, a:"style-name"}, {ens:textns, en:"illustration-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, - en:"index-source-style", ans:textns, a:"style-name"}, {ens:textns, en:"object-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"p", ans:textns, a:"style-name"}, {ens:textns, en:"table-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"table-of-content-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"table-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"user-index-entry-template", ans:textns, a:"style-name"}, {ens:stylens, en:"page-layout-properties", - ans:stylens, a:"register-truth-ref-style-name"}], "chart":[{ens:chartns, en:"axis", ans:chartns, a:"style-name"}, {ens:chartns, en:"chart", ans:chartns, a:"style-name"}, {ens:chartns, en:"data-label", ans:chartns, a:"style-name"}, {ens:chartns, en:"data-point", ans:chartns, a:"style-name"}, {ens:chartns, en:"equation", ans:chartns, a:"style-name"}, {ens:chartns, en:"error-indicator", ans:chartns, a:"style-name"}, {ens:chartns, en:"floor", ans:chartns, a:"style-name"}, {ens:chartns, en:"footer", - ans:chartns, a:"style-name"}, {ens:chartns, en:"grid", ans:chartns, a:"style-name"}, {ens:chartns, en:"legend", ans:chartns, a:"style-name"}, {ens:chartns, en:"mean-value", ans:chartns, a:"style-name"}, {ens:chartns, en:"plot-area", ans:chartns, a:"style-name"}, {ens:chartns, en:"regression-curve", ans:chartns, a:"style-name"}, {ens:chartns, en:"series", ans:chartns, a:"style-name"}, {ens:chartns, en:"stock-gain-marker", ans:chartns, a:"style-name"}, {ens:chartns, en:"stock-loss-marker", ans:chartns, - a:"style-name"}, {ens:chartns, en:"stock-range-line", ans:chartns, a:"style-name"}, {ens:chartns, en:"subtitle", ans:chartns, a:"style-name"}, {ens:chartns, en:"title", ans:chartns, a:"style-name"}, {ens:chartns, en:"wall", ans:chartns, a:"style-name"}], "section":[{ens:textns, en:"alphabetical-index", ans:textns, a:"style-name"}, {ens:textns, en:"bibliography", ans:textns, a:"style-name"}, {ens:textns, en:"illustration-index", ans:textns, a:"style-name"}, {ens:textns, en:"index-title", ans:textns, - a:"style-name"}, {ens:textns, en:"object-index", ans:textns, a:"style-name"}, {ens:textns, en:"section", ans:textns, a:"style-name"}, {ens:textns, en:"table-of-content", ans:textns, a:"style-name"}, {ens:textns, en:"table-index", ans:textns, a:"style-name"}, {ens:textns, en:"user-index", ans:textns, a:"style-name"}], "ruby":[{ens:textns, en:"ruby", ans:textns, a:"style-name"}], "table":[{ens:dbns, en:"query", ans:dbns, a:"style-name"}, {ens:dbns, en:"table-representation", ans:dbns, a:"style-name"}, - {ens:tablens, en:"background", ans:tablens, a:"style-name"}, {ens:tablens, en:"table", ans:tablens, a:"style-name"}], "table-column":[{ens:dbns, en:"column", ans:dbns, a:"style-name"}, {ens:tablens, en:"table-column", ans:tablens, a:"style-name"}], "table-row":[{ens:dbns, en:"query", ans:dbns, a:"default-row-style-name"}, {ens:dbns, en:"table-representation", ans:dbns, a:"default-row-style-name"}, {ens:tablens, en:"table-row", ans:tablens, a:"style-name"}], "table-cell":[{ens:dbns, en:"column", - ans:dbns, a:"default-cell-style-name"}, {ens:tablens, en:"table-column", ans:tablens, a:"default-cell-style-name"}, {ens:tablens, en:"table-row", ans:tablens, a:"default-cell-style-name"}, {ens:tablens, en:"body", ans:tablens, a:"style-name"}, {ens:tablens, en:"covered-table-cell", ans:tablens, a:"style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"style-name"}, {ens:tablens, en:"covered-table-cell", ans:tablens, a:"style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"style-name"}, - {ens:tablens, en:"even-rows", ans:tablens, a:"style-name"}, {ens:tablens, en:"first-column", ans:tablens, a:"style-name"}, {ens:tablens, en:"first-row", ans:tablens, a:"style-name"}, {ens:tablens, en:"last-column", ans:tablens, a:"style-name"}, {ens:tablens, en:"last-row", ans:tablens, a:"style-name"}, {ens:tablens, en:"odd-columns", ans:tablens, a:"style-name"}, {ens:tablens, en:"odd-rows", ans:tablens, a:"style-name"}, {ens:tablens, en:"table-cell", ans:tablens, a:"style-name"}], "graphic":[{ens:dr3dns, - en:"cube", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"extrude", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"rotate", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"scene", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"sphere", ans:drawns, a:"style-name"}, {ens:drawns, en:"caption", ans:drawns, a:"style-name"}, {ens:drawns, en:"circle", ans:drawns, a:"style-name"}, {ens:drawns, en:"connector", ans:drawns, a:"style-name"}, {ens:drawns, en:"control", ans:drawns, a:"style-name"}, {ens:drawns, en:"custom-shape", - ans:drawns, a:"style-name"}, {ens:drawns, en:"ellipse", ans:drawns, a:"style-name"}, {ens:drawns, en:"frame", ans:drawns, a:"style-name"}, {ens:drawns, en:"g", ans:drawns, a:"style-name"}, {ens:drawns, en:"line", ans:drawns, a:"style-name"}, {ens:drawns, en:"measure", ans:drawns, a:"style-name"}, {ens:drawns, en:"page-thumbnail", ans:drawns, a:"style-name"}, {ens:drawns, en:"path", ans:drawns, a:"style-name"}, {ens:drawns, en:"polygon", ans:drawns, a:"style-name"}, {ens:drawns, en:"polyline", ans:drawns, - a:"style-name"}, {ens:drawns, en:"rect", ans:drawns, a:"style-name"}, {ens:drawns, en:"regular-polygon", ans:drawns, a:"style-name"}, {ens:officens, en:"annotation", ans:drawns, a:"style-name"}], "presentation":[{ens:dr3dns, en:"cube", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"extrude", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"rotate", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"scene", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"sphere", ans:presentationns, - a:"style-name"}, {ens:drawns, en:"caption", ans:presentationns, a:"style-name"}, {ens:drawns, en:"circle", ans:presentationns, a:"style-name"}, {ens:drawns, en:"connector", ans:presentationns, a:"style-name"}, {ens:drawns, en:"control", ans:presentationns, a:"style-name"}, {ens:drawns, en:"custom-shape", ans:presentationns, a:"style-name"}, {ens:drawns, en:"ellipse", ans:presentationns, a:"style-name"}, {ens:drawns, en:"frame", ans:presentationns, a:"style-name"}, {ens:drawns, en:"g", ans:presentationns, - a:"style-name"}, {ens:drawns, en:"line", ans:presentationns, a:"style-name"}, {ens:drawns, en:"measure", ans:presentationns, a:"style-name"}, {ens:drawns, en:"page-thumbnail", ans:presentationns, a:"style-name"}, {ens:drawns, en:"path", ans:presentationns, a:"style-name"}, {ens:drawns, en:"polygon", ans:presentationns, a:"style-name"}, {ens:drawns, en:"polyline", ans:presentationns, a:"style-name"}, {ens:drawns, en:"rect", ans:presentationns, a:"style-name"}, {ens:drawns, en:"regular-polygon", - ans:presentationns, a:"style-name"}, {ens:officens, en:"annotation", ans:presentationns, a:"style-name"}], "drawing-page":[{ens:drawns, en:"page", ans:drawns, a:"style-name"}, {ens:presentationns, en:"notes", ans:drawns, a:"style-name"}, {ens:stylens, en:"handout-master", ans:drawns, a:"style-name"}, {ens:stylens, en:"master-page", ans:drawns, a:"style-name"}], "list-style":[{ens:textns, en:"list", ans:textns, a:"style-name"}, {ens:textns, en:"numbered-paragraph", ans:textns, a:"style-name"}, {ens:textns, - en:"list-item", ans:textns, a:"style-override"}, {ens:stylens, en:"style", ans:stylens, a:"list-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"data-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"percentage-data-style-name"}, {ens:presentationns, en:"date-time-decl", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"database-display", ans:stylens, - a:"data-style-name"}, {ens:textns, en:"date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"editing-duration", ans:stylens, a:"data-style-name"}, {ens:textns, en:"expression", ans:stylens, a:"data-style-name"}, {ens:textns, en:"meta-field", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-date", ans:stylens, a:"data-style-name"}, {ens:textns, - en:"print-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"table-formula", ans:stylens, a:"data-style-name"}, {ens:textns, en:"time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-defined", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-input", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-input", ans:stylens, - a:"data-style-name"}, {ens:textns, en:"variable-set", ans:stylens, a:"data-style-name"}], "data":[{ens:stylens, en:"style", ans:stylens, a:"data-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"percentage-data-style-name"}, {ens:presentationns, en:"date-time-decl", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"database-display", ans:stylens, a:"data-style-name"}, - {ens:textns, en:"date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"editing-duration", ans:stylens, a:"data-style-name"}, {ens:textns, en:"expression", ans:stylens, a:"data-style-name"}, {ens:textns, en:"meta-field", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-time", - ans:stylens, a:"data-style-name"}, {ens:textns, en:"table-formula", ans:stylens, a:"data-style-name"}, {ens:textns, en:"time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-defined", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-input", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-input", ans:stylens, a:"data-style-name"}, - {ens:textns, en:"variable-set", ans:stylens, a:"data-style-name"}], "page-layout":[{ens:presentationns, en:"notes", ans:stylens, a:"page-layout-name"}, {ens:stylens, en:"handout-master", ans:stylens, a:"page-layout-name"}, {ens:stylens, en:"master-page", ans:stylens, a:"page-layout-name"}]}, elements; - function canElementHaveStyle(family, element) { - var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i; - return elns && elns.length > 0 - } - function getStyleRef(family, element) { - var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i, attr; - for(i = 0;i < length;i += 1) { - attr = element.getAttributeNS(elns[i].ns, elns[i].localname) - } - return null - } - function getUsedStylesForAutomatic(element, keys) { - var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i, attr, group, map, e; - for(i = 0;i < length;i += 1) { - attr = element.getAttributeNS(elns[i].ns, elns[i].localname); - if(attr) { - group = elns[i].keygroup; - map = keys[group]; - if(!map) { - map = keys[group] = {} - } - map[attr] = 1 - } - } - i = element.firstChild; - while(i) { - if(i.nodeType === 1) { - e = i; - getUsedStylesForAutomatic(e, keys) - } - i = i.nextSibling - } - } - function inverse(elementstyles) { - var keyname, i, list, item, l, elements = {}, map, array; - for(keyname in elementstyles) { - if(elementstyles.hasOwnProperty(keyname)) { - list = elementstyles[keyname]; - l = list.length; - for(i = 0;i < l;i += 1) { - item = list[i]; - map = elements[item.en] = elements[item.en] || {}; - array = map[item.ens] = map[item.ens] || []; - array.push({ns:item.ans, localname:item.a, keygroup:keyname}) - } - } - } - return elements - } - this.UsedKeysList = function(element) { - var usedKeys = {}; - this.uses = function(element) { - var localName = element.localName, name = element.getAttributeNS(drawns, "name") || element.getAttributeNS(stylens, "name"), keyName, map; - if(localName === "style") { - keyName = element.getAttributeNS(stylens, "family") - }else { - if(element.namespaceURI === numberns) { - keyName = "data" - }else { - keyName = localName - } - } - map = usedKeys[keyName]; - return map ? map[name] > 0 : false - }; - getUsedStylesForAutomatic(element, usedKeys) - }; - this.canElementHaveStyle = canElementHaveStyle; - elements = inverse(elementstyles) -}; -odf.Style2CSS = function Style2CSS() { - var xlinkns = "http://www.w3.org/1999/xlink", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", - textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", namespaces = {"draw":drawns, "fo":fons, "office":officens, "presentation":presentationns, "style":stylens, "svg":svgns, "table":tablens, "text":textns, "xlink":xlinkns}, familynamespaceprefixes = {"graphic":"draw", "paragraph":"text", "presentation":"presentation", "ruby":"text", "section":"text", "table":"table", "table-cell":"table", "table-column":"table", "table-row":"table", "text":"text", "list":"text"}, familytagnames = {"graphic":["circle", - "connected", "control", "custom-shape", "ellipse", "frame", "g", "line", "measure", "page", "page-thumbnail", "path", "polygon", "polyline", "rect", "regular-polygon"], "paragraph":["alphabetical-index-entry-template", "h", "illustration-index-entry-template", "index-source-style", "object-index-entry-template", "p", "table-index-entry-template", "table-of-content-entry-template", "user-index-entry-template"], "presentation":["caption", "circle", "connector", "control", "custom-shape", "ellipse", - "frame", "g", "line", "measure", "page-thumbnail", "path", "polygon", "polyline", "rect", "regular-polygon"], "ruby":["ruby", "ruby-text"], "section":["alphabetical-index", "bibliography", "illustration-index", "index-title", "object-index", "section", "table-of-content", "table-index", "user-index"], "table":["background", "table"], "table-cell":["body", "covered-table-cell", "even-columns", "even-rows", "first-column", "first-row", "last-column", "last-row", "odd-columns", "odd-rows", "table-cell"], - "table-column":["table-column"], "table-row":["table-row"], "text":["a", "index-entry-chapter", "index-entry-link-end", "index-entry-link-start", "index-entry-page-number", "index-entry-span", "index-entry-tab-stop", "index-entry-text", "index-title-template", "linenumbering-configuration", "list-level-style-number", "list-level-style-bullet", "outline-level-style", "span"], "list":["list-item"]}, textPropertySimpleMapping = [[fons, "color", "color"], [fons, "background-color", "background-color"], - [fons, "font-weight", "font-weight"], [fons, "font-style", "font-style"], [fons, "font-size", "font-size"]], bgImageSimpleMapping = [[stylens, "repeat", "background-repeat"]], paragraphPropertySimpleMapping = [[fons, "background-color", "background-color"], [fons, "text-align", "text-align"], [fons, "padding-left", "padding-left"], [fons, "padding-right", "padding-right"], [fons, "padding-top", "padding-top"], [fons, "padding-bottom", "padding-bottom"], [fons, "border-left", "border-left"], [fons, - "border-right", "border-right"], [fons, "border-top", "border-top"], [fons, "border-bottom", "border-bottom"], [fons, "margin-left", "margin-left"], [fons, "margin-right", "margin-right"], [fons, "margin-top", "margin-top"], [fons, "margin-bottom", "margin-bottom"], [fons, "border", "border"]], graphicPropertySimpleMapping = [[drawns, "fill-color", "background-color"], [drawns, "fill", "background"], [fons, "min-height", "min-height"], [drawns, "stroke", "border"], [svgns, "stroke-color", "border-color"]], - tablecellPropertySimpleMapping = [[fons, "background-color", "background-color"], [fons, "border-left", "border-left"], [fons, "border-right", "border-right"], [fons, "border-top", "border-top"], [fons, "border-bottom", "border-bottom"]]; - function namespaceResolver(prefix) { - return namespaces[prefix] || null - } - function getStyleMap(doc, stylesnode) { - var stylemap = {}, node, name, family, map; - if(!stylesnode) { - return stylemap - } - node = stylesnode.firstChild; - while(node) { - if(node.namespaceURI === stylens && node.localName === "style") { - family = node.getAttributeNS(stylens, "family") - }else { - if(node.namespaceURI === textns && node.localName === "list-style") { - family = "list" - } - } - name = family && node.getAttributeNS && node.getAttributeNS(stylens, "name"); - if(name) { - if(!stylemap[family]) { - stylemap[family] = {} - } - stylemap[family][name] = node - } - node = node.nextSibling - } - return stylemap - } - function findStyle(stylestree, name) { - if(!name || !stylestree) { - return null - } - if(stylestree[name]) { - return stylestree[name] - } - var derivedStyles = stylestree.derivedStyles, n, style; - for(n in stylestree) { - if(stylestree.hasOwnProperty(n)) { - style = findStyle(stylestree[n].derivedStyles, name); - if(style) { - return style - } - } - } - return null - } - function addStyleToStyleTree(stylename, stylesmap, stylestree) { - var style = stylesmap[stylename], parentname, parentstyle; - if(!style) { - return - } - parentname = style.getAttributeNS(stylens, "parent-style-name"); - parentstyle = null; - if(parentname) { - parentstyle = findStyle(stylestree, parentname); - if(!parentstyle && stylesmap[parentname]) { - addStyleToStyleTree(parentname, stylesmap, stylestree); - parentstyle = stylesmap[parentname]; - stylesmap[parentname] = null - } - } - if(parentstyle) { - if(!parentstyle.derivedStyles) { - parentstyle.derivedStyles = {} - } - parentstyle.derivedStyles[stylename] = style - }else { - stylestree[stylename] = style - } - } - function addStyleMapToStyleTree(stylesmap, stylestree) { - var name; - for(name in stylesmap) { - if(stylesmap.hasOwnProperty(name)) { - addStyleToStyleTree(name, stylesmap, stylestree); - stylesmap[name] = null - } - } - } - function createSelector(family, name) { - var prefix = familynamespaceprefixes[family], namepart, selector = "", first = true; - if(prefix === null) { - return null - } - namepart = "[" + prefix + '|style-name="' + name + '"]'; - if(prefix === "presentation") { - prefix = "draw"; - namepart = '[presentation|style-name="' + name + '"]' - } - return prefix + "|" + familytagnames[family].join(namepart + "," + prefix + "|") + namepart - } - function getSelectors(family, name, node) { - var selectors = [], n, ss, s; - selectors.push(createSelector(family, name)); - for(n in node.derivedStyles) { - if(node.derivedStyles.hasOwnProperty(n)) { - ss = getSelectors(family, n, node.derivedStyles[n]); - for(s in ss) { - if(ss.hasOwnProperty(s)) { - selectors.push(ss[s]) - } - } - } - } - return selectors - } - function getDirectChild(node, ns, name) { - if(!node) { - return null - } - var c = node.firstChild, e; - while(c) { - if(c.namespaceURI === ns && c.localName === name) { - e = c; - return e - } - c = c.nextSibling - } - return null - } - function applySimpleMapping(props, mapping) { - var rule = "", r, value; - for(r in mapping) { - if(mapping.hasOwnProperty(r)) { - r = mapping[r]; - value = props.getAttributeNS(r[0], r[1]); - if(value) { - rule += r[2] + ":" + value + ";" - } - } - } - return rule - } - function getFontDeclaration(name) { - return'"' + name + '"' - } - function getTextProperties(props) { - var rule = "", value; - rule += applySimpleMapping(props, textPropertySimpleMapping); - value = props.getAttributeNS(stylens, "text-underline-style"); - if(value === "solid") { - rule += "text-decoration: underline;" - } - value = props.getAttributeNS(stylens, "font-name"); - if(value) { - value = getFontDeclaration(value); - if(value) { - rule += "font-family: " + value + ";" - } - } - return rule - } - function getParagraphProperties(props) { - var rule = "", imageProps, url, element; - rule += applySimpleMapping(props, paragraphPropertySimpleMapping); - imageProps = props.getElementsByTagNameNS(stylens, "background-image"); - if(imageProps.length > 0) { - url = imageProps.item(0).getAttributeNS(xlinkns, "href"); - if(url) { - rule += "background-image: url('odfkit:" + url + "');"; - element = imageProps.item(0); - rule += applySimpleMapping(element, bgImageSimpleMapping) - } - } - return rule - } - function getGraphicProperties(props) { - var rule = ""; - rule += applySimpleMapping(props, graphicPropertySimpleMapping); - return rule - } - function getTableCellProperties(props) { - var rule = ""; - rule += applySimpleMapping(props, tablecellPropertySimpleMapping); - return rule - } - function addStyleRule(sheet, family, name, node) { - var selectors = getSelectors(family, name, node), selector = selectors.join(","), rule = "", properties = getDirectChild(node, stylens, "text-properties"); - if(properties) { - rule += getTextProperties(properties) - } - properties = getDirectChild(node, stylens, "paragraph-properties"); - if(properties) { - rule += getParagraphProperties(properties) - } - properties = getDirectChild(node, stylens, "graphic-properties"); - if(properties) { - rule += getGraphicProperties(properties) - } - properties = getDirectChild(node, stylens, "table-cell-properties"); - if(properties) { - rule += getTableCellProperties(properties) - } - if(rule.length === 0) { - return - } - rule = selector + "{" + rule + "}"; - try { - sheet.insertRule(rule, sheet.cssRules.length) - }catch(e) { - throw e; - } - } - function getNumberRule(node) { - var style = node.getAttributeNS(stylens, "num-format"), suffix = node.getAttributeNS(stylens, "num-suffix"), prefix = node.getAttributeNS(stylens, "num-prefix"), rule = "", stylemap = {1:"decimal", "a":"lower-latin", "A":"upper-latin", "i":"lower-roman", "I":"upper-roman"}, content = ""; - content = prefix || ""; - if(stylemap.hasOwnProperty(style)) { - content += " counter(list, " + stylemap[style] + ")" - }else { - if(style) { - content += "'" + style + "';" - }else { - content += " ''" - } - } - if(suffix) { - content += " '" + suffix + "'" - } - rule = "content: " + content + ";"; - return rule - } - function getImageRule(node) { - var rule = "content: none;"; - return rule - } - function getBulletRule(node) { - var rule = "", bulletChar = node.getAttributeNS(textns, "bullet-char"); - return"content: '" + bulletChar + "';" - } - function addListStyleRule(sheet, name, node, itemrule) { - var selector = 'text|list[text|style-name="' + name + '"]', level = node.getAttributeNS(textns, "level"), rule = ""; - level = level && parseInt(level, 10); - while(level > 1) { - selector += " > text|list-item > text|list"; - level -= 1 - } - selector += " > list-item:before"; - rule = itemrule; - rule = selector + "{" + rule + "}"; - try { - sheet.insertRule(rule, sheet.cssRules.length) - }catch(e) { - throw e; - } - } - function addListStyleRules(sheet, name, node) { - var n = node.firstChild, e, itemrule; - while(n) { - if(n.namespaceURI === textns) { - e = n; - if(n.localName === "list-level-style-number") { - itemrule = getNumberRule(e); - addListStyleRule(sheet, name, e, itemrule) - }else { - if(n.localName === "list-level-style-image") { - itemrule = getImageRule(e); - addListStyleRule(sheet, name, e, itemrule) - }else { - if(n.localName === "list-level-style-bullet") { - itemrule = getBulletRule(e); - addListStyleRule(sheet, name, e, itemrule) - } - } - } - } - n = n.nextSibling - } - } - function addRule(sheet, family, name, node) { - if(family === "list") { - addListStyleRules(sheet, name, node) - }else { - addStyleRule(sheet, family, name, node) - } - } - function addRules(sheet, family, name, node) { - addRule(sheet, family, name, node); - var n; - for(n in node.derivedStyles) { - if(node.derivedStyles.hasOwnProperty(n)) { - addRules(sheet, family, n, node.derivedStyles[n]) - } - } - } - this.namespaces = namespaces; - this.namespaceResolver = namespaceResolver; - this.namespaceResolver.lookupNamespaceURI = this.namespaceResolver; - this.style2css = function(stylesheet, styles, autostyles) { - var doc, prefix, styletree, tree, name, rule, family, stylenodes, styleautonodes; - while(stylesheet.cssRules.length) { - stylesheet.deleteRule(stylesheet.cssRules.length - 1) - } - doc = null; - if(styles) { - doc = styles.ownerDocument - } - if(autostyles) { - doc = autostyles.ownerDocument - } - if(!doc) { - return - } - for(prefix in namespaces) { - if(namespaces.hasOwnProperty(prefix)) { - rule = "@namespace " + prefix + " url(" + namespaces[prefix] + ");"; - try { - stylesheet.insertRule(rule, stylesheet.cssRules.length) - }catch(e) { - } - } - } - stylenodes = getStyleMap(doc, styles); - styleautonodes = getStyleMap(doc, autostyles); - styletree = {}; - for(family in familynamespaceprefixes) { - if(familynamespaceprefixes.hasOwnProperty(family)) { - tree = styletree[family] = {}; - addStyleMapToStyleTree(stylenodes[family], tree); - addStyleMapToStyleTree(styleautonodes[family], tree); - for(name in tree) { - if(tree.hasOwnProperty(name)) { - addRules(stylesheet, family, name, tree[name]) - } - } - } - } - } -}; -runtime.loadClass("core.Base64"); -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); -odf.FontLoader = function() { - var style2CSS = new odf.Style2CSS, xpath = new xmldom.XPath, base64 = new core.Base64; - function getEmbeddedFontDeclarations(fontFaceDecls) { - var decls = {}, fonts, i, font, name, uris, href; - if(!fontFaceDecls) { - return decls - } - fonts = xpath.getODFElementsWithXPath(fontFaceDecls, "style:font-face[svg:font-face-src]", style2CSS.namespaceResolver); - for(i = 0;i < fonts.length;i += 1) { - font = fonts[i]; - name = font.getAttributeNS(style2CSS.namespaces["style"], "name"); - uris = xpath.getODFElementsWithXPath(font, "svg:font-face-src/svg:font-face-uri", style2CSS.namespaceResolver); - if(uris.length > 0) { - href = uris[0].getAttributeNS(style2CSS.namespaces["xlink"], "href"); - decls[name] = {href:href} - } - } - return decls - } - function addFontToCSS(name, font, fontdata, stylesheet) { - stylesheet = document.styleSheets[0]; - var rule = '@font-face { font-family: "' + name + '"; src: ' + "url(data:application/x-font-ttf;charset=binary;base64," + base64.convertUTF8ArrayToBase64(fontdata) + ') format("truetype"); }'; - try { - stylesheet.insertRule(rule, stylesheet.cssRules.length) - }catch(e) { - runtime.log("Problem inserting rule in CSS: " + rule) - } - } - function loadFontIntoCSS(embeddedFontDeclarations, zip, pos, stylesheet, callback) { - var name, i = 0, n; - for(n in embeddedFontDeclarations) { - if(embeddedFontDeclarations.hasOwnProperty(n)) { - if(i === pos) { - name = n - } - i += 1 - } - } - if(!name) { - return callback() - } - zip.load(embeddedFontDeclarations[name].href, function(err, fontdata) { - if(err) { - runtime.log(err) - }else { - addFontToCSS(name, embeddedFontDeclarations[name], fontdata, stylesheet) - } - return loadFontIntoCSS(embeddedFontDeclarations, zip, pos + 1, stylesheet, callback) - }) - } - function loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) { - loadFontIntoCSS(embeddedFontDeclarations, zip, 0, stylesheet, function() { - }) - } - odf.FontLoader = function FontLoader() { - var self = this; - this.loadFonts = function(fontFaceDecls, zip, stylesheet) { - var embeddedFontDeclarations = getEmbeddedFontDeclarations(fontFaceDecls); - loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) - } - }; - return odf.FontLoader -}(); -runtime.loadClass("core.Base64"); -runtime.loadClass("core.Zip"); -runtime.loadClass("xmldom.LSSerializer"); -runtime.loadClass("odf.StyleInfo"); -runtime.loadClass("odf.Style2CSS"); -runtime.loadClass("odf.FontLoader"); -odf.OdfContainer = function() { - var styleInfo = new odf.StyleInfo, style2CSS = new odf.Style2CSS, namespaces = style2CSS.namespaces, officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", nodeorder = ["meta", "settings", "scripts", "font-face-decls", "styles", "automatic-styles", "master-styles", "body"], base64 = new core.Base64, fontLoader = new odf.FontLoader, partMimetypes = {}; - function getDirectChild(node, ns, name) { - node = node ? node.firstChild : null; - while(node) { - if(node.localName === name && node.namespaceURI === ns) { - return node - } - node = node.nextSibling - } - return null - } - function getNodePosition(child) { - var childpos = 0, i, l = nodeorder.length; - for(i = 0;i < l;i += 1) { - if(child.namespaceURI === officens && child.localName === nodeorder[i]) { - return i - } - } - return-1 - } - function OdfNodeFilter(odfroot, usedStylesElement) { - var automaticStyles = odfroot.automaticStyles, usedKeysList; - if(usedStylesElement) { - usedKeysList = new styleInfo.UsedKeysList(usedStylesElement) - } - this.acceptNode = function(node) { - var styleName, styleFamily, result; - if(node.namespaceURI === "http://www.w3.org/1999/xhtml") { - result = 3 - }else { - if(usedKeysList && node.parentNode === automaticStyles && node.nodeType === 1) { - if(usedKeysList.uses(node)) { - result = 1 - }else { - result = 2 - } - }else { - result = 1 - } - } - return result - } - } - function setChild(node, child) { - if(!child) { - return - } - var childpos = getNodePosition(child), pos, c = node.firstChild; - if(childpos === -1) { - return - } - while(c) { - pos = getNodePosition(c); - if(pos !== -1 && pos > childpos) { - break - } - c = c.nextSibling - } - node.insertBefore(child, c) - } - function ODFElement() { - } - function ODFDocumentElement(odfcontainer) { - this.OdfContainer = odfcontainer - } - ODFDocumentElement.prototype = new ODFElement; - ODFDocumentElement.prototype.constructor = ODFDocumentElement; - ODFDocumentElement.namespaceURI = officens; - ODFDocumentElement.localName = "document"; - function OdfPart(name, container, zip) { - var self = this, privatedata; - this.size = 0; - this.type = null; - this.name = name; - this.container = container; - this.url = null; - this.mimetype = null; - this.document = null; - this.onreadystatechange = null; - this.onchange = null; - this.EMPTY = 0; - this.LOADING = 1; - this.DONE = 2; - this.state = this.EMPTY; - this.load = function() { - var mimetype = partMimetypes[name]; - this.mimetype = mimetype; - zip.loadAsDataURL(name, mimetype, function(err, url) { - self.url = url; - if(self.onchange) { - self.onchange(self) - } - if(self.onstatereadychange) { - self.onstatereadychange(self) - } - }) - }; - this.abort = function() { - } - } - OdfPart.prototype.load = function() { - }; - OdfPart.prototype.getUrl = function() { - if(this.data) { - return"data:;base64," + base64.toBase64(this.data) - } - return null - }; - function OdfPartList(odfcontainer) { - var self = this; - this.length = 0; - this.item = function(index) { - } - } - odf.OdfContainer = function OdfContainer(url, onstatereadychange) { - var self = this, zip = null, contentXmlCompletelyLoaded = false; - this.onstatereadychange = onstatereadychange; - this.onchange = null; - this.state = null; - this.rootElement = null; - this.parts = null; - function removeProcessingInstructions(element) { - var n = element.firstChild, next, e; - while(n) { - next = n.nextSibling; - if(n.nodeType === 1) { - e = n; - removeProcessingInstructions(e) - }else { - if(n.nodeType === 7) { - element.removeChild(n) - } - } - n = next - } - } - function importRootNode(xmldoc) { - var doc = self.rootElement.ownerDocument, node; - if(xmldoc) { - removeProcessingInstructions(xmldoc.documentElement); - try { - node = doc.importNode(xmldoc.documentElement, true) - }catch(e) { - } - } - return node - } - function setState(state) { - self.state = state; - if(self.onchange) { - self.onchange(self) - } - if(self.onstatereadychange) { - self.onstatereadychange(self) - } - } - function handleFlatXml(xmldoc) { - var root = importRootNode(xmldoc); - if(!root || root.localName !== "document" || root.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return - } - self.rootElement = root; - root.fontFaceDecls = getDirectChild(root, officens, "font-face-decls"); - root.styles = getDirectChild(root, officens, "styles"); - root.automaticStyles = getDirectChild(root, officens, "automatic-styles"); - root.masterStyles = getDirectChild(root, officens, "master-styles"); - root.body = getDirectChild(root, officens, "body"); - root.meta = getDirectChild(root, officens, "meta"); - setState(OdfContainer.DONE) - } - function handleStylesXml(xmldoc) { - var node = importRootNode(xmldoc), root = self.rootElement; - if(!node || node.localName !== "document-styles" || node.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return - } - root.fontFaceDecls = getDirectChild(node, officens, "font-face-decls"); - setChild(root, root.fontFaceDecls); - root.styles = getDirectChild(node, officens, "styles"); - setChild(root, root.styles); - root.automaticStyles = getDirectChild(node, officens, "automatic-styles"); - setChild(root, root.automaticStyles); - root.masterStyles = getDirectChild(node, officens, "master-styles"); - setChild(root, root.masterStyles); - fontLoader.loadFonts(root.fontFaceDecls, zip, null) - } - function handleContentXml(xmldoc) { - var node = importRootNode(xmldoc), root, automaticStyles, fontFaceDecls, c; - if(!node || node.localName !== "document-content" || node.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return - } - root = self.rootElement; - fontFaceDecls = getDirectChild(node, officens, "font-face-decls"); - if(root.fontFaceDecls && fontFaceDecls) { - c = fontFaceDecls.firstChild; - while(c) { - root.fontFaceDecls.appendChild(c); - c = fontFaceDecls.firstChild - } - }else { - if(fontFaceDecls) { - root.fontFaceDecls = fontFaceDecls; - setChild(root, fontFaceDecls) - } - } - automaticStyles = getDirectChild(node, officens, "automatic-styles"); - if(root.automaticStyles && automaticStyles) { - c = automaticStyles.firstChild; - while(c) { - root.automaticStyles.appendChild(c); - c = automaticStyles.firstChild - } - }else { - if(automaticStyles) { - root.automaticStyles = automaticStyles; - setChild(root, automaticStyles) - } - } - root.body = getDirectChild(node, officens, "body"); - setChild(root, root.body) - } - function handleMetaXml(xmldoc) { - var node = importRootNode(xmldoc), root; - if(!node || node.localName !== "document-meta" || node.namespaceURI !== officens) { - return - } - root = self.rootElement; - root.meta = getDirectChild(node, officens, "meta"); - setChild(root, root.meta) - } - function handleSettingsXml(xmldoc) { - var node = importRootNode(xmldoc), root; - if(!node || node.localName !== "document-settings" || node.namespaceURI !== officens) { - return - } - root = self.rootElement; - root.settings = getDirectChild(node, officens, "settings"); - setChild(root, root.settings) - } - function handleManifestXml(xmldoc) { - var node = importRootNode(xmldoc), root, n; - if(!node || node.localName !== "manifest" || node.namespaceURI !== manifestns) { - return - } - root = self.rootElement; - root.manifest = node; - n = root.manifest.firstChild; - while(n) { - if(n.nodeType === 1 && n.localName === "file-entry" && n.namespaceURI === manifestns) { - partMimetypes[n.getAttributeNS(manifestns, "full-path")] = n.getAttributeNS(manifestns, "media-type") - } - n = n.nextSibling - } - } - function getContentXmlNode(callback) { - var handler = {rootElementReady:function(err, rootxml, done) { - contentXmlCompletelyLoaded = err || done; - if(err) { - return callback(err, null) - } - var parser = new DOMParser; - rootxml = parser.parseFromString(rootxml, "text/xml"); - callback(null, rootxml) - }, bodyChildElementsReady:function(err, nodes, done) { - }}; - zip.loadContentXmlAsFragments("content.xml", handler) - } - function getXmlNode(filepath, callback) { - zip.loadAsDOM(filepath, callback) - } - function loadComponents() { - getXmlNode("styles.xml", function(err, xmldoc) { - handleStylesXml(xmldoc); - if(self.state === OdfContainer.INVALID) { - return - } - getXmlNode("content.xml", function(err, xmldoc) { - handleContentXml(xmldoc); - if(self.state === OdfContainer.INVALID) { - return - } - getXmlNode("meta.xml", function(err, xmldoc) { - handleMetaXml(xmldoc); - if(self.state === OdfContainer.INVALID) { - return - } - getXmlNode("settings.xml", function(err, xmldoc) { - if(xmldoc) { - handleSettingsXml(xmldoc) - } - getXmlNode("META-INF/manifest.xml", function(err, xmldoc) { - if(xmldoc) { - handleManifestXml(xmldoc) - } - if(self.state !== OdfContainer.INVALID) { - setState(OdfContainer.DONE) - } - }) - }) - }) - }) - }) - } - function documentElement(name, map) { - var s = "", i; - for(i in map) { - if(map.hasOwnProperty(i)) { - s += " xmlns:" + i + '="' + map[i] + '"' - } - } - return'' - } - function serializeMetaXml() { - var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-meta", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement); - s += serializer.writeToString(self.rootElement.meta, nsmap); - s += ""; - return s - } - function serializeSettingsXml() { - var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-settings", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement); - s += serializer.writeToString(self.rootElement.settings, nsmap); - s += ""; - return s - } - function serializeStylesXml() { - var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-styles", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement, self.rootElement.masterStyles); - s += serializer.writeToString(self.rootElement.fontFaceDecls, nsmap); - s += serializer.writeToString(self.rootElement.styles, nsmap); - s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); - s += serializer.writeToString(self.rootElement.masterStyles, nsmap); - s += ""; - return s - } - function serializeContentXml() { - var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-content", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement, self.rootElement.body); - s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); - s += serializer.writeToString(self.rootElement.body, nsmap); - s += ""; - return s - } - function createElement(Type) { - var original = document.createElementNS(Type.namespaceURI, Type.localName), method, iface = new Type; - for(method in iface) { - if(iface.hasOwnProperty(method)) { - original[method] = iface[method] - } - } - return original - } - function loadFromXML(url, callback) { - runtime.loadXML(url, function(err, dom) { - if(err) { - callback(err) - }else { - handleFlatXml(dom) - } - }) - } - this.getPart = function(partname) { - return new OdfPart(partname, self, zip) - }; - this.save = function(callback) { - var data; - data = runtime.byteArrayFromString(serializeSettingsXml(), "utf8"); - zip.save("settings.xml", data, true, new Date); - data = runtime.byteArrayFromString(serializeMetaXml(), "utf8"); - zip.save("meta.xml", data, true, new Date); - data = runtime.byteArrayFromString(serializeStylesXml(), "utf8"); - zip.save("styles.xml", data, true, new Date); - data = runtime.byteArrayFromString(serializeContentXml(), "utf8"); - zip.save("content.xml", data, true, new Date); - zip.write(function(err) { - callback(err) - }) - }; - this.state = OdfContainer.LOADING; - this.rootElement = createElement(ODFDocumentElement); - this.parts = new OdfPartList(this); - zip = new core.Zip(url, function(err, zipobject) { - zip = zipobject; - if(err) { - loadFromXML(url, function(xmlerr) { - if(err) { - zip.error = err + "\n" + xmlerr; - setState(OdfContainer.INVALID) - } - }) - }else { - loadComponents() - } - }) - }; - odf.OdfContainer.EMPTY = 0; - odf.OdfContainer.LOADING = 1; - odf.OdfContainer.DONE = 2; - odf.OdfContainer.INVALID = 3; - odf.OdfContainer.SAVING = 4; - odf.OdfContainer.MODIFIED = 5; - odf.OdfContainer.getContainer = function(url) { - return new odf.OdfContainer(url, null) - }; - return odf.OdfContainer -}(); -odf.Formatting = function Formatting() { - var odfContainer, styleInfo = new odf.StyleInfo; - function RangeElementIterator(range) { - function getNthChild(parent, n) { - var c = parent && parent.firstChild; - while(c && n) { - c = c.nextSibling; - n -= 1 - } - return c - } - var start = getNthChild(range.startContainer, range.startOffset), end = getNthChild(range.endContainer, range.endOffset), current = start; - this.next = function() { - var c = current; - if(c === null) { - return c - } - return null - } - } - function getParentStyle(element) { - var n = element.firstChild, e; - if(n.nodeType === 1) { - e = n; - return e - } - return null - } - function getParagraphStyles(range) { - var iter = new RangeElementIterator(range), e, styles = []; - e = iter.next(); - while(e) { - if(styleInfo.canElementHaveStyle("paragraph", e)) { - styles.push(e) - } - } - return styles - } - this.setOdfContainer = function(odfcontainer) { - odfContainer = odfcontainer - }; - this.isCompletelyBold = function(selection) { - return false - }; - this.getAlignment = function(selection) { - var styles = this.getParagraphStyles(selection), i, l = styles.length; - return undefined - }; - this.getParagraphStyles = function(selection) { - var i, j, s, styles = []; - for(i = 0;i < selection.length;i += 0) { - s = getParagraphStyles(selection[i]); - for(j = 0;j < s.length;j += 1) { - if(styles.indexOf(s[j]) === -1) { - styles.push(s[j]) - } - } - } - return styles - }; - this.getTextStyles = function(selection) { - return[] - } -}; -runtime.loadClass("odf.OdfContainer"); -runtime.loadClass("odf.Formatting"); -runtime.loadClass("xmldom.XPath"); -odf.OdfCanvas = function() { - function LoadingQueue() { - var queue = [], taskRunning = false; - function run(task) { - taskRunning = true; - runtime.setTimeout(function() { - try { - task() - }catch(e) { - runtime.log(e) - } - taskRunning = false; - if(queue.length > 0) { - run(queue.pop()) - } - }, 10) - } - this.clearQueue = function() { - queue.length = 0 - }; - this.addToQueue = function(loadingTask) { - if(queue.length === 0 && !taskRunning) { - return run(loadingTask) - } - queue.push(loadingTask) - } - } - function PageSwitcher(css) { - var sheet = css.sheet, position = 1; - function updateCSS() { - while(sheet.cssRules.length > 0) { - sheet.deleteRule(0) - } - sheet.insertRule("office|presentation draw|page {display:none;}", 0); - sheet.insertRule("office|presentation draw|page:nth-child(" + position + ") {display:block;}", 1) - } - this.showNextPage = function() { - position += 1; - updateCSS() - }; - this.showPreviousPage = function() { - if(position > 1) { - position -= 1; - updateCSS() - } - }; - this.css = css - } - function listenEvent(eventTarget, eventType, eventHandler) { - if(eventTarget.addEventListener) { - eventTarget.addEventListener(eventType, eventHandler, false) - }else { - if(eventTarget.attachEvent) { - eventType = "on" + eventType; - eventTarget.attachEvent(eventType, eventHandler) - }else { - eventTarget["on" + eventType] = eventHandler - } - } - } - function SelectionWatcher(element) { - var selection = [], count = 0, listeners = []; - function isAncestorOf(ancestor, descendant) { - while(descendant) { - if(descendant === ancestor) { - return true - } - descendant = descendant.parentNode - } - return false - } - function fallsWithin(element, range) { - return isAncestorOf(element, range.startContainer) && isAncestorOf(element, range.endContainer) - } - function getCurrentSelection() { - var s = [], selection = runtime.getWindow().getSelection(), i, r; - for(i = 0;i < selection.rangeCount;i += 1) { - r = selection.getRangeAt(i); - if(r !== null && fallsWithin(element, r)) { - s.push(r) - } - } - return s - } - function rangesNotEqual(rangeA, rangeB) { - if(rangeA === rangeB) { - return false - } - if(rangeA === null || rangeB === null) { - return true - } - return rangeA.startContainer !== rangeB.startContainer || rangeA.startOffset !== rangeB.startOffset || rangeA.endContainer !== rangeB.endContainer || rangeA.endOffset !== rangeB.endOffset - } - function emitNewSelection() { - var i, l = listeners.length; - for(i = 0;i < l;i += 1) { - listeners[i](element, selection) - } - } - function copySelection(selection) { - var s = [selection.length], i, oldr, r, doc = element.ownerDocument; - for(i = 0;i < selection.length;i += 1) { - oldr = selection[i]; - r = doc.createRange(); - r.setStart(oldr.startContainer, oldr.startOffset); - r.setEnd(oldr.endContainer, oldr.endOffset); - s[i] = r - } - return s - } - function checkSelection() { - var s = getCurrentSelection(), i; - if(s.length === selection.length) { - for(i = 0;i < s.length;i += 1) { - if(rangesNotEqual(s[i], selection[i])) { - break - } - } - if(i === s.length) { - return - } - } - selection = s; - selection = copySelection(s); - emitNewSelection() - } - this.addListener = function(eventName, handler) { - var i, l = listeners.length; - for(i = 0;i < l;i += 1) { - if(listeners[i] === handler) { - return - } - } - listeners.push(handler) - }; - listenEvent(element, "mouseup", checkSelection); - listenEvent(element, "keyup", checkSelection); - listenEvent(element, "keydown", checkSelection) - } - var style2CSS = new odf.Style2CSS, namespaces = style2CSS.namespaces, drawns = namespaces.draw, fons = namespaces.fo, officens = namespaces.office, svgns = namespaces.svg, textns = namespaces.text, xlinkns = namespaces.xlink, window = runtime.getWindow(), xpath = new xmldom.XPath, eventHandlers = {}, editparagraph, loadingQueue = new LoadingQueue; - function addEventListener(eventType, eventHandler) { - var handlers = eventHandlers[eventType]; - if(handlers === undefined) { - handlers = eventHandlers[eventType] = [] - } - if(eventHandler && handlers.indexOf(eventHandler) === -1) { - handlers.push(eventHandler) - } - } - function fireEvent(eventType, args) { - if(!eventHandlers.hasOwnProperty(eventType)) { - return - } - var handlers = eventHandlers[eventType], i; - for(i = 0;i < handlers.length;i += 1) { - handlers[i](args) - } - } - function clear(element) { - while(element.firstChild) { - element.removeChild(element.firstChild) - } - } - function handleStyles(odfelement, stylesxmlcss) { - var style2css = new odf.Style2CSS; - style2css.style2css(stylesxmlcss.sheet, odfelement.styles, odfelement.automaticStyles) - } - function setFramePosition(id, frame, stylesheet) { - frame.setAttribute("styleid", id); - var rule, anchor = frame.getAttributeNS(textns, "anchor-type"), x = frame.getAttributeNS(svgns, "x"), y = frame.getAttributeNS(svgns, "y"), width = frame.getAttributeNS(svgns, "width"), height = frame.getAttributeNS(svgns, "height"), minheight = frame.getAttributeNS(fons, "min-height"), minwidth = frame.getAttributeNS(fons, "min-width"); - if(anchor === "as-char") { - rule = "display: inline-block;" - }else { - if(anchor || x || y) { - rule = "position: absolute;" - }else { - if(width || height || minheight || minwidth) { - rule = "display: block;" - } - } - } - if(x) { - rule += "left: " + x + ";" - } - if(y) { - rule += "top: " + y + ";" - } - if(width) { - rule += "width: " + width + ";" - } - if(height) { - rule += "height: " + height + ";" - } - if(minheight) { - rule += "min-height: " + minheight + ";" - } - if(minwidth) { - rule += "min-width: " + minwidth + ";" - } - if(rule) { - rule = "draw|" + frame.localName + '[styleid="' + id + '"] {' + rule + "}"; - stylesheet.insertRule(rule, stylesheet.cssRules.length) - } - } - function getUrlFromBinaryDataElement(image) { - var node = image.firstChild; - while(node) { - if(node.namespaceURI === officens && node.localName === "binary-data") { - return"data:image/png;base64," + node.textContent - } - node = node.nextSibling - } - return"" - } - function setImage(id, container, image, stylesheet) { - image.setAttribute("styleid", id); - var url = image.getAttributeNS(xlinkns, "href"), part, node; - function callback(url) { - var rule = "background-image: url(" + url + ");"; - rule = 'draw|image[styleid="' + id + '"] {' + rule + "}"; - stylesheet.insertRule(rule, stylesheet.cssRules.length) - } - if(url) { - try { - if(container.getPartUrl) { - url = container.getPartUrl(url); - callback(url) - }else { - part = container.getPart(url); - part.onchange = function(part) { - callback(part.url) - }; - part.load() - } - }catch(e) { - runtime.log("slight problem: " + e) - } - }else { - url = getUrlFromBinaryDataElement(image); - callback(url) - } - } - function formatParagraphAnchors(odfbody) { - var runtimens = "urn:webodf", n, i, nodes = xpath.getODFElementsWithXPath(odfbody, ".//*[*[@text:anchor-type='paragraph']]", style2CSS.namespaceResolver); - for(i = 0;i < nodes.length;i += 1) { - n = nodes[i]; - if(n.setAttributeNS) { - n.setAttributeNS(runtimens, "containsparagraphanchor", true) - } - } - } - function modifyImages(container, odfbody, stylesheet) { - var node, frames, i, images; - function namespaceResolver(prefix) { - return namespaces[prefix] - } - frames = []; - node = odfbody.firstChild; - while(node && node !== odfbody) { - if(node.namespaceURI === drawns) { - frames[frames.length] = node - } - if(node.firstChild) { - node = node.firstChild - }else { - while(node && node !== odfbody && !node.nextSibling) { - node = node.parentNode - } - if(node && node.nextSibling) { - node = node.nextSibling - } - } - } - for(i = 0;i < frames.length;i += 1) { - node = frames[i]; - setFramePosition("frame" + String(i), node, stylesheet) - } - formatParagraphAnchors(odfbody) - } - function loadImages(container, odffragment, stylesheet) { - var i, images, node; - function loadImage(name, container, node, stylesheet) { - loadingQueue.addToQueue(function() { - setImage(name, container, node, stylesheet) - }) - } - images = odffragment.getElementsByTagNameNS(drawns, "image"); - for(i = 0;i < images.length;i += 1) { - node = images.item(i); - loadImage("image" + String(i), container, node, stylesheet) - } - } - function setVideo(id, container, plugin, stylesheet) { - var video, source, url, videoType, doc = plugin.ownerDocument, part, node; - url = plugin.getAttributeNS(xlinkns, "href"); - function callback(url, mimetype) { - if(mimetype.substr(0, 6) === "video/") { - video = doc.createElementNS(doc.documentElement.namespaceURI, "video"); - video.setAttribute("controls", "controls"); - source = doc.createElement("source"); - source.setAttribute("src", url); - source.setAttribute("type", mimetype); - video.appendChild(source); - plugin.parentNode.appendChild(video) - }else { - plugin.innerHtml = "Unrecognised Plugin" - } - } - if(url) { - try { - if(container.getPartUrl) { - url = container.getPartUrl(url); - callback(url, "video/mp4") - }else { - part = container.getPart(url); - part.onchange = function(part) { - callback(part.url, part.mimetype) - }; - part.load() - } - }catch(e) { - runtime.log("slight problem: " + e) - } - }else { - runtime.log("using MP4 data fallback"); - url = getUrlFromBinaryDataElement(plugin); - callback(url, "video/mp4") - } - } - function loadVideos(container, odffragment, stylesheet) { - var i, plugins, node; - function loadVideo(name, container, node, stylesheet) { - loadingQueue.addToQueue(function() { - setVideo(name, container, node, stylesheet) - }) - } - plugins = odffragment.getElementsByTagNameNS(drawns, "plugin"); - runtime.log("Loading Videos:"); - for(i = 0;i < plugins.length;i += 1) { - runtime.log("...Found a video."); - node = plugins.item(i); - loadVideo("video" + String(i), container, node, stylesheet) - } - } - function addStyleSheet(document) { - var styles = document.getElementsByTagName("style"), head = document.getElementsByTagName("head")[0], text = "", prefix, a = "", b; - if(styles && styles.length > 0) { - styles = styles[0].cloneNode(false) - }else { - styles = document.createElement("style") - } - for(prefix in namespaces) { - if(namespaces.hasOwnProperty(prefix) && prefix) { - text += "@namespace " + prefix + " url(" + namespaces[prefix] + ");\n" - } - } - styles.appendChild(document.createTextNode(text)); - head.appendChild(styles); - return styles - } - odf.OdfCanvas = function OdfCanvas(element) { - var self = this, document = element.ownerDocument, odfcontainer, formatting = new odf.Formatting, selectionWatcher = new SelectionWatcher(element), slidecssindex = 0, pageSwitcher = new PageSwitcher(addStyleSheet(document)), stylesxmlcss = addStyleSheet(document), positioncss = addStyleSheet(document), editable = false, zoomLevel = 1; - function fixContainerSize() { - var sizer = element.firstChild, odfdoc = sizer.firstChild; - if(!odfdoc) { - return - } - element.style.WebkitTransform = "scale(" + zoomLevel + ")"; - element.style.WebkitTransformOrigin = "left top"; - element.style.width = Math.round(zoomLevel * odfdoc.offsetWidth) + "px"; - element.style.height = Math.round(zoomLevel * odfdoc.offsetHeight) + "px" - } - function handleContent(container, odfnode) { - var css = positioncss.sheet, sizer; - modifyImages(container, odfnode.body, css); - css.insertRule("draw|page { background-color:#fff; }", css.cssRules.length); - clear(element); - sizer = document.createElement("div"); - sizer.style.display = "inline-block"; - sizer.style.background = "white"; - sizer.appendChild(odfnode); - element.appendChild(sizer); - loadImages(container, odfnode.body, css); - loadVideos(container, odfnode.body, css); - fixContainerSize() - } - function refreshOdf(container) { - if(odfcontainer !== container) { - return - } - function callback() { - clear(element); - element.style.display = "inline-block"; - var odfnode = container.rootElement; - element.ownerDocument.importNode(odfnode, true); - formatting.setOdfContainer(container); - handleStyles(odfnode, stylesxmlcss); - handleContent(container, odfnode); - fireEvent("statereadychange") - } - if(odfcontainer.state === odf.OdfContainer.DONE) { - callback() - }else { - odfcontainer.onchange = callback - } - } - this.odfContainer = function() { - return odfcontainer - }; - this.slidevisibilitycss = function() { - return pageSwitcher.css - }; - this["load"] = this.load = function(url) { - loadingQueue.clearQueue(); - element.innerHTML = "loading " + url; - odfcontainer = new odf.OdfContainer(url, function(container) { - odfcontainer = container; - refreshOdf(container) - }); - odfcontainer.onstatereadychange = refreshOdf - }; - function stopEditing() { - if(!editparagraph) { - return - } - var fragment = editparagraph.ownerDocument.createDocumentFragment(); - while(editparagraph.firstChild) { - fragment.insertBefore(editparagraph.firstChild, null) - } - editparagraph.parentNode.replaceChild(fragment, editparagraph) - } - this.save = function(callback) { - stopEditing(); - odfcontainer.save(callback) - }; - function cancelPropagation(event) { - if(event.stopPropagation) { - event.stopPropagation() - }else { - event.cancelBubble = true - } - } - function cancelEvent(event) { - if(event.preventDefault) { - event.preventDefault(); - event.stopPropagation() - }else { - event.returnValue = false; - event.cancelBubble = true - } - } - this.setEditable = function(iseditable) { - editable = iseditable; - if(!editable) { - stopEditing() - } - }; - function processClick(evt) { - evt = evt || window.event; - var e = evt.target, selection = window.getSelection(), range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null, startContainer = range && range.startContainer, startOffset = range && range.startOffset, endContainer = range && range.endContainer, endOffset = range && range.endOffset; - while(e && !((e.localName === "p" || e.localName === "h") && e.namespaceURI === textns)) { - e = e.parentNode - } - if(!editable) { - return - } - if(!e || e.parentNode === editparagraph) { - return - } - if(!editparagraph) { - editparagraph = e.ownerDocument.createElement("p"); - if(!editparagraph.style) { - editparagraph = e.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "p") - } - editparagraph.style.margin = "0px"; - editparagraph.style.padding = "0px"; - editparagraph.style.border = "0px"; - editparagraph.setAttribute("contenteditable", true) - }else { - if(editparagraph.parentNode) { - stopEditing() - } - } - e.parentNode.replaceChild(editparagraph, e); - editparagraph.appendChild(e); - editparagraph.focus(); - if(range) { - selection.removeAllRanges(); - range = e.ownerDocument.createRange(); - range.setStart(startContainer, startOffset); - range.setEnd(endContainer, endOffset); - selection.addRange(range) - } - cancelEvent(evt) - } - this.addListener = function(eventName, handler) { - if(eventName === "selectionchange") { - selectionWatcher.addListener(eventName, handler) - }else { - addEventListener(eventName, handler) - } - }; - this.getFormatting = function() { - return formatting - }; - this.setZoomLevel = function(zoom) { - zoomLevel = zoom; - fixContainerSize() - }; - this.getZoomLevel = function() { - return zoomLevel - }; - this.fitToContainingElement = function(width, height) { - var realWidth = element.offsetWidth / zoomLevel, realHeight = element.offsetHeight / zoomLevel; - zoomLevel = width / realWidth; - if(height / realHeight < zoomLevel) { - zoomLevel = height / realHeight - } - fixContainerSize() - }; - this.fitToWidth = function(width) { - var realWidth = element.offsetWidth / zoomLevel; - zoomLevel = width / realWidth; - fixContainerSize() - }; - this.fitToHeight = function(height) { - var realHeight = element.offsetHeight / zoomLevel; - zoomLevel = height / realHeight; - fixContainerSize() - }; - this.showNextPage = function() { - pageSwitcher.showNextPage() - }; - this.showPreviousPage = function() { - pageSwitcher.showPreviousPage() - }; - this.showAllPages = function() { - }; - listenEvent(element, "click", processClick) - }; - return odf.OdfCanvas -}(); -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); -gui.PresenterUI = function() { - var s2css = new odf.Style2CSS, xpath = new xmldom.XPath, nsResolver = s2css.namespaceResolver; - return function PresenterUI(odf_element) { - var self = this; - self.setInitialSlideMode = function() { - self.startSlideMode("single") - }; - self.keyDownHandler = function(ev) { - if(ev.target.isContentEditable) { - return - } - if(ev.target.nodeName === "input") { - return - } - switch(ev.keyCode) { - case 84: - self.toggleToolbar(); - break; - case 37: - ; - case 8: - self.prevSlide(); - break; - case 39: - ; - case 32: - self.nextSlide(); - break; - case 36: - self.firstSlide(); - break; - case 35: - self.lastSlide(); - break - } - }; - self.root = function() { - return self.odf_canvas.odfContainer().rootElement - }; - self.firstSlide = function() { - self.slideChange(function(old, pc) { - return 0 - }) - }; - self.lastSlide = function() { - self.slideChange(function(old, pc) { - return pc - 1 - }) - }; - self.nextSlide = function() { - self.slideChange(function(old, pc) { - return old + 1 < pc ? old + 1 : -1 - }) - }; - self.prevSlide = function() { - self.slideChange(function(old, pc) { - return old < 1 ? -1 : old - 1 - }) - }; - self.slideChange = function(indexChanger) { - var pages = self.getPages(self.odf_canvas.odfContainer().rootElement), last = -1, i = 0, newidx, pagelist; - pages.forEach(function(tuple) { - var name = tuple[0], node = tuple[1]; - if(node.hasAttribute("slide_current")) { - last = i; - node.removeAttribute("slide_current") - } - i += 1 - }); - newidx = indexChanger(last, pages.length); - if(newidx === -1) { - newidx = last - } - pages[newidx][1].setAttribute("slide_current", "1"); - pagelist = document.getElementById("pagelist"); - pagelist.selectedIndex = newidx; - if(self.slide_mode === "cont") { - window.scrollBy(0, pages[newidx][1].getBoundingClientRect().top - 30) - } - }; - self.selectSlide = function(idx) { - self.slideChange(function(old, pc) { - if(idx >= pc) { - return-1 - } - if(idx < 0) { - return-1 - } - return idx - }) - }; - self.scrollIntoContView = function(idx) { - var pages = self.getPages(self.odf_canvas.odfContainer().rootElement); - if(pages.length === 0) { - return - } - window.scrollBy(0, pages[idx][1].getBoundingClientRect().top - 30) - }; - self.getPages = function(root) { - var pagenodes = root.getElementsByTagNameNS(nsResolver("draw"), "page"), pages = [], i; - for(i = 0;i < pagenodes.length;i += 1) { - pages.push([pagenodes[i].getAttribute("draw:name"), pagenodes[i]]) - } - return pages - }; - self.fillPageList = function(odfdom_root, html_select) { - var pages = self.getPages(odfdom_root), i, html_option, res, page_denom; - while(html_select.firstChild) { - html_select.removeChild(html_select.firstChild) - } - for(i = 0;i < pages.length;i += 1) { - html_option = document.createElement("option"); - res = xpath.getODFElementsWithXPath(pages[i][1], './draw:frame[@presentation:class="title"]//draw:text-box/text:p', xmldom.XPath); - page_denom = res.length > 0 ? res[0].textContent : pages[i][0]; - html_option.textContent = i + 1 + ": " + page_denom; - html_select.appendChild(html_option) - } - }; - self.startSlideMode = function(mode) { - var pagelist = document.getElementById("pagelist"), css = self.odf_canvas.slidevisibilitycss().sheet; - self.slide_mode = mode; - while(css.cssRules.length > 0) { - css.deleteRule(0) - } - self.selectSlide(0); - if(self.slide_mode === "single") { - css.insertRule("draw|page { position:fixed; left:0px;top:30px; z-index:1; }", 0); - css.insertRule("draw|page[slide_current] { z-index:2;}", 1); - css.insertRule("draw|page { -webkit-transform: scale(1);}", 2); - self.fitToWindow(); - window.addEventListener("resize", self.fitToWindow, false) - }else { - if(self.slide_mode === "cont") { - window.removeEventListener("resize", self.fitToWindow, false) - } - } - self.fillPageList(self.odf_canvas.odfContainer().rootElement, pagelist) - }; - self.toggleToolbar = function() { - var css, found, i; - css = self.odf_canvas.slidevisibilitycss().sheet; - found = -1; - for(i = 0;i < css.cssRules.length;i += 1) { - if(css.cssRules[i].cssText.substring(0, 8) === ".toolbar") { - found = i; - break - } - } - if(found > -1) { - css.deleteRule(found) - }else { - css.insertRule(".toolbar { position:fixed; left:0px;top:-200px; z-index:0; }", 0) - } - }; - self.fitToWindow = function() { - function ruleByFactor(f) { - return"draw|page { \n" + "-moz-transform: scale(" + f + "); \n" + "-moz-transform-origin: 0% 0%; " + "-webkit-transform-origin: 0% 0%; -webkit-transform: scale(" + f + "); " + "-o-transform-origin: 0% 0%; -o-transform: scale(" + f + "); " + "-ms-transform-origin: 0% 0%; -ms-transform: scale(" + f + "); " + "}" - } - var pages = self.getPages(self.root()), factorVert = (window.innerHeight - 40) / pages[0][1].clientHeight, factorHoriz = (window.innerWidth - 10) / pages[0][1].clientWidth, factor = factorVert < factorHoriz ? factorVert : factorHoriz, css = self.odf_canvas.slidevisibilitycss().sheet; - css.deleteRule(2); - css.insertRule(ruleByFactor(factor), 2) - }; - self.load = function(url) { - self.odf_canvas.load(url) - }; - self.odf_element = odf_element; - self.odf_canvas = new odf.OdfCanvas(self.odf_element); - self.odf_canvas.addListener("statereadychange", self.setInitialSlideMode); - self.slide_mode = "undefined"; - document.addEventListener("keydown", self.keyDownHandler, false) - } -}(); -gui.Caret = function Caret(selection, rootNode) { - var document = rootNode.ownerDocument, cursorns, cursorNode; - cursorns = "urn:webodf:names:cursor"; - cursorNode = document.createElementNS(cursorns, "cursor"); - this.updateToSelection = function() { - var range; - if(selection.rangeCount === 1) { - range = selection.getRangeAt(0) - } - } -}; -runtime.loadClass("core.Cursor"); -gui.SelectionMover = function SelectionMover(selection, pointWalker) { - var doc = pointWalker.node().ownerDocument, cursor = new core.Cursor(selection, doc); - function getActiveRange(node) { - var range; - if(selection.rangeCount === 0) { - selection.addRange(node.ownerDocument.createRange()) - } - return selection.getRangeAt(selection.rangeCount - 1) - } - function setStart(node, offset) { - var ranges = [], i, range; - for(i = 0;i < selection.rangeCount;i += 1) { - ranges[i] = selection.getRangeAt(i) - } - selection.removeAllRanges(); - if(ranges.length === 0) { - ranges[0] = node.ownerDocument.createRange() - } - ranges[ranges.length - 1].setStart(pointWalker.node(), pointWalker.position()); - for(i = 0;i < ranges.length;i += 1) { - selection.addRange(ranges[i]) - } - } - function doMove(extend, move) { - if(selection.rangeCount === 0) { - return - } - var range = selection.getRangeAt(0), element; - if(!range.startContainer || range.startContainer.nodeType !== 1) { - return - } - element = range.startContainer; - pointWalker.setPoint(element, range.startOffset); - move(); - setStart(pointWalker.node(), pointWalker.position()) - } - function doMoveForward(extend, move) { - if(selection.rangeCount === 0) { - return - } - move(); - var range = selection.getRangeAt(0), element; - if(!range.startContainer || range.startContainer.nodeType !== 1) { - return - } - element = range.startContainer; - pointWalker.setPoint(element, range.startOffset) - } - function moveCursor(node, offset, selectMode) { - if(selectMode) { - selection.extend(node, offset) - }else { - selection.collapse(node, offset) - } - cursor.updateToSelection() - } - function moveCursorLeft() { - var element; - if(!selection.focusNode || selection.focusNode.nodeType !== 1) { - return - } - element = selection.focusNode; - pointWalker.setPoint(element, selection.focusOffset); - pointWalker.stepBackward(); - moveCursor(pointWalker.node(), pointWalker.position(), false) - } - function moveCursorRight() { - cursor.remove(); - var element; - if(!selection.focusNode || selection.focusNode.nodeType !== 1) { - return - } - element = selection.focusNode; - pointWalker.setPoint(element, selection.focusOffset); - pointWalker.stepForward(); - moveCursor(pointWalker.node(), pointWalker.position(), false) - } - function moveCursorUp() { - var rect = cursor.getNode().getBoundingClientRect(), x = rect.left, y = rect.top, arrived = false, left = 200; - while(!arrived && left) { - left -= 1; - moveCursorLeft(); - rect = cursor.getNode().getBoundingClientRect(); - arrived = rect.top !== y && rect.left < x - } - } - function moveCursorDown() { - cursor.updateToSelection(); - var rect = cursor.getNode().getBoundingClientRect(), x = rect.left, y = rect.top, arrived = false, left = 200; - while(!arrived) { - left -= 1; - moveCursorRight(); - rect = cursor.getNode().getBoundingClientRect(); - arrived = rect.top !== y && rect.left > x - } - } - this.movePointForward = function(extend) { - doMove(extend, pointWalker.stepForward) - }; - this.movePointBackward = function(extend) { - doMove(extend, pointWalker.stepBackward) - }; - this.moveLineForward = function(extend) { - if(selection.modify) { - selection.modify(extend ? "extend" : "move", "forward", "line") - }else { - doMove(extend, moveCursorDown) - } - }; - this.moveLineBackward = function(extend) { - if(selection.modify) { - selection.modify(extend ? "extend" : "move", "backward", "line") - }else { - doMove(extend, function() { - }) - } - }; - return this -}; -runtime.loadClass("core.PointWalker"); -runtime.loadClass("core.Cursor"); -gui.XMLEdit = function XMLEdit(element, stylesheet) { - var simplecss, cssprefix, documentElement, customNS = "customns", walker = null; - if(!element.id) { - element.id = "xml" + String(Math.random()).substring(2) - } - cssprefix = "#" + element.id + " "; - function installHandlers() { - } - simplecss = cssprefix + "*," + cssprefix + ":visited, " + cssprefix + ":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n" + cssprefix + ":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n" + cssprefix + ":after {color: blue; content: '';}\n" + - cssprefix + "{overflow: auto;}\n"; - function listenEvent(eventTarget, eventType, eventHandler) { - if(eventTarget.addEventListener) { - eventTarget.addEventListener(eventType, eventHandler, false) - }else { - if(eventTarget.attachEvent) { - eventType = "on" + eventType; - eventTarget.attachEvent(eventType, eventHandler) - }else { - eventTarget["on" + eventType] = eventHandler - } - } - } - function cancelEvent(event) { - if(event.preventDefault) { - event.preventDefault() - }else { - event.returnValue = false - } - } - function isCaretMoveCommand(charCode) { - if(charCode >= 16 && charCode <= 20) { - return true - } - if(charCode >= 33 && charCode <= 40) { - return true - } - return false - } - function syncSelectionWithWalker() { - var sel = element.ownerDocument.defaultView.getSelection(), r; - if(!sel || sel.rangeCount <= 0 || !walker) { - return - } - r = sel.getRangeAt(0); - walker.setPoint(r.startContainer, r.startOffset) - } - function syncWalkerWithSelection() { - var sel = element.ownerDocument.defaultView.getSelection(), n, r; - sel.removeAllRanges(); - if(!walker || !walker.node()) { - return - } - n = walker.node(); - r = n.ownerDocument.createRange(); - r.setStart(n, walker.position()); - r.collapse(true); - sel.addRange(r) - } - function handleKeyDown(event) { - var charCode = event.charCode || event.keyCode; - walker = null; - if(walker && charCode === 39) { - syncSelectionWithWalker(); - walker.stepForward(); - syncWalkerWithSelection() - }else { - if(walker && charCode === 37) { - syncSelectionWithWalker(); - walker.stepBackward(); - syncWalkerWithSelection() - }else { - if(isCaretMoveCommand(charCode)) { - return - } - } - } - cancelEvent(event) - } - function handleKeyPress(event) { - } - function handleClick(event) { - var sel = element.ownerDocument.defaultView.getSelection(), r = sel.getRangeAt(0), n = r.startContainer; - cancelEvent(event) - } - function initElement(element) { - listenEvent(element, "click", handleClick); - listenEvent(element, "keydown", handleKeyDown); - listenEvent(element, "keypress", handleKeyPress); - listenEvent(element, "drop", cancelEvent); - listenEvent(element, "dragend", cancelEvent); - listenEvent(element, "beforepaste", cancelEvent); - listenEvent(element, "paste", cancelEvent) - } - function cleanWhitespace(node) { - var n = node.firstChild, p, re = /^\s*$/; - while(n && n !== node) { - p = n; - n = n.nextSibling || n.parentNode; - if(p.nodeType === 3 && re.test(p.nodeValue)) { - p.parentNode.removeChild(p) - } - } - } - function setCssHelperAttributes(node) { - var atts, attsv, a, i; - atts = node.attributes; - attsv = ""; - for(i = atts.length - 1;i >= 0;i -= 1) { - a = atts.item(i); - attsv = attsv + " " + a.nodeName + '="' + a.nodeValue + '"' - } - node.setAttribute("customns_name", node.nodeName); - node.setAttribute("customns_atts", attsv) - } - function addExplicitAttributes(node) { - var n = node.firstChild; - while(n && n !== node) { - if(n.nodeType === 1) { - addExplicitAttributes(n) - } - n = n.nextSibling || n.parentNode - } - setCssHelperAttributes(node); - cleanWhitespace(node) - } - function getNamespacePrefixes(node, prefixes) { - var n = node.firstChild, atts, att, i; - while(n && n !== node) { - if(n.nodeType === 1) { - getNamespacePrefixes(n, prefixes); - atts = n.attributes; - for(i = atts.length - 1;i >= 0;i -= 1) { - att = atts.item(i); - if(att.namespaceURI === "http://www.w3.org/2000/xmlns/") { - if(!prefixes[att.nodeValue]) { - prefixes[att.nodeValue] = att.localName - } - } - } - } - n = n.nextSibling || n.parentNode - } - } - function generateUniquePrefixes(prefixes) { - var taken = {}, ns, p, n = 0; - for(ns in prefixes) { - if(prefixes.hasOwnProperty(ns) && ns) { - p = prefixes[ns]; - if(!p || taken.hasOwnProperty(p) || p === "xmlns") { - do { - p = "ns" + n; - n += 1 - }while(taken.hasOwnProperty(p)); - prefixes[ns] = p - } - taken[p] = true - } - } - } - function createCssFromXmlInstance(node) { - var prefixes = {}, css = "@namespace customns url(customns);\n", name, pre, ns, names, csssel; - getNamespacePrefixes(node, prefixes); - generateUniquePrefixes(prefixes); - return css - } - function updateCSS() { - var css = element.ownerDocument.createElement("style"), text = createCssFromXmlInstance(element); - css.type = "text/css"; - text = text + simplecss; - css.appendChild(element.ownerDocument.createTextNode(text)); - stylesheet = stylesheet.parentNode.replaceChild(css, stylesheet) - } - function getXML() { - return documentElement - } - function setXML(xml) { - var node = xml.documentElement || xml; - node = element.ownerDocument.importNode(node, true); - documentElement = node; - addExplicitAttributes(node); - while(element.lastChild) { - element.removeChild(element.lastChild) - } - element.appendChild(node); - updateCSS(); - walker = new core.PointWalker(node) - } - initElement(element); - this.updateCSS = updateCSS; - this.setXML = setXML; - this.getXML = getXML -}; -(function() { - return["core/Async.js", "core/Base64.js", "core/ByteArray.js", "core/ByteArrayWriter.js", "core/Cursor.js", "core/JSLint.js", "core/PointWalker.js", "core/RawDeflate.js", "core/RawInflate.js", "core/UnitTester.js", "core/Zip.js", "gui/Caret.js", "gui/SelectionMover.js", "gui/XMLEdit.js", "gui/PresenterUI.js", "odf/FontLoader.js", "odf/Formatting.js", "odf/OdfCanvas.js", "odf/OdfContainer.js", "odf/Style2CSS.js", "odf/StyleInfo.js", "xmldom/LSSerializer.js", "xmldom/LSSerializerFilter.js", "xmldom/OperationalTransformDOM.js", - "xmldom/OperationalTransformInterface.js", "xmldom/RelaxNG.js", "xmldom/RelaxNG2.js", "xmldom/RelaxNGParser.js", "xmldom/XPath.js"] -})(); - diff --git a/apps/files_odfviewer/js/webodf.js b/apps/files_odfviewer/js/webodf.js deleted file mode 100644 index 1b85527260..0000000000 --- a/apps/files_odfviewer/js/webodf.js +++ /dev/null @@ -1,343 +0,0 @@ -// Input 0 -/* - - @licstart - The JavaScript code in this page is free software: you can redistribute it - and/or modify it under the terms of the GNU Affero General Public License - (GNU AGPL) as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. The code is distributed - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - - As additional permission under GNU AGPL version 3 section 7, you - may distribute non-source (e.g., minimized or compacted) forms of - that code without the copy of the GNU GPL normally required by - section 4, provided you include this license notice and a URL - through which recipients can access the Corresponding Source. - - As a special exception to the AGPL, any HTML file which merely makes function - calls to this code, and for that purpose includes it by reference shall be - deemed a separate work for copyright law purposes. In addition, the copyright - holders of this code give you permission to combine this code with free - software libraries that are released under the GNU LGPL. You may copy and - distribute such a system following the terms of the GNU AGPL for this code - and the LGPL for the libraries. If you modify this code, you may extend this - exception to your version of the code, but you are not obligated to do so. - If you do not wish to do so, delete this exception statement from your - version. - - This license applies to this entire compilation. - @licend - @source: http://www.webodf.org/ - @source: http://gitorious.org/odfkit/webodf/ -*/ -var core={},gui={},xmldom={},odf={}; -// Input 1 -function Runtime(){}Runtime.ByteArray=function(){};Runtime.ByteArray.prototype.slice=function(){};Runtime.prototype.byteArrayFromArray=function(){};Runtime.prototype.byteArrayFromString=function(){};Runtime.prototype.byteArrayToString=function(){};Runtime.prototype.concatByteArrays=function(){};Runtime.prototype.read=function(){};Runtime.prototype.readFile=function(){};Runtime.prototype.readFileSync=function(){};Runtime.prototype.loadXML=function(){};Runtime.prototype.writeFile=function(){}; -Runtime.prototype.isFile=function(){};Runtime.prototype.getFileSize=function(){};Runtime.prototype.deleteFile=function(){};Runtime.prototype.log=function(){};Runtime.prototype.setTimeout=function(){};Runtime.prototype.libraryPaths=function(){};Runtime.prototype.type=function(){};Runtime.prototype.getDOMImplementation=function(){};Runtime.prototype.getWindow=function(){};var IS_COMPILED_CODE=!0; -Runtime.byteArrayToString=function(j,l){function f(c){var b="",d,a=c.length;for(d=0;de?b+=String.fromCharCode(e):(d+=1,i=c[d],224>e?b+=String.fromCharCode((e&31)<<6|i&63):(d+=1,h=c[d],b+=String.fromCharCode((e&15)<<12|(i&63)<<6|h&63)));return b}var a;"utf8"===l?a=g(j):("binary"!==l&&this.log("Unsupported encoding: "+l),a=f(j));return a}; -Runtime.getFunctionName=function(j){return void 0===j.name?(j=/function\s+(\w+)/.exec(j))&&j[1]:j.name}; -function BrowserRuntime(j){function l(c,b){var d,a,e;b?e=c:b=c;j?(a=j.ownerDocument,e&&(d=a.createElement("span"),d.className=e,d.appendChild(a.createTextNode(e)),j.appendChild(d),j.appendChild(a.createTextNode(" "))),d=a.createElement("span"),d.appendChild(a.createTextNode(b)),j.appendChild(d),j.appendChild(a.createElement("br"))):console&&console.log(b)}var f=this,g={},a=window.ArrayBuffer&&window.Uint8Array;this.ByteArray=a?function(c){Uint8Array.prototype.slice=function(b,c){void 0===c&&(void 0=== -b&&(b=0),c=this.length);var a=this.subarray(b,c),e,i,c=c-b;e=new Uint8Array(new ArrayBuffer(c));for(i=0;ii?(a[h]=i,h+=1):2048>i?(a[h]=192|i>>>6,a[h+1]=128|i&63,h+=2):(a[h]=224|i>>>12&15,a[h+1]=128|i>>>6&63,a[h+2]=128|i&63,h+=3)}else{"binary"!==b&&f.log("unknown encoding: "+b);d=c.length;a=new f.ByteArray(d);for(e=0;ek.status||0===k.status?a(null):a("Status "+k.status+": "+k.responseText||k.statusText))};b=b.buffer&&!k.sendAsBinary?b.buffer:f.byteArrayToString(b,"binary");try{k.sendAsBinary?k.sendAsBinary(b):k.send(b)}catch(e){f.log("HUH? "+e+" "+b),a(e.message)}};this.deleteFile=function(a,b){var d=new XMLHttpRequest;d.open("DELETE",a,!0);d.onreadystatechange=function(){4===d.readyState&&(200>d.status&&300<= -d.status?b(d.responseText):b(null))};d.send(null)};this.loadXML=function(a,b){var d=new XMLHttpRequest;d.open("GET",a,!0);d.overrideMimeType&&d.overrideMimeType("text/xml");d.onreadystatechange=function(){4===d.readyState&&(0===d.status&&!d.responseText?b("File "+a+" is empty."):200===d.status||0===d.status?b(null,d.responseXML):b(d.responseText))};try{d.send(null)}catch(k){b(k.message)}};this.isFile=function(a,b){f.getFileSize(a,function(a){b(-1!==a)})};this.getFileSize=function(a,b){var d=new XMLHttpRequest; -d.open("HEAD",a,!0);d.onreadystatechange=function(){if(4===d.readyState){var a=d.getResponseHeader("Content-Length");a?b(parseInt(a,10)):b(-1)}};d.send(null)};this.log=l;this.setTimeout=function(a,b){setTimeout(function(){a()},b)};this.libraryPaths=function(){return["lib"]};this.setCurrentDirectory=function(){};this.type=function(){return"BrowserRuntime"};this.getDOMImplementation=function(){return window.document.implementation};this.exit=function(a){l("Calling exit with code "+a+", but exit() is not implemented.")}; -this.getWindow=function(){return window}} -function NodeJSRuntime(){var j=require("fs"),l="";this.ByteArray=function(f){return new Buffer(f)};this.byteArrayFromArray=function(f){var g=new Buffer(f.length),a,c=f.length;for(a=0;a>>18],c+=u[b>>>12&63],c+=u[b>>>6&63],c+=u[b&63];e===d+1?(b=a[e]<<4,c+=u[b>>>6],c+=u[b&63],c+="=="):e===d&&(b=a[e]<<10|a[e+1]<<2,c+=u[b>>>12],c+=u[b>>>6&63],c+=u[b&63],c+="=");return c}function f(a){var a=a.replace(/[^A-Za-z0-9+\/]+/g,""),b=[],c=a.length%4,e,d=a.length,i;for(e=0;e>16,i>>8&255,i&255);b.length-=[0,0,2,1][c];return b}function g(a){var b=[],c,e=a.length,d;for(c=0;cd?b.push(d):2048>d?b.push(192|d>>>6,128|d&63):b.push(224|d>>>12&15,128|d>>>6&63,128|d&63);return b}function a(a){var b=[],c,e=a.length,d,i,m;for(c=0;cd?b.push(d):(c+=1,i=a[c],224>d?b.push((d&31)<<6|i&63):(c+=1,m=a[c],b.push((d&15)<<12|(i&63)<<6|m&63)));return b}function c(a){return l(j(a))} -function b(a){return String.fromCharCode.apply(String,f(a))}function d(b){return a(j(b))}function k(b){for(var b=a(b),c="",e=0;eb?e+=String.fromCharCode(b):(m+=1,d=a.charCodeAt(m)&255,224>b?e+=String.fromCharCode((b&31)<<6|d&63):(m+=1,i=a.charCodeAt(m)&255,e+=String.fromCharCode((b&15)<<12|(d&63)<<6|i&63)));return e}function i(a,b){function c(){var m= -n+d;m>a.length&&(m=a.length);i+=e(a,n,m);n=m;m=n===a.length;b(i,m)&&!m&&runtime.setTimeout(c,0)}var d=1E5,i="",n=0;a.lengthb;b+=1)a.push(65+b);for(b=0;26>b;b+=1)a.push(97+b);for(b= -0;10>b;b+=1)a.push(48+b);a.push(43);a.push(47);return a})();var s=function(a){var b={},c,e;c=0;for(e=a.length;c>>8):(la(b&255),la(b>>>8))},na=function(){q=(q<<5^o[m+3-1]&255)&8191;x=p[32768+q];p[m&32767]=x;p[32768+q]=m},Q=function(a,b){B>16-b?(w|=a<>16-B,B+=b-16):(w|=a<a;a++)o[a]=o[a+32768];t-=32768;m-=32768;A-=32768;for(a=0;8192>a;a++)b=p[32768+a],p[32768+a]=32768<=b?b-32768:0;for(a=0;32768>a;a++)b=p[a],p[a]=32768<=b?b-32768:0;c+=32768}r||(a=xa(o,m+y,c),0>=a?r=!0:y+=a)},ya=function(a){var b=L,c=m,e,d=F,i=32506=N&&(b>>=2);do if(e=a,!(o[e+d]!==h||o[e+d-1]!==n||o[e]!==o[c]||o[++e]!==o[c+1])){c+=2;e++;do++c; -while(o[c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&cd){t=a;d=e;if(258<=e)break;n=o[c+d-1];h=o[c+d]}}while((a=p[a&32767])>i&&0!==--b);return d},ga=function(a,b){s[P++]=b;0===a?v[b].fc++:(a--,v[$[b]+256+1].fc++,J[(256>a?Y[a]:Y[256+(a>>7)])&255].fc++,u[ia++]=a,aa|=ea);ea<<=1;0===(P&7)&&(da[pa++]=aa,aa=0,ea=1);if(2d;d++)c+=J[d].fc*(5+fa[d]); -c>>=3;if(ia>=1,c<<=1;while(0<--b);return c>>1},Aa=function(a,b){var c=[];c.length=16;var e=0,d;for(d=1;15>=d;d++)e=e+M[d-1]<<1,c[d]=e;for(e=0;e<=b;e++)d=a[e].dl,0!==d&&(a[e].fc=za(c[d]++,d))},ua=function(a){var b=a.dyn_tree,c=a.static_tree,e=a.elems,d,m=-1,i=e;V=0; -Z=573;for(d=0;dV;)d=I[++V]=2>m?++m:0,b[d].fc=1,S[d]=0,W--,null!==c&&(ba-=c[d].dl);a.max_code=m;for(d=V>>1;1<=d;d--)ta(b,d);do d=I[1],I[1]=I[V--],ta(b,1),c=I[1],I[--Z]=d,I[--Z]=c,b[i].fc=b[d].fc+b[c].fc,S[i]=S[d]>S[c]+1?S[d]:S[c]+1,b[d].dl=b[c].dl=i,I[1]=i++,ta(b,1);while(2<=V);I[--Z]=I[1];i=a.dyn_tree;d=a.extra_bits;var e=a.extra_base,c=a.max_code,r=a.max_length,n=a.static_tree,t,h,f,k,q=0;for(h=0;15>=h;h++)M[h]=0;i[I[Z]].dl=0;for(a=Z+1;573> -a;a++)if(t=I[a],h=i[i[t].dl].dl+1,h>r&&(h=r,q++),i[t].dl=h,!(t>c))M[h]++,f=0,t>=e&&(f=d[t-e]),k=i[t].fc,W+=k*(h+f),null!==n&&(ba+=k*(n[t].dl+f));if(0!==q){do{for(h=r-1;0===M[h];)h--;M[h]--;M[h+1]+=2;M[r]--;q-=2}while(0c||(i[d].dl!==h&&(W+=(h-i[d].dl)*i[d].fc,i[d].fc=h),t--)}Aa(b,m)},Ba=function(a,b){var c,e=-1,d,m=a[0].dl,i=0,h=7,r=4;0===m&&(h=138,r=3);a[b+1].dl=65535;for(c=0;c<=b;c++)if(d=m,m=a[c+1].dl,!(++i=i?K[17].fc++:K[18].fc++,i=0,e=d,0===m)?(h=138,r=3):d===m?(h=6,r=3):(h=7,r=4)},Ca=function(){8c?Y[c]:Y[256+(c>>7)])&255,X(h,b),r=fa[h],0!==r)c-=ca[h],Q(c,r);i>>=1}while(e=i?(X(17,K),Q(i-3,3)):(X(18,K),Q(i-11,7));i=0;e=d;0===m?(h=138,r=3):d===m?(h=6,r=3):(h=7,r=4)}},Fa=function(){var a;for(a=0;286>a;a++)v[a].fc=0;for(a=0;30>a;a++)J[a].fc=0;for(a=0;19>a;a++)K[a].fc=0;v[256].fc=1;aa=P=ia=pa=W=ba=0;ea=1},oa=function(a){var b,c,e,d;d=m-A;da[pa]=aa;ua(H);ua(D);Ba(v,H.max_code);Ba(J,D.max_code);ua(U);for(e=18;3<=e&&0===K[va[e]].dl;e--);W+= -3*(e+1)+14;b=W+3+7>>3;c=ba+3+7>>3;c<=b&&(b=c);if(d+4<=b&&0<=A){Q(0+a,3);Ca();ma(d);ma(~d);for(e=0;eb.len&&(t=b.len);for(n=0;ni-h&&(t=i-h);for(n=0;ng;g++){ha[g]=f;for(d= -0;d<1<g;g++){ca[g]=f;for(d=0;d<1<>=7;30>g;g++){ca[g]=f<<7;for(d=0;d<1<=d;d++)M[d]=0;for(d=0;143>=d;)G[d++].dl=8,M[8]++;for(;255>=d;)G[d++].dl=9,M[9]++;for(;279>=d;)G[d++].dl=7,M[7]++;for(;287>=d;)G[d++].dl=8,M[8]++;Aa(G,287);for(d=0;30>d;d++)R[d].dl=5,R[d].fc=za(d,5);Fa()}for(d=0;8192>d;d++)p[32768+d]=0;T=ka[O].max_lazy;N=ka[O].good_length;L=ka[O].max_chain;A=m=0;y=xa(o,0,65536);if(0>=y)r=!0,y= -0;else{for(r=!1;262>y&&!r;)sa();for(d=q=0;2>d;d++)q=(q<<5^o[d]&255)&8191}b=null;h=i=0;3>=O?(F=2,z=0):(z=2,C=0);n=!1}k=!0;if(0===y)return n=!0,0}if((d=Ga(a,c,e))===e)return e;if(n)return d;if(3>=O)for(;0!==y&&null===b;){na();0!==x&&32506>=m-x&&(z=ya(x),z>y&&(z=y));if(3<=z)if(g=ga(m-t,z-3),y-=z,z<=T){z--;do m++,na();while(0!==--z);m++}else m+=z,z=0,q=o[m]&255,q=(q<<5^o[m+1]&255)&8191;else g=ga(0,o[m]&255),y--,m++;g&&(oa(0),A=m);for(;262>y&&!r;)sa()}else for(;0!==y&&null===b;){na();F=z;E=t;z=2;0!==x&& -F=m-x&&(z=ya(x),z>y&&(z=y),3===z&&4096y&&!r;)sa()}0===y&&(0!==C&&ga(0,o[m-1]&255),oa(1),n=!0);return d+Ga(a,d+c,e-d)};this.deflate=function(m,i){var h,t;ja=m;qa=0;"undefined"===typeof i&&(i=6);(h=i)?1>h?h=1:9h;h++)v[h]=new j;J=[];J.length=61;for(h=0;61>h;h++)J[h]=new j;G=[];G.length=288;for(h=0;288>h;h++)G[h]=new j;R=[];R.length=30;for(h=0;30>h;h++)R[h]=new j;K=[];K.length=39;for(h=0;39>h;h++)K[h]=new j;H=new l;D=new l;U=new l;M=[];M.length=16;I=[];I.length=573;S=[];S.length=573;$=[];$.length=256;Y=[];Y.length=512;ha=[];ha.length=29;ca=[];ca.length=30;da=[];da.length=1024}for(var n=Array(1024),f=[];0<(h=Ia(n,0,n.length));){var g=[];g.length=h;for(t= -0;t>8&255])};this.appendUInt32LE=function(f){l.appendArray([f&255,f>>8&255,f>>16&255,f>>24&255])};this.appendString=function(g){f=runtime.concatByteArrays(f, -runtime.byteArrayFromString(g,j))};this.getLength=function(){return f.length};this.getByteArray=function(){return f}}; -// Input 6 -core.RawInflate=function(){var j,l,f=null,g,a,c,b,d,k,e,i,h,n,o,u,s,p,w=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],B=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],A=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99],q=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],x=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],E=[16,17,18, -0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=function(){this.list=this.next=null},z=function(){this.n=this.b=this.e=0;this.t=null},F=function(a,b,c,d,e,m){this.BMAX=16;this.N_MAX=288;this.status=0;this.root=null;this.m=0;var h=Array(this.BMAX+1),i,r,t,n,f,k,g,q=Array(this.BMAX+1),o,j,p,y=new z,x=Array(this.BMAX);n=Array(this.N_MAX);var E,s=Array(this.BMAX+1),B,A,u;u=this.root=null;for(f=0;ff&&(m=f);for(B=1<(B-=h[k])){this.status=2;this.m=m;return}if(0>(B-=h[f]))this.status=2,this.m=m;else{h[f]+=B;s[1]=k=0;o=h;j=1;for(p=2;0<--f;)s[p++]=k+=o[j++];o=a;f=j=0;do if(0!=(k=o[j++]))n[s[k]++]=f;while(++fE+q[1+n];){E+=q[1+n];n++;A=(A=t-E)>m?m:A;if((r=1<<(k=g-E))>a+1){r-=a+1;for(p=g;++ki&&E>E-q[n],x[n-1][k].e=y.e,x[n-1][k].b=y.b,x[n-1][k].n=y.n,x[n-1][k].t=y.t)}y.b=g-E;j>=b?y.e=99:o[j]o[j]?16:15,y.n=o[j++]): -(y.e=e[o[j]-c],y.n=d[o[j++]-c]);r=1<>E;k>=1)f^=k;for(f^=k;(f&(1<>=a;b-=a},y=function(a,b,c){var f,k,g;if(0==c)return 0;for(g=0;;){m(o);k=h.list[t(o)];for(f=k.e;16e;e++)p[E[e]]= -0;o=7;e=new F(p,19,19,null,null,o);if(0!=e.status)return-1;h=e.root;o=e.m;i=g+j;for(d=f=0;de)p[d++]=f=e;else if(16==e){m(2);e=3+t(2);r(2);if(d+e>i)return-1;for(;0i)return-1;for(;0D;D++)H[D]=8;for(;256>D;D++)H[D]=9;for(;280>D;D++)H[D]=7;for(;288>D;D++)H[D]=8;a=7;D=new F(H,288,257,B,A,a);if(0!=D.status){alert("HufBuild error: "+D.status);G=-1;break b}f=D.root;a=D.m;for(D=0;30>D;D++)H[D]=5;L=5;D=new F(H,30,0,q,x,L);if(1e&&k.setStart(i,k.startOffset-1);k.endContainer===a?k.setEnd(i,e):k.endContainer===i&&k.endOffset>e&&k.setEnd(i,k.endOffset-1)}if(d){for(c=0;c1/f?"-0":""+f)+"."):j(c+" should be "+a+" (of type "+typeof a+"). Was "+f+" (of type "+typeof f+").")}var g=0;this.shouldBeNull=function(a,c){f(a,c,"null")};this.shouldBeNonNull=function(a,c){var b,d;try{d=eval(c)}catch(f){b=f}b?j(c+" should be non-null. Threw exception "+b):null!==d?runtime.log("pass",c+" is non-null."):j(c+" should be non-null. Was "+ -d)};this.shouldBe=f;this.countFailedTests=function(){return g}}; -core.UnitTester=function(){var j=0,l={};this.runTests=function(f,g){function a(b){if(0===b.length)l[c]=e,j+=d.countFailedTests(),g();else{h=b[0];var f=Runtime.getFunctionName(h);runtime.log("Running "+f);o=d.countFailedTests();k.setUp();h(function(){k.tearDown();e[f]=o===d.countFailedTests();a(b.slice(1))})}}var c=Runtime.getFunctionName(f),b,d=new core.UnitTestRunner,k=new f(d),e={},i,h,n,o;if(c.hasOwnProperty(l))runtime.log("Test "+c+" has already run.");else{runtime.log("Running "+c+": "+k.description()); -n=k.tests();for(i=0;i>>8^f;return c^-1}function g(a){return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&15,a>>5&63,(a&31)<<1)}function a(a){var b=a.getFullYear();return 1980>b?0:b-1980<< -25|a.getMonth()+1<<21|a.getDate()<<16|a.getHours()<<11|a.getMinutes()<<5|a.getSeconds()>>1}function c(a,b){var c,e,d,f,h,i,m,n=this;this.load=function(b){if(void 0!==n.data)b(null,n.data);else{var d=h+34+c+e+256;d+m>o&&(d=o-m);runtime.read(a,m,d,function(c,e){if(c)b(c,e);else a:{var d=e,m=new core.ByteArray(d),k=m.readUInt32LE(),g;if(67324752!==k)b("File entry signature is wrong."+k.toString()+" "+d.length.toString(),null);else{m.pos+=22;k=m.readUInt16LE();g=m.readUInt16LE();m.pos+=k+g;if(f){d=d.slice(m.pos, -m.pos+h);if(h!==d.length){b("The amount of compressed bytes read was "+d.length.toString()+" instead of "+h.toString()+" for "+n.filename+" in "+a+".",null);break a}d=s(d,i)}else d=d.slice(m.pos,m.pos+i);i!==d.length?b("The amount of bytes read was "+d.length.toString()+" instead of "+i.toString()+" for "+n.filename+" in "+a+".",null):(n.data=d,b(null,d))}}})}};this.set=function(a,b,c,e){n.filename=a;n.data=b;n.compressed=c;n.date=e};this.error=null;b&&(33639248!==b.readUInt32LE()?this.error="Central directory entry has wrong signature at position "+ -(b.pos-4).toString()+' for file "'+a+'": '+b.data.length.toString():(b.pos+=6,f=b.readUInt16LE(),this.date=g(b.readUInt32LE()),b.readUInt32LE(),h=b.readUInt32LE(),i=b.readUInt32LE(),c=b.readUInt16LE(),e=b.readUInt16LE(),d=b.readUInt16LE(),b.pos+=8,m=b.readUInt32LE(),this.filename=runtime.byteArrayToString(b.data.slice(b.pos,b.pos+c),"utf8"),b.pos+=c+e+d))}function b(a,b){if(22!==a.length)b("Central directory length should be 22.",p);else{var e=new core.ByteArray(a),d;d=e.readUInt32LE();101010256!== -d?b("Central directory signature is wrong: "+d.toString(),p):0!==e.readUInt16LE()?b("Zip files with non-zero disk numbers are not supported.",p):0!==e.readUInt16LE()?b("Zip files with non-zero disk numbers are not supported.",p):(d=e.readUInt16LE(),u=e.readUInt16LE(),d!==u?b("Number of entries is inconsistent.",p):(d=e.readUInt32LE(),e=e.readUInt16LE(),e=o-22-d,runtime.read(j,e,o-e,function(a,e){a:{var d=new core.ByteArray(e),f,m;n=[];for(f=0;fo?l("File '"+ -j+"' cannot be read.",p):runtime.read(j,o-22,22,function(a,c){a||null===l?l(a,p):b(c,l)})})}; -// Input 12 -xmldom.LSSerializerFilter=function(){}; -// Input 13 -"function"!==typeof Object.create&&(Object.create=function(j){var l=function(){};l.prototype=j;return new l}); -xmldom.LSSerializer=function(){function j(f,g){var a="",c=Object.create(f),b=l.filter?l.filter.acceptNode(g):1,d;if(1===b){d="";var k=g.attributes,e,i,h,n="",o;if(k){c[g.namespaceURI]!==g.prefix&&(c[g.namespaceURI]=g.prefix);d+="<"+g.nodeName;e=k.length;for(i=0;i"}a+=d}if(1===b||3===b){for(d=g.firstChild;d;)a+=j(c,d),d=d.nextSibling;g.nodeValue&&(a+=g.nodeValue)}1===b&&(c="",1===g.nodeType&&(c+=""),a+=c);return a}var l=this;this.filter=null;this.writeToString=function(f,g){if(!f)return"";var a;if(g){a=g;var c={},b;for(b in a)a.hasOwnProperty(b)&&(c[a[b]]=b);a=c}else a={};return j(a, -f)}}; -// Input 14 -xmldom.RelaxNGParser=function(){function j(a,b){this.message=function(){b&&(a+=1===b.nodeType?" Element ":" Node ",a+=b.nodeName,b.nodeValue&&(a+=" with value '"+b.nodeValue+"'"),a+=".");return a}}function l(a){if(2>=a.e.length)return a;var b={name:a.name,e:a.e.slice(0,2)};return l({name:a.name,e:[b].concat(a.e.slice(2))})}function f(a){var a=a.split(":",2),b="",c;1===a.length?a=["",a[0]]:b=a[0];for(c in d)d[c]===b&&(a[0]=c);return a}function g(a,b){for(var c=0,d,k,j=a.name;a.e&&c=c.length)return b;0===f&&(f=0);for(var h=c.item(f);h.namespaceURI===e;){f+=1;if(f>=c.length)return b;h=c.item(f)}return h=d(a,b.attDeriv(a,c.item(f)),c,f+1)}function k(a,b,c){c.e[0].a?(a.push(c.e[0].text),b.push(c.e[0].a.ns)):k(a,b,c.e[0]);c.e[1].a?(a.push(c.e[1].text),b.push(c.e[1].a.ns)): -k(a,b,c.e[1])}var e="http://www.w3.org/2000/xmlns/",i,h,n,o,u,s,p,w,B,A,q={type:"notAllowed",nullable:!1,hash:"notAllowed",textDeriv:function(){return q},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return q},endTagDeriv:function(){return q}},x={type:"empty",nullable:!0,hash:"empty",textDeriv:function(){return q},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return x},endTagDeriv:function(){return q}}, -E={type:"text",nullable:!0,hash:"text",textDeriv:function(){return E},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return E},endTagDeriv:function(){return q}},C,z,F;i=g("choice",function(a,b){if(a===q)return b;if(b===q||a===b)return a},function(b,c){var d={},e;a(d,{p1:b,p2:c});c=b=void 0;for(e in d)d.hasOwnProperty(e)&&(void 0===b?b=d[e]:c=void 0===c?d[e]:i(c,d[e]));return function(a,b){return{type:"choice",p1:a,p2:b,nullable:a.nullable||b.nullable, -textDeriv:function(c,d){return i(a.textDeriv(c,d),b.textDeriv(c,d))},startTagOpenDeriv:f(function(c){return i(a.startTagOpenDeriv(c),b.startTagOpenDeriv(c))}),attDeriv:function(c,d){return i(a.attDeriv(c,d),b.attDeriv(c,d))},startTagCloseDeriv:j(function(){return i(a.startTagCloseDeriv(),b.startTagCloseDeriv())}),endTagDeriv:j(function(){return i(a.endTagDeriv(),b.endTagDeriv())})}}(b,c)});h=function(a,b,c){return function(){var d={},e=0;return function(f,h){var i=b&&b(f,h),k,g;if(void 0!==i)return i; -i=f.hash||f.toString();k=h.hash||h.toString();i=f&&b.push(l(a.substring(c,d)))):"["===a[d]&&(0>=f&&(c=d+1),f+=1),d+=1;return d};f.prototype.next=function(){};f.prototype.reset=function(){};i=function(b,e,f){var g,h,i,j;for(g= -0;g text|list-item > text|list",c-=1;try{a.insertRule(b+ -" > list-item:before{"+d+"}",a.cssRules.length)}catch(e){throw e;}}function e(a,f,g,j){if("list"===f)for(var l=j.firstChild,m,t;l;){if(l.namespaceURI===n)if(m=l,"list-level-style-number"===l.localName){t=m;var r=t.getAttributeNS(h,"num-format"),o=t.getAttributeNS(h,"num-suffix"),s="",s={1:"decimal",a:"lower-latin",A:"upper-latin",i:"lower-roman",I:"upper-roman"},u="",u=t.getAttributeNS(h,"num-prefix")||"",u=s.hasOwnProperty(r)?u+(" counter(list, "+s[r]+")"):r?u+("'"+r+"';"):u+" ''";o&&(u+=" '"+o+ -"'");t=s="content: "+u+";";k(a,g,m,t)}else"list-level-style-image"===l.localName?(t="content: none;",k(a,g,m,t)):"list-level-style-bullet"===l.localName&&(t="content: '"+m.getAttributeNS(n,"bullet-char")+"';",k(a,g,m,t));l=l.nextSibling}else{g=c(f,g,j).join(",");l="";if(m=b(j,h,"text-properties")){t=""+d(m,p);r=m.getAttributeNS(h,"text-underline-style");"solid"===r&&(t+="text-decoration: underline;");if(r=m.getAttributeNS(h,"font-name"))(r='"'+r+'"')&&(t+="font-family: "+r+";");l+=t}if(m=b(j,h,"paragraph-properties")){t= -m;m=""+d(t,B);t=t.getElementsByTagNameNS(h,"background-image");if(0c)break;e=e.nextSibling}a.insertBefore(b,e)}}}function a(a){this.OdfContainer=a}function c(a,b,c){var d=this;this.size=0;this.type=null;this.name=a;this.container=b;this.onchange=this.onreadystatechange=this.document=this.mimetype=this.url=null;this.EMPTY=0;this.LOADING=1;this.DONE=2;this.state=this.EMPTY;this.load=function(){var b=u[a];this.mimetype=b;c.loadAsDataURL(a,b,function(a,b){d.url=b;if(d.onchange)d.onchange(d);if(d.onstatereadychange)d.onstatereadychange(d)})}; -this.abort=function(){}}function b(){this.length=0;this.item=function(){}}var d=new odf.StyleInfo,k=new odf.Style2CSS,e="urn:oasis:names:tc:opendocument:xmlns:office:1.0",i="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0",h="meta,settings,scripts,font-face-decls,styles,automatic-styles,master-styles,body".split(","),n=new core.Base64,o=new odf.FontLoader,u={};a.prototype=new function(){};a.prototype.constructor=a;a.namespaceURI=e;a.localName="document";c.prototype.load=function(){};c.prototype.getUrl= -function(){return this.data?"data:;base64,"+n.toBase64(this.data):null};odf.OdfContainer=function p(d,h){function l(a){for(var b=a.firstChild,c;b;)c=b.nextSibling,1===b.nodeType?l(b):7===b.nodeType&&a.removeChild(b),b=c}function n(a){var b=v.rootElement.ownerDocument,c;if(a){l(a.documentElement);try{c=b.importNode(a.documentElement,!0)}catch(d){}}return c}function x(a){v.state=a;if(v.onchange)v.onchange(v);if(v.onstatereadychange)v.onstatereadychange(v)}function E(a){var a=n(a),b=v.rootElement;!a|| -"document-styles"!==a.localName||a.namespaceURI!==e?x(p.INVALID):(b.fontFaceDecls=j(a,e,"font-face-decls"),g(b,b.fontFaceDecls),b.styles=j(a,e,"styles"),g(b,b.styles),b.automaticStyles=j(a,e,"automatic-styles"),g(b,b.automaticStyles),b.masterStyles=j(a,e,"master-styles"),g(b,b.masterStyles),o.loadFonts(b.fontFaceDecls,J,null))}function C(a){var a=n(a),b,c,d;if(!a||"document-content"!==a.localName||a.namespaceURI!==e)x(p.INVALID);else{b=v.rootElement;c=j(a,e,"font-face-decls");if(b.fontFaceDecls&& -c)for(d=c.firstChild;d;)b.fontFaceDecls.appendChild(d),d=c.firstChild;else c&&(b.fontFaceDecls=c,g(b,c));c=j(a,e,"automatic-styles");if(b.automaticStyles&&c)for(d=c.firstChild;d;)b.automaticStyles.appendChild(d),d=c.firstChild;else c&&(b.automaticStyles=c,g(b,c));b.body=j(a,e,"body");g(b,b.body)}}function z(a){var a=n(a),b;if(a&&!("document-meta"!==a.localName||a.namespaceURI!==e))b=v.rootElement,b.meta=j(a,e,"meta"),g(b,b.meta)}function F(a){var a=n(a),b;if(a&&!("document-settings"!==a.localName|| -a.namespaceURI!==e))b=v.rootElement,b.settings=j(a,e,"settings"),g(b,b.settings)}function m(a,b){J.loadAsDOM(a,b)}function t(){m("styles.xml",function(a,b){E(b);v.state!==p.INVALID&&m("content.xml",function(a,b){C(b);v.state!==p.INVALID&&m("meta.xml",function(a,b){z(b);v.state!==p.INVALID&&m("settings.xml",function(a,b){b&&F(b);m("META-INF/manifest.xml",function(a,b){if(b){var c=n(b),d;if(c&&!("manifest"!==c.localName||c.namespaceURI!==i)){d=v.rootElement;d.manifest=c;for(c=d.manifest.firstChild;c;)1=== -c.nodeType&&"file-entry"===c.localName&&c.namespaceURI===i&&(u[c.getAttributeNS(i,"full-path")]=c.getAttributeNS(i,"media-type")),c=c.nextSibling}}v.state!==p.INVALID&&x(p.DONE)})})})})})}function r(a,b){var c="",d;for(d in b)b.hasOwnProperty(d)&&(c+=" xmlns:"+d+'="'+b[d]+'"');return''}function y(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-meta",a);b.filter=new f(v.rootElement);c+=b.writeToString(v.rootElement.meta, -a);return c+""}function L(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-settings",a);b.filter=new f(v.rootElement);c+=b.writeToString(v.rootElement.settings,a);return c+""}function T(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-styles",a);b.filter=new f(v.rootElement,v.rootElement.masterStyles);c+=b.writeToString(v.rootElement.fontFaceDecls,a);c+=b.writeToString(v.rootElement.styles,a);c+=b.writeToString(v.rootElement.automaticStyles, -a);c+=b.writeToString(v.rootElement.masterStyles,a);return c+""}function O(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-content",a);b.filter=new f(v.rootElement,v.rootElement.body);c+=b.writeToString(v.rootElement.automaticStyles,a);c+=b.writeToString(v.rootElement.body,a);return c+""}function N(a,b){runtime.loadXML(a,function(a,c){if(a)b(a);else{var d=n(c);!d||"document"!==d.localName||d.namespaceURI!==e?x(p.INVALID):(v.rootElement= -d,d.fontFaceDecls=j(d,e,"font-face-decls"),d.styles=j(d,e,"styles"),d.automaticStyles=j(d,e,"automatic-styles"),d.masterStyles=j(d,e,"master-styles"),d.body=j(d,e,"body"),d.meta=j(d,e,"meta"),x(p.DONE))}})}var v=this,J=null;this.onstatereadychange=h;this.parts=this.rootElement=this.state=this.onchange=null;this.getPart=function(a){return new c(a,v,J)};this.save=function(a){var b;b=runtime.byteArrayFromString(L(),"utf8");J.save("settings.xml",b,!0,new Date);b=runtime.byteArrayFromString(y(),"utf8"); -J.save("meta.xml",b,!0,new Date);b=runtime.byteArrayFromString(T(),"utf8");J.save("styles.xml",b,!0,new Date);b=runtime.byteArrayFromString(O(),"utf8");J.save("content.xml",b,!0,new Date);J.write(function(b){a(b)})};this.state=p.LOADING;this.rootElement=function(a){var b=document.createElementNS(a.namespaceURI,a.localName),c,a=new a;for(c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}(a);this.parts=new b(this);J=new core.Zip(d,function(a,b){J=b;a?N(d,function(b){a&&(J.error=a+"\n"+b,x(p.INVALID))}): -t()})};odf.OdfContainer.EMPTY=0;odf.OdfContainer.LOADING=1;odf.OdfContainer.DONE=2;odf.OdfContainer.INVALID=3;odf.OdfContainer.SAVING=4;odf.OdfContainer.MODIFIED=5;odf.OdfContainer.getContainer=function(a){return new odf.OdfContainer(a,null)};return odf.OdfContainer}(); -// Input 24 -odf.Formatting=function(){function j(f){function g(a,b){for(var d=a&&a.firstChild;d&&b;)d=d.nextSibling,b-=1;return d}var a=g(f.startContainer,f.startOffset);g(f.endContainer,f.endOffset);this.next=function(){return null===a?a:null}}var l=new odf.StyleInfo;this.setOdfContainer=function(){};this.isCompletelyBold=function(){return!1};this.getAlignment=function(f){this.getParagraphStyles(f)};this.getParagraphStyles=function(f){var g,a,c,b=[];for(g=0;ga?-1:a-1})};a.slideChange=function(c){var b=a.getPages(a.odf_canvas.odfContainer().rootElement),d=-1,f=0;b.forEach(function(a){a=a[1];a.hasAttribute("slide_current")&&(d=f,a.removeAttribute("slide_current"));f+=1});c=c(d,b.length);-1===c&&(c=d); -b[c][1].setAttribute("slide_current","1");document.getElementById("pagelist").selectedIndex=c;"cont"===a.slide_mode&&window.scrollBy(0,b[c][1].getBoundingClientRect().top-30)};a.selectSlide=function(c){a.slideChange(function(a,d){return c>=d||0>c?-1:c})};a.scrollIntoContView=function(c){var b=a.getPages(a.odf_canvas.odfContainer().rootElement);0!==b.length&&window.scrollBy(0,b[c][1].getBoundingClientRect().top-30)};a.getPages=function(a){var a=a.getElementsByTagNameNS(f("draw"),"page"),b=[],d;for(d= -0;dd}}var a=l.node().ownerDocument,c=new core.Cursor(j,a);this.movePointForward=function(a){f(a,l.stepForward)};this.movePointBackward=function(a){f(a,l.stepBackward)};this.moveLineForward=function(a){j.modify?j.modify(a?"extend":"move","forward", -"line"):f(a,g)};this.moveLineBackward=function(a){j.modify?j.modify(a?"extend":"move","backward","line"):f(a,function(){})};return this}; -// Input 29 -runtime.loadClass("core.PointWalker");runtime.loadClass("core.Cursor"); -gui.XMLEdit=function(j,l){function f(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent?a.attachEvent("on"+b,c):a["on"+b]=c}function g(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function a(){var a=j.ownerDocument.defaultView.getSelection();a&&!(0>=a.rangeCount)&&s&&(a=a.getRangeAt(0),s.setPoint(a.startContainer,a.startOffset))}function c(){var a=j.ownerDocument.defaultView.getSelection(),b,c;a.removeAllRanges();s&&s.node()&&(b=s.node(),c=b.ownerDocument.createRange(), -c.setStart(b,s.position()),c.collapse(!0),a.addRange(c))}function b(b){var d=b.charCode||b.keyCode;if(s=null,s&&37===d)a(),s.stepBackward(),c();else if(16<=d&&20>=d||33<=d&&40>=d)return;g(b)}function d(){}function k(a){j.ownerDocument.defaultView.getSelection().getRangeAt(0);g(a)}function e(a){for(var b=a.firstChild;b&&b!==a;)1===b.nodeType&&e(b),b=b.nextSibling||b.parentNode;var c,d,f,b=a.attributes;c="";for(f=b.length-1;0<=f;f-=1)d=b.item(f),c=c+" "+d.nodeName+'="'+d.nodeValue+'"';a.setAttribute("customns_name", -a.nodeName);a.setAttribute("customns_atts",c);b=a.firstChild;for(d=/^\s*$/;b&&b!==a;)c=b,b=b.nextSibling||b.parentNode,3===c.nodeType&&d.test(c.nodeValue)&&c.parentNode.removeChild(c)}function i(a,b){for(var c=a.firstChild,d,e,f;c&&c!==a;){if(1===c.nodeType){i(c,b);d=c.attributes;for(f=d.length-1;0<=f;f-=1)e=d.item(f),"http://www.w3.org/2000/xmlns/"===e.namespaceURI&&!b[e.nodeValue]&&(b[e.nodeValue]=e.localName)}c=c.nextSibling||c.parentNode}}function h(){var a=j.ownerDocument.createElement("style"), -b;b={};i(j,b);var c={},d,e,f=0;for(d in b)if(b.hasOwnProperty(d)&&d){e=b[d];if(!e||c.hasOwnProperty(e)||"xmlns"===e){do e="ns"+f,f+=1;while(c.hasOwnProperty(e));b[d]=e}c[e]=!0}a.type="text/css";b="@namespace customns url(customns);\n"+n;a.appendChild(j.ownerDocument.createTextNode(b));l=l.parentNode.replaceChild(a,l)}var n,o,u,s=null;j.id||(j.id="xml"+(""+Math.random()).substring(2));o="#"+j.id+" ";n=o+"*,"+o+":visited, "+o+":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n"+ -o+":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n"+o+":after {color: blue; content: '';}\n"+o+"{overflow: auto;}\n";(function(a){f(a,"click",k);f(a,"keydown",b);f(a,"keypress",d);f(a,"drop",g);f(a,"dragend",g);f(a,"beforepaste",g);f(a,"paste",g)})(j);this.updateCSS=h;this.setXML=function(a){a=a.documentElement||a;u=a=j.ownerDocument.importNode(a,true);for(e(a);j.lastChild;)j.removeChild(j.lastChild);j.appendChild(a);h();s=new core.PointWalker(a)}; -this.getXML=function(){return u}}; -// Input 30 -(function(){return"core/Async.js,core/Base64.js,core/ByteArray.js,core/ByteArrayWriter.js,core/Cursor.js,core/JSLint.js,core/PointWalker.js,core/RawDeflate.js,core/RawInflate.js,core/UnitTester.js,core/Zip.js,gui/Caret.js,gui/SelectionMover.js,gui/XMLEdit.js,gui/PresenterUI.js,odf/FontLoader.js,odf/Formatting.js,odf/OdfCanvas.js,odf/OdfContainer.js,odf/Style2CSS.js,odf/StyleInfo.js,xmldom/LSSerializer.js,xmldom/LSSerializerFilter.js,xmldom/OperationalTransformDOM.js,xmldom/OperationalTransformInterface.js,xmldom/RelaxNG.js,xmldom/RelaxNG2.js,xmldom/RelaxNGParser.js,xmldom/XPath.js".split(",")})(); diff --git a/apps/files_odfviewer/l10n/de.php b/apps/files_odfviewer/l10n/de.php deleted file mode 100644 index 61059f05d5..0000000000 --- a/apps/files_odfviewer/l10n/de.php +++ /dev/null @@ -1,3 +0,0 @@ - "Schliessen" -); diff --git a/apps/files_odfviewer/l10n/ignorelist b/apps/files_odfviewer/l10n/ignorelist deleted file mode 100644 index 96ae631a0d..0000000000 --- a/apps/files_odfviewer/l10n/ignorelist +++ /dev/null @@ -1,8 +0,0 @@ -src/webodf/webodf/tests/core/Base64Tests.js -src/webodf/webodf/tests/core/CursorTests.js -src/webodf/webodf/tests/gui/CaretTests.js -src/webodf/webodf/tests/gui/SelectionMoverTests.js -src/webodf/webodf/tests/core/PointWalkerTests.js -src/webodf/webodf/tests/core/ZipTests.js -src/webodf/webodf/tests/xmldom/XPathTests.js -src/webodf/webodf/tests/core/RuntimeTests.js diff --git a/apps/files_odfviewer/src/.gitignore b/apps/files_odfviewer/src/.gitignore deleted file mode 100644 index 378eac25d3..0000000000 --- a/apps/files_odfviewer/src/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/apps/files_odfviewer/src/update.sh b/apps/files_odfviewer/src/update.sh deleted file mode 100755 index dad9bf35fb..0000000000 --- a/apps/files_odfviewer/src/update.sh +++ /dev/null @@ -1,9 +0,0 @@ -cd webodf -git pull -cd .. -rm -Rf build -mkdir build -cd build -cmake ../webodf -make webodf.js webodf-debug.js -cp webodf/webodf*.js ../../js/ diff --git a/apps/files_odfviewer/src/webodf/.gitignore b/apps/files_odfviewer/src/webodf/.gitignore deleted file mode 100644 index 5f9afa1071..0000000000 --- a/apps/files_odfviewer/src/webodf/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -#android/bin -#android/gen -nativeQtClient/nativeQtClient.pro.user -programs/firefoxextension/content/webodf.js -programs/firefoxextension/content/webodf.css -programs/firefoxextension/install.rdf -programs/ios/WebODF.xcodeproj/project.xcworkspace -programs/ios/WebODF.xcodeproj/xcuserdata -programs/ios/www/ZoomIn.png -programs/ios/www/ZoomOut.png -programs/ios/www/app/ -programs/ios/www/sencha-touch.css -programs/ios/www/sencha-touch.js -programs/ios/www/webodf.css -programs/ios/www/webodf.js -.DS_Store -programs/ios/build/ diff --git a/apps/files_odfviewer/src/webodf/.gitmodules b/apps/files_odfviewer/src/webodf/.gitmodules deleted file mode 100644 index 0d440b2a36..0000000000 --- a/apps/files_odfviewer/src/webodf/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "webodf/extjs"] - path = webodf/extjs - url = git://github.com/probonogeek/extjs.git -[submodule "simplerevisionserver/pywebdav"] - path = simplerevisionserver/pywebdav - url = ssh://vandenoever@heap.kogmbh.net/srv/git/pywebdav -[submodule "extjs"] - path = extjs - url = git://github.com/probonogeek/extjs.git diff --git a/apps/files_odfviewer/src/webodf/CMakeLists.txt b/apps/files_odfviewer/src/webodf/CMakeLists.txt deleted file mode 100644 index dfac345df1..0000000000 --- a/apps/files_odfviewer/src/webodf/CMakeLists.txt +++ /dev/null @@ -1,160 +0,0 @@ -# WebODF is mostly a JavaScript project. CMake needs to know about the C++ parts -project (WebODF C CXX) -# version 2.8.2 is needed to have support for zip files in external projects -cmake_minimum_required(VERSION 2.8.2) - -# At this point, the version number that is used throughout is defined -set(WEBODF_VERSION 0.3.0) - -# This makefile 'compiles' WebODF using various tools, instruments the code and -# builds and packages programs that use WebODF. - -# Find installed dependencies -find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtWebKit) -if (NOT QT4_FOUND) - message(WARNING "Qt4 with modules QtCore QtGui QtXml QtNetwork QtWebKit was not found. qtjsruntime will no be built.") -endif (NOT QT4_FOUND) - -# java runtime is needed for Closure Compiler -find_package(Java COMPONENTS Runtime) - -if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) - message(FATAL_ERROR "Compiling in the source directortory is not supported. Use for example 'mkdir build; cd build; cmake ..'.") -endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) - -# Tools must be obtained to work with: -include (ExternalProject) - -if(Java_JAVA_EXECUTABLE) - # Closure Compiler - ExternalProject_Add( - ClosureCompiler - URL "http://closure-compiler.googlecode.com/files/compiler-20120305.tar.gz" - URL_MD5 513344df6f18bfa00b17f034cabf897d - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - ) - set(CLOSURE_JAR ${CMAKE_BINARY_DIR}/ClosureCompiler-prefix/src/ClosureCompiler/compiler.jar) -endif(Java_JAVA_EXECUTABLE) - -# Rhino -if(Java_JAVA_EXECUTABLE) - ExternalProject_Add( - Rhino - URL "http://ftp.mozilla.org/pub/js/rhino1_7R3.zip" - URL_MD5 99d94103662a8d0b571e247a77432ac5 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - ) - set(RHINO ${CMAKE_BINARY_DIR}/Rhino-prefix/src/Rhino/js.jar) -endif(Java_JAVA_EXECUTABLE) - -# JSDoc -ExternalProject_Add( - JsDoc - URL "http://jsdoc-toolkit.googlecode.com/files/jsdoc_toolkit-2.4.0.zip" - URL_MD5 a8f78f5ecd24b54501147b2af341a231 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" -) -set(JSDOCDIR ${CMAKE_BINARY_DIR}/JsDoc-prefix/src/JsDoc/jsdoc-toolkit) - -# Node.JS -ExternalProject_Add( - NodeJS - URL "http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz" - URL_MD5 852cfb1ed8125a4cdba456446d869d19 - CONFIGURE_COMMAND "./configure" - BUILD_IN_SOURCE 1 - INSTALL_COMMAND "" -) -set(NODE ${CMAKE_BINARY_DIR}/NodeJS-prefix/src/NodeJS/out/Release/node) - -# JSCoverage -ExternalProject_Add( - JSCoverage - URL "http://siliconforks.com/jscoverage/download/jscoverage-0.5.1.tar.bz2" - URL_MD5 a70d79a6759367fbcc0bcc18d6866ff3 - PATCH_COMMAND patch -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/JSCoverage.patch - CONFIGURE_COMMAND "./configure" - BUILD_IN_SOURCE 1 - INSTALL_COMMAND "" -) -set(JSCOVERAGE ${CMAKE_BINARY_DIR}/JSCoverage-prefix/src/JSCoverage/jscoverage) - -# Android -if (NOT ANDROID_SDK_DIR) - find_path(ANDROID_SDK_DIR platform-tools/aapt) -endif(NOT ANDROID_SDK_DIR) -if (NOT ANT) - find_file(ANT NAMES ant ant.exe /usr/bin /usr/local/bin) -endif(NOT ANT) - - - -set(LIBJSFILES lib/packages.js lib/runtime.js lib/core/Base64.js - lib/core/RawDeflate.js lib/core/ByteArray.js - lib/core/ByteArrayWriter.js lib/core/RawInflate.js - lib/core/Cursor.js lib/core/UnitTester.js - lib/core/PointWalker.js lib/core/Async.js - lib/core/Zip.js - - lib/xmldom/LSSerializerFilter.js lib/xmldom/LSSerializer.js - lib/xmldom/RelaxNGParser.js lib/xmldom/RelaxNG.js - lib/xmldom/RelaxNG2.js lib/xmldom/OperationalTransformInterface.js - lib/xmldom/OperationalTransformDOM.js - lib/xmldom/XPath.js - - lib/odf/StyleInfo.js lib/odf/Style2CSS.js - lib/odf/FontLoader.js lib/odf/OdfContainer.js - lib/odf/Formatting.js lib/odf/OdfCanvas.js - - lib/gui/PresenterUI.js lib/gui/Caret.js - lib/gui/SelectionMover.js lib/gui/XMLEdit.js - - lib/manifest.js -) - -set(HTML5UIFILES - app/app.js app/controller/Files.js app/model/FileSystem.js - app/views/FileDetail.js app/views/FilesList.js app/views/OdfView.js - app/views/Viewport.js sencha-touch.css sencha-touch.js - app/store/FileStore.js - ZoomOut.png ZoomIn.png go-previous.png go-next.png - zoom-fit-width.png zoom-fit-best.png zoom-fit-height.png -) - -add_subdirectory(webodf) -add_subdirectory(programs) - -# package webodf -set(WEBODFZIP webodf-${WEBODF_VERSION}.zip) -set(WEBODFZIP_FILES - ${CMAKE_BINARY_DIR}/webodf/webodf-debug.js - ${CMAKE_BINARY_DIR}/webodf/webodf.js - ${CMAKE_SOURCE_DIR}/webodf/webodf.css -) -add_custom_command( - OUTPUT ${WEBODFZIP} - # zip using javascript code running in node.js - COMMAND ${NODE} ARGS webodf/lib/runtime.js packwebodf.js - ${CMAKE_BINARY_DIR}/${WEBODFZIP} -#input files - ${WEBODFZIP_FILES} -#output files - webodf-debug.js - webodf.js - webodf.css - DEPENDS NodeJS - packwebodf.js - ${WEBODFZIP_FILES} - webodf-debug.js - webodf.js - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} -) -add_custom_target(zip ALL DEPENDS ${WEBODFZIP}) - -# vim:expandtab diff --git a/apps/files_odfviewer/src/webodf/JSCoverage.patch b/apps/files_odfviewer/src/webodf/JSCoverage.patch deleted file mode 100644 index b769f40b9d..0000000000 --- a/apps/files_odfviewer/src/webodf/JSCoverage.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- ./util.c_ 2011-04-20 11:22:46.558521731 +0200 -+++ ./util.c 2011-04-20 11:23:23.999880771 +0200 -@@ -478,6 +478,10 @@ - p->next = head; - head = p; - } -+ else if (S_ISDIR(buf.st_mode)) { -+ head = recursive_dir_list(root, entry_wrt_root, head); -+ free(entry_wrt_root); -+ } - else { - fatal("refusing to follow symbolic link: %s", entry); - } diff --git a/apps/files_odfviewer/src/webodf/packwebodf.js b/apps/files_odfviewer/src/webodf/packwebodf.js deleted file mode 100644 index 3a0d76c692..0000000000 --- a/apps/files_odfviewer/src/webodf/packwebodf.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true*/ -runtime.loadClass("core.Zip"); -runtime.loadClass("core.Base64"); - -function addFiles(zip, pos, inputfiles, zipfiles, callback) { - "use strict"; - if (inputfiles.length !== zipfiles.length) { - return callback( - "Arrays inputfiles and zipfiles should have the same length."); - } - if (pos >= inputfiles.length) { - zip.write(function (err) { - return callback(err); - }); - return; - } - var inputfile = inputfiles[pos], - zipmemberpath = zipfiles[pos]; - runtime.readFile(inputfile, "binary", function (err, data) { - var base64; - if (err) { - return callback(err); - } - zip.save(zipmemberpath, data, false, new Date()); - addFiles(zip, pos + 1, inputfiles, zipfiles, callback); - }); -} - -function usage() { - "use strict"; - runtime.log("Usage:"); -} - -/** - * This script takes 1+2n arguments - * First argument is the name of the target zip file. - * The next n arguments are the input files. The last n arguments are the - * names of the files in the zip file. - */ -if (arguments.length % 2 !== 0) { - runtime.log("Wrong number of arguments."); - usage(); - runtime.exit(1); -} -var args = arguments, - n = (args.length - 2) / 2, - zipfilename = args[1], - inputmembers = [], - zipmembers = [], - i, - zip = new core.Zip(zipfilename, null); -for (i = 0; i < n; i += 1) { - inputmembers[i] = args[2 + i]; - zipmembers[i] = args[2 + n + i]; -} -addFiles(zip, 0, inputmembers, zipmembers, function (err) { - "use strict"; - if (err) { - runtime.log(err); - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt deleted file mode 100644 index 4621a25d67..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -macro(COPY_FILES _varname _srcdir _tgtdir) - foreach(_file ${ARGN}) - GET_FILENAME_COMPONENT(_subdir ${_file} PATH) - FILE(MAKE_DIRECTORY ${_tgtdir}/${_subdir}) - add_custom_command( - OUTPUT ${_tgtdir}/${_file} - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different - ${_srcdir}/${_file} - ${_tgtdir}/${_file} - DEPENDS - ${_srcdir}/${_file} - ) - set(${_varname} ${${_varname}} ${_tgtdir}/${_file}) - endforeach(_file) -endmacro(COPY_FILES _directory _files) - -if(QT4_FOUND) - add_subdirectory(qtjsruntime) - add_subdirectory(nativeQtClient) - add_subdirectory(docnosis) -endif(QT4_FOUND) - -if(ANDROID_SDK_DIR AND ANT) - add_subdirectory(android) -endif(ANDROID_SDK_DIR AND ANT) - -add_subdirectory(firefoxextension) - -add_subdirectory(touchui) -add_subdirectory(playbook) diff --git a/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml b/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml deleted file mode 100644 index 491bbb80a2..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt deleted file mode 100644 index b16c5a2f69..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -set(ANDROID_JAR ${ANDROID_SDK_DIR}/platforms/android-8/android.jar) - -COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/programs/touchui - ${CMAKE_CURRENT_BINARY_DIR}/assets/www ${HTML5UIFILES}) -COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/assets/www - ${CMAKE_CURRENT_BINARY_DIR}/assets/www - index.html icon.png phonegap-1.4.1.js) -COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/res - ${CMAKE_CURRENT_BINARY_DIR}/res - drawable-hdpi/ic_launcher.png drawable-ldpi/ic_launcher.png - drawable/icon.png drawable-mdpi/ic_launcher.png values/strings.xml - xml/phonegap.xml xml/plugins.xml layout/selector.xml - layout/main.xml layout/listitem.xml) -COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} - src/org/webodf/WebODFActivity.java libs/phonegap-1.4.1.jar - AndroidManifest.xml) -COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/webodf - ${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.css) -COPY_FILES(APKDEPS ${CMAKE_BINARY_DIR}/webodf - ${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.js) - -set(WEBODFAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-debug.apk) -add_custom_command( - OUTPUT ${WEBODFAPK} - COMMAND ${ANDROID_SDK_DIR}/tools/android - ARGS update project --path . --target android-7 --name WebODF - COMMAND ${ANT} - ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar debug - DEPENDS ${APKDEPS} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) -add_custom_target(apk ALL DEPENDS ${WEBODFAPK}) -set(WEBODFRELEASEAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-release.apk) -add_custom_command( - OUTPUT ${WEBODFRELEASEAPK} - COMMAND ${ANT} - ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar release - DEPENDS ${WEBODFAPK} webodf.js - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) -add_custom_target(releaseapk ALL DEPENDS ${WEBODFRELEASEAPK}) diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml b/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml deleted file mode 100644 index 21b5ca9ecc..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - WebODF: online/offline office - - A viewer for ODF files. - - - Jos van den Oever - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png b/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png deleted file mode 100644 index 2993aa9f14..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html b/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html deleted file mode 100644 index d9a299d24d..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - WebODF - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js b/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js deleted file mode 100644 index 908b8a8a21..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js +++ /dev/null @@ -1,4586 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -// Version 1.2.0 - -if (typeof PhoneGap === "undefined") { - -/** - * The order of events during page load and PhoneGap startup is as follows: - * - * onDOMContentLoaded Internal event that is received when the web page is loaded and parsed. - * window.onload Body onload event. - * onNativeReady Internal event that indicates the PhoneGap native side is ready. - * onPhoneGapInit Internal event that kicks off creation of all PhoneGap JavaScript objects (runs constructors). - * onPhoneGapReady Internal event fired when all PhoneGap JavaScript objects have been created - * onPhoneGapInfoReady Internal event fired when device properties are available - * onDeviceReady User event fired to indicate that PhoneGap is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The only PhoneGap events that user code should register for are: - * deviceready PhoneGap native code is initialized and PhoneGap APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - */ - -/** - * This represents the PhoneGap API itself, and provides a global namespace for accessing - * information about the state of PhoneGap. - * @class - */ -var PhoneGap = { - documentEventHandler: {}, // Collection of custom document event handlers - windowEventHandler: {} // Collection of custom window event handlers -}; - -/** - * List of resource files loaded by PhoneGap. - * This is used to ensure JS and other files are loaded only once. - */ -PhoneGap.resources = {base: true}; - -/** - * Determine if resource has been loaded by PhoneGap - * - * @param name - * @return - */ -PhoneGap.hasResource = function(name) { - return PhoneGap.resources[name]; -}; - -/** - * Add a resource to list of loaded resources by PhoneGap - * - * @param name - */ -PhoneGap.addResource = function(name) { - PhoneGap.resources[name] = true; -}; - -/** - * Custom pub-sub channel that can have functions subscribed to it - * @constructor - */ -PhoneGap.Channel = function (type) -{ - this.type = type; - this.handlers = {}; - this.guid = 0; - this.fired = false; - this.enabled = true; -}; - -/** - * Subscribes the given function to the channel. Any time that - * Channel.fire is called so too will the function. - * Optionally specify an execution context for the function - * and a guid that can be used to stop subscribing to the channel. - * Returns the guid. - */ -PhoneGap.Channel.prototype.subscribe = function(f, c, g) { - // need a function to call - if (f === null) { return; } - - var func = f; - if (typeof c === "object" && typeof f === "function") { func = PhoneGap.close(c, f); } - - g = g || func.observer_guid || f.observer_guid || this.guid++; - func.observer_guid = g; - f.observer_guid = g; - this.handlers[g] = func; - return g; -}; - -/** - * Like subscribe but the function is only called once and then it - * auto-unsubscribes itself. - */ -PhoneGap.Channel.prototype.subscribeOnce = function(f, c) { - var g = null; - var _this = this; - var m = function() { - f.apply(c || null, arguments); - _this.unsubscribe(g); - }; - if (this.fired) { - if (typeof c === "object" && typeof f === "function") { f = PhoneGap.close(c, f); } - f.apply(this, this.fireArgs); - } else { - g = this.subscribe(m); - } - return g; -}; - -/** - * Unsubscribes the function with the given guid from the channel. - */ -PhoneGap.Channel.prototype.unsubscribe = function(g) { - if (typeof g === "function") { g = g.observer_guid; } - this.handlers[g] = null; - delete this.handlers[g]; -}; - -/** - * Calls all functions subscribed to this channel. - */ -PhoneGap.Channel.prototype.fire = function(e) { - if (this.enabled) { - var fail = false; - var item, handler, rv; - for (item in this.handlers) { - if (this.handlers.hasOwnProperty(item)) { - handler = this.handlers[item]; - if (typeof handler === "function") { - rv = (handler.apply(this, arguments) === false); - fail = fail || rv; - } - } - } - this.fired = true; - this.fireArgs = arguments; - return !fail; - } - return true; -}; - -/** - * Calls the provided function only after all of the channels specified - * have been fired. - */ -PhoneGap.Channel.join = function(h, c) { - var i = c.length; - var f = function() { - if (!(--i)) { - h(); - } - }; - var len = i; - var j; - for (j=0; j - * - * @param name The plugin name - * @param obj The plugin object - */ -PhoneGap.addPlugin = function(name, obj) { - if (!window.plugins[name]) { - window.plugins[name] = obj; - } - else { - console.log("Error: Plugin "+name+" already exists."); - } -}; - -/** - * onDOMContentLoaded channel is fired when the DOM content - * of the page has been parsed. - */ -PhoneGap.onDOMContentLoaded = new PhoneGap.Channel('onDOMContentLoaded'); - -/** - * onNativeReady channel is fired when the PhoneGap native code - * has been initialized. - */ -PhoneGap.onNativeReady = new PhoneGap.Channel('onNativeReady'); - -/** - * onPhoneGapInit channel is fired when the web page is fully loaded and - * PhoneGap native code has been initialized. - */ -PhoneGap.onPhoneGapInit = new PhoneGap.Channel('onPhoneGapInit'); - -/** - * onPhoneGapReady channel is fired when the JS PhoneGap objects have been created. - */ -PhoneGap.onPhoneGapReady = new PhoneGap.Channel('onPhoneGapReady'); - -/** - * onPhoneGapInfoReady channel is fired when the PhoneGap device properties - * has been set. - */ -PhoneGap.onPhoneGapInfoReady = new PhoneGap.Channel('onPhoneGapInfoReady'); - -/** - * onPhoneGapConnectionReady channel is fired when the PhoneGap connection properties - * has been set. - */ -PhoneGap.onPhoneGapConnectionReady = new PhoneGap.Channel('onPhoneGapConnectionReady'); - -/** - * onDestroy channel is fired when the PhoneGap native code - * is destroyed. It is used internally. - * Window.onunload should be used by the user. - */ -PhoneGap.onDestroy = new PhoneGap.Channel('onDestroy'); -PhoneGap.onDestroy.subscribeOnce(function() { - PhoneGap.shuttingDown = true; -}); -PhoneGap.shuttingDown = false; - -// _nativeReady is global variable that the native side can set -// to signify that the native code is ready. It is a global since -// it may be called before any PhoneGap JS is ready. -if (typeof _nativeReady !== 'undefined') { PhoneGap.onNativeReady.fire(); } - -/** - * onDeviceReady is fired only after all PhoneGap objects are created and - * the device properties are set. - */ -PhoneGap.onDeviceReady = new PhoneGap.Channel('onDeviceReady'); - - -// Array of channels that must fire before "deviceready" is fired -PhoneGap.deviceReadyChannelsArray = [ PhoneGap.onPhoneGapReady, PhoneGap.onPhoneGapInfoReady, PhoneGap.onPhoneGapConnectionReady]; - -// Hashtable of user defined channels that must also fire before "deviceready" is fired -PhoneGap.deviceReadyChannelsMap = {}; - -/** - * Indicate that a feature needs to be initialized before it is ready to be used. - * This holds up PhoneGap's "deviceready" event until the feature has been initialized - * and PhoneGap.initComplete(feature) is called. - * - * @param feature {String} The unique feature name - */ -PhoneGap.waitForInitialization = function(feature) { - if (feature) { - var channel = new PhoneGap.Channel(feature); - PhoneGap.deviceReadyChannelsMap[feature] = channel; - PhoneGap.deviceReadyChannelsArray.push(channel); - } -}; - -/** - * Indicate that initialization code has completed and the feature is ready to be used. - * - * @param feature {String} The unique feature name - */ -PhoneGap.initializationComplete = function(feature) { - var channel = PhoneGap.deviceReadyChannelsMap[feature]; - if (channel) { - channel.fire(); - } -}; - -/** - * Create all PhoneGap objects once page has fully loaded and native side is ready. - */ -PhoneGap.Channel.join(function() { - - // Start listening for XHR callbacks - setTimeout(function() { - if (PhoneGap.UsePolling) { - PhoneGap.JSCallbackPolling(); - } - else { - var polling = prompt("usePolling", "gap_callbackServer:"); - PhoneGap.UsePolling = polling; - if (polling == "true") { - PhoneGap.UsePolling = true; - PhoneGap.JSCallbackPolling(); - } - else { - PhoneGap.UsePolling = false; - PhoneGap.JSCallback(); - } - } - }, 1); - - // Run PhoneGap constructors - PhoneGap.onPhoneGapInit.fire(); - - // Fire event to notify that all objects are created - PhoneGap.onPhoneGapReady.fire(); - - // Fire onDeviceReady event once all constructors have run and PhoneGap info has been - // received from native side, and any user defined initialization channels. - PhoneGap.Channel.join(function() { - // Let native code know we are inited on JS side - prompt("", "gap_init:"); - - PhoneGap.onDeviceReady.fire(); - }, PhoneGap.deviceReadyChannelsArray); - -}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]); - -// Listen for DOMContentLoaded and notify our channel subscribers -document.addEventListener('DOMContentLoaded', function() { - PhoneGap.onDOMContentLoaded.fire(); -}, false); - -// Intercept calls to document.addEventListener and watch for deviceready -PhoneGap.m_document_addEventListener = document.addEventListener; - -// Intercept calls to window.addEventListener -PhoneGap.m_window_addEventListener = window.addEventListener; - -/** - * Add a custom window event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addWindowEventHandler = function(event, callback) { - PhoneGap.windowEventHandler[event] = callback; -}; - -/** - * Add a custom document event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addDocumentEventHandler = function(event, callback) { - PhoneGap.documentEventHandler[event] = callback; -}; - -/** - * Intercept adding document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (e === 'deviceready') { - PhoneGap.onDeviceReady.subscribeOnce(handler); - } - else { - // If subscribing to Android backbutton - if (e === 'backbutton') { - PhoneGap.exec(null, null, "App", "overrideBackbutton", [true]); - } - - // If subscribing to an event that is handled by a plugin - else if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -/** - * Intercept adding window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If subscribing to an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); -}; - -// Intercept calls to document.removeEventListener and watch for events that -// are generated by PhoneGap native code -PhoneGap.m_document_removeEventListener = document.removeEventListener; - -// Intercept calls to window.removeEventListener -PhoneGap.m_window_removeEventListener = window.removeEventListener; - -/** - * Intercept removing document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubscribing to Android backbutton - if (e === 'backbutton') { - PhoneGap.exec(null, null, "App", "overrideBackbutton", [false]); - } - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); -}; - -/** - * Intercept removing window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); -}; - -/** - * Method to fire document event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireDocumentEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - document.dispatchEvent(e); -}; - -/** - * Method to fire window event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireWindowEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - window.dispatchEvent(e); -}; - -/** - * Does a deep clone of the object. - * - * @param obj - * @return {Object} - */ -PhoneGap.clone = function(obj) { - var i, retVal; - if(!obj) { - return obj; - } - - if(obj instanceof Array){ - retVal = []; - for(i = 0; i < obj.length; ++i){ - retVal.push(PhoneGap.clone(obj[i])); - } - return retVal; - } - - if (typeof obj === "function") { - return obj; - } - - if(!(obj instanceof Object)){ - return obj; - } - - if (obj instanceof Date) { - return obj; - } - - retVal = {}; - for(i in obj){ - if(!(i in retVal) || retVal[i] !== obj[i]) { - retVal[i] = PhoneGap.clone(obj[i]); - } - } - return retVal; -}; - -PhoneGap.callbackId = 0; -PhoneGap.callbacks = {}; -PhoneGap.callbackStatus = { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }; - - -/** - * Execute a PhoneGap command. It is up to the native side whether this action is synch or async. - * The native side can return: - * Synchronous: PluginResult object as a JSON string - * Asynchrounous: Empty string "" - * If async, the native side will PhoneGap.callbackSuccess or PhoneGap.callbackError, - * depending upon the result of the action. - * - * @param {Function} success The success callback - * @param {Function} fail The fail callback - * @param {String} service The name of the service to use - * @param {String} action Action to be run in PhoneGap - * @param {Array.} [args] Zero or more arguments to pass to the method - */ -PhoneGap.exec = function(success, fail, service, action, args) { - try { - var callbackId = service + PhoneGap.callbackId++; - if (success || fail) { - PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; - } - - var r = prompt(JSON.stringify(args), "gap:"+JSON.stringify([service, action, callbackId, true])); - - // If a result was returned - if (r.length > 0) { - eval("var v="+r+";"); - - // If status is OK, then return value back to caller - if (v.status === PhoneGap.callbackStatus.OK) { - - // If there is a success callback, then call it now with - // returned value - if (success) { - try { - success(v.message); - } catch (e) { - console.log("Error in success callback: " + callbackId + " = " + e); - } - - // Clear callback if not expecting any more results - if (!v.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } - return v.message; - } - - // If no result - else if (v.status === PhoneGap.callbackStatus.NO_RESULT) { - - // Clear callback if not expecting any more results - if (!v.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } - - // If error, then display error - else { - console.log("Error: Status="+v.status+" Message="+v.message); - - // If there is a fail callback, then call it now with returned value - if (fail) { - try { - fail(v.message); - } - catch (e1) { - console.log("Error in error callback: "+callbackId+" = "+e1); - } - - // Clear callback if not expecting any more results - if (!v.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } - return null; - } - } - } catch (e2) { - console.log("Error: "+e2); - } -}; - -/** - * Called by native code when returning successful result from an action. - * - * @param callbackId - * @param args - */ -PhoneGap.callbackSuccess = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - - // If result is to be sent to callback - if (args.status === PhoneGap.callbackStatus.OK) { - try { - if (PhoneGap.callbacks[callbackId].success) { - PhoneGap.callbacks[callbackId].success(args.message); - } - } - catch (e) { - console.log("Error in success callback: "+callbackId+" = "+e); - } - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - -/** - * Called by native code when returning error result from an action. - * - * @param callbackId - * @param args - */ -PhoneGap.callbackError = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - try { - if (PhoneGap.callbacks[callbackId].fail) { - PhoneGap.callbacks[callbackId].fail(args.message); - } - } - catch (e) { - console.log("Error in error callback: "+callbackId+" = "+e); - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - -PhoneGap.JSCallbackPort = null; -PhoneGap.JSCallbackToken = null; - -/** - * This is only for Android. - * - * Internal function that uses XHR to call into PhoneGap Java code and retrieve - * any JavaScript code that needs to be run. This is used for callbacks from - * Java to JavaScript. - */ -PhoneGap.JSCallback = function() { - - // Exit if shutting down app - if (PhoneGap.shuttingDown) { - return; - } - - // If polling flag was changed, start using polling from now on - if (PhoneGap.UsePolling) { - PhoneGap.JSCallbackPolling(); - return; - } - - var xmlhttp = new XMLHttpRequest(); - - // Callback function when XMLHttpRequest is ready - xmlhttp.onreadystatechange=function(){ - if(xmlhttp.readyState === 4){ - - // Exit if shutting down app - if (PhoneGap.shuttingDown) { - return; - } - - // If callback has JavaScript statement to execute - if (xmlhttp.status === 200) { - - // Need to url decode the response - var msg = decodeURIComponent(xmlhttp.responseText); - setTimeout(function() { - try { - var t = eval(msg); - } - catch (e) { - // If we're getting an error here, seeing the message will help in debugging - console.log("JSCallback: Message from Server: " + msg); - console.log("JSCallback Error: "+e); - } - }, 1); - setTimeout(PhoneGap.JSCallback, 1); - } - - // If callback ping (used to keep XHR request from timing out) - else if (xmlhttp.status === 404) { - setTimeout(PhoneGap.JSCallback, 10); - } - - // If security error - else if (xmlhttp.status === 403) { - console.log("JSCallback Error: Invalid token. Stopping callbacks."); - } - - // If server is stopping - else if (xmlhttp.status === 503) { - console.log("JSCallback Server Closed: Stopping callbacks."); - } - - // If request wasn't GET - else if (xmlhttp.status === 400) { - console.log("JSCallback Error: Bad request. Stopping callbacks."); - } - - // If error, revert to polling - else { - console.log("JSCallback Error: Request failed."); - PhoneGap.UsePolling = true; - PhoneGap.JSCallbackPolling(); - } - } - }; - - if (PhoneGap.JSCallbackPort === null) { - PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); - } - if (PhoneGap.JSCallbackToken === null) { - PhoneGap.JSCallbackToken = prompt("getToken", "gap_callbackServer:"); - } - xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true); - xmlhttp.send(); -}; - -/** - * The polling period to use with JSCallbackPolling. - * This can be changed by the application. The default is 50ms. - */ -PhoneGap.JSCallbackPollingPeriod = 50; - -/** - * Flag that can be set by the user to force polling to be used or force XHR to be used. - */ -PhoneGap.UsePolling = false; // T=use polling, F=use XHR - -/** - * This is only for Android. - * - * Internal function that uses polling to call into PhoneGap Java code and retrieve - * any JavaScript code that needs to be run. This is used for callbacks from - * Java to JavaScript. - */ -PhoneGap.JSCallbackPolling = function() { - - // Exit if shutting down app - if (PhoneGap.shuttingDown) { - return; - } - - // If polling flag was changed, stop using polling from now on - if (!PhoneGap.UsePolling) { - PhoneGap.JSCallback(); - return; - } - - var msg = prompt("", "gap_poll:"); - if (msg) { - setTimeout(function() { - try { - var t = eval(""+msg); - } - catch (e) { - console.log("JSCallbackPolling: Message from Server: " + msg); - console.log("JSCallbackPolling Error: "+e); - } - }, 1); - setTimeout(PhoneGap.JSCallbackPolling, 1); - } - else { - setTimeout(PhoneGap.JSCallbackPolling, PhoneGap.JSCallbackPollingPeriod); - } -}; - -/** - * Create a UUID - * - * @return {String} - */ -PhoneGap.createUUID = function() { - return PhoneGap.UUIDcreatePart(4) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(6); -}; - -PhoneGap.UUIDcreatePart = function(length) { - var uuidpart = ""; - var i, uuidchar; - for (i=0; i frequency + 10 sec - PhoneGap.exec( - function(timeout) { - if (timeout < (frequency + 10000)) { - PhoneGap.exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); - } - }, - function(e) { }, "Accelerometer", "getTimeout", []); - - // Start watch timer - var id = PhoneGap.createUUID(); - navigator.accelerometer.timers[id] = setInterval(function() { - PhoneGap.exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); - }, (frequency ? frequency : 1)); - - return id; -}; - -/** - * Clears the specified accelerometer watch. - * - * @param {String} id The id of the watch returned from #watchAcceleration. - */ -Accelerometer.prototype.clearWatch = function(id) { - - // Stop javascript timer & remove from timer list - if (id && navigator.accelerometer.timers[id] !== undefined) { - clearInterval(navigator.accelerometer.timers[id]); - delete navigator.accelerometer.timers[id]; - } -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.accelerometer === "undefined") { - navigator.accelerometer = new Accelerometer(); - } -}); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("app")) { -PhoneGap.addResource("app"); -(function() { - -/** - * Constructor - * @constructor - */ -var App = function() {}; - -/** - * Clear the resource cache. - */ -App.prototype.clearCache = function() { - PhoneGap.exec(null, null, "App", "clearCache", []); -}; - -/** - * Load the url into the webview or into new browser instance. - * - * @param url The URL to load - * @param props Properties that can be passed in to the activity: - * wait: int => wait msec before loading URL - * loadingDialog: "Title,Message" => display a native loading dialog - * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error - * clearHistory: boolean => clear webview history (default=false) - * openExternal: boolean => open in a new browser (default=false) - * - * Example: - * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); - */ -App.prototype.loadUrl = function(url, props) { - PhoneGap.exec(null, null, "App", "loadUrl", [url, props]); -}; - -/** - * Cancel loadUrl that is waiting to be loaded. - */ -App.prototype.cancelLoadUrl = function() { - PhoneGap.exec(null, null, "App", "cancelLoadUrl", []); -}; - -/** - * Clear web history in this web view. - * Instead of BACK button loading the previous web page, it will exit the app. - */ -App.prototype.clearHistory = function() { - PhoneGap.exec(null, null, "App", "clearHistory", []); -}; - -/** - * Go to previous page displayed. - * This is the same as pressing the backbutton on Android device. - */ -App.prototype.backHistory = function() { - PhoneGap.exec(null, null, "App", "backHistory", []); -}; - -/** - * Exit and terminate the application. - */ -App.prototype.exitApp = function() { - return PhoneGap.exec(null, null, "App", "exitApp", []); -}; - -PhoneGap.addConstructor(function() { - navigator.app = new App(); -}); -}()); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("battery")) { -PhoneGap.addResource("battery"); - -/** - * This class contains information about the current battery status. - * @constructor - */ -var Battery = function() { - this._level = null; - this._isPlugged = null; - this._batteryListener = []; - this._lowListener = []; - this._criticalListener = []; -}; - -/** - * Registers as an event producer for battery events. - * - * @param {Object} eventType - * @param {Object} handler - * @param {Object} add - */ -Battery.prototype.eventHandler = function(eventType, handler, add) { - var me = navigator.battery; - if (add) { - // If there are no current registered event listeners start the battery listener on native side. - if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { - PhoneGap.exec(me._status, me._error, "Battery", "start", []); - } - - // Register the event listener in the proper array - if (eventType === "batterystatus") { - if (me._batteryListener.indexOf(handler) === -1) { - me._batteryListener.push(handler); - } - } else if (eventType === "batterylow") { - if (me._lowListener.indexOf(handler) === -1) { - me._lowListener.push(handler); - } - } else if (eventType === "batterycritical") { - if (me._criticalListener.indexOf(handler) === -1) { - me._criticalListener.push(handler); - } - } - } else { - var pos = -1; - // Remove the event listener from the proper array - if (eventType === "batterystatus") { - pos = me._batteryListener.indexOf(handler); - if (pos > -1) { - me._batteryListener.splice(pos, 1); - } - } else if (eventType === "batterylow") { - pos = me._lowListener.indexOf(handler); - if (pos > -1) { - me._lowListener.splice(pos, 1); - } - } else if (eventType === "batterycritical") { - pos = me._criticalListener.indexOf(handler); - if (pos > -1) { - me._criticalListener.splice(pos, 1); - } - } - - // If there are no more registered event listeners stop the battery listener on native side. - if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { - PhoneGap.exec(null, null, "Battery", "stop", []); - } - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = this; - var level = info.level; - if (me._level !== level || me._isPlugged !== info.isPlugged) { - // Fire batterystatus event - PhoneGap.fireWindowEvent("batterystatus", info); - - // Fire low battery event - if (level === 20 || level === 5) { - if (level === 20) { - PhoneGap.fireWindowEvent("batterylow", info); - } - else { - PhoneGap.fireWindowEvent("batterycritical", info); - } - } - } - me._level = level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.battery === "undefined") { - navigator.battery = new Battery(); - PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); - } -}); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("camera")) { -PhoneGap.addResource("camera"); - -/** - * This class provides access to the device camera. - * - * @constructor - */ -var Camera = function() { - this.successCallback = null; - this.errorCallback = null; - this.options = null; -}; - -/** - * Format of image that returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.DestinationType = { - DATA_URL: 0, // Return base64 encoded string - FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android) -}; -Camera.prototype.DestinationType = Camera.DestinationType; - -/** - * Encoding of image returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.CAMERA, - * encodingType: Camera.EncodingType.PNG}) -*/ -Camera.EncodingType = { - JPEG: 0, // Return JPEG encoded image - PNG: 1 // Return PNG encoded image -}; -Camera.prototype.EncodingType = Camera.EncodingType; - -/** - * Type of pictures to select from. Only applicable when - * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, - * mediaType: Camera.MediaType.PICTURE}) - */ -Camera.MediaType = { - PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType - VIDEO: 1, // allow selection of video only, ONLY RETURNS URL - ALLMEDIA : 2 // allow selection from all media types -}; -Camera.prototype.MediaType = Camera.MediaType; - - -/** - * Source to getPicture from. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.PictureSourceType = { - PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) - CAMERA : 1, // Take picture from camera - SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) -}; -Camera.prototype.PictureSourceType = Camera.PictureSourceType; - -/** - * Gets a picture from source defined by "options.sourceType", and returns the - * image as defined by the "options.destinationType" option. - - * The defaults are sourceType=CAMERA and destinationType=DATA_URL. - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options - */ -Camera.prototype.getPicture = function(successCallback, errorCallback, options) { - - // successCallback required - if (typeof successCallback !== "function") { - console.log("Camera Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Camera Error: errorCallback is not a function"); - return; - } - - if (options === null || typeof options === "undefined") { - options = {}; - } - if (options.quality === null || typeof options.quality === "undefined") { - options.quality = 80; - } - if (options.maxResolution === null || typeof options.maxResolution === "undefined") { - options.maxResolution = 0; - } - if (options.destinationType === null || typeof options.destinationType === "undefined") { - options.destinationType = Camera.DestinationType.FILE_URI; - } - if (options.sourceType === null || typeof options.sourceType === "undefined") { - options.sourceType = Camera.PictureSourceType.CAMERA; - } - if (options.encodingType === null || typeof options.encodingType === "undefined") { - options.encodingType = Camera.EncodingType.JPEG; - } - if (options.mediaType === null || typeof options.mediaType === "undefined") { - options.mediaType = Camera.MediaType.PICTURE; - } - if (options.targetWidth === null || typeof options.targetWidth === "undefined") { - options.targetWidth = -1; - } - else if (typeof options.targetWidth === "string") { - var width = new Number(options.targetWidth); - if (isNaN(width) === false) { - options.targetWidth = width.valueOf(); - } - } - if (options.targetHeight === null || typeof options.targetHeight === "undefined") { - options.targetHeight = -1; - } - else if (typeof options.targetHeight === "string") { - var height = new Number(options.targetHeight); - if (isNaN(height) === false) { - options.targetHeight = height.valueOf(); - } - } - - PhoneGap.exec(successCallback, errorCallback, "Camera", "takePicture", [options]); -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.camera === "undefined") { - navigator.camera = new Camera(); - } -}); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("capture")) { -PhoneGap.addResource("capture"); - -/** - * Represents a single file. - * - * name {DOMString} name of the file, without path information - * fullPath {DOMString} the full path of the file, including the name - * type {DOMString} mime type - * lastModifiedDate {Date} last modified date - * size {Number} size of the file in bytes - */ -var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ - this.name = name || null; - this.fullPath = fullPath || null; - this.type = type || null; - this.lastModifiedDate = lastModifiedDate || null; - this.size = size || 0; -}; - -/** - * Launch device camera application for recording video(s). - * - * @param {Function} successCB - * @param {Function} errorCB - */ -MediaFile.prototype.getFormatData = function(successCallback, errorCallback){ - PhoneGap.exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); -}; - -/** - * MediaFileData encapsulates format information of a media file. - * - * @param {DOMString} codecs - * @param {long} bitrate - * @param {long} height - * @param {long} width - * @param {float} duration - */ -var MediaFileData = function(codecs, bitrate, height, width, duration){ - this.codecs = codecs || null; - this.bitrate = bitrate || 0; - this.height = height || 0; - this.width = width || 0; - this.duration = duration || 0; -}; - -/** - * The CaptureError interface encapsulates all errors in the Capture API. - */ -var CaptureError = function(){ - this.code = null; -}; - -// Capture error codes -CaptureError.CAPTURE_INTERNAL_ERR = 0; -CaptureError.CAPTURE_APPLICATION_BUSY = 1; -CaptureError.CAPTURE_INVALID_ARGUMENT = 2; -CaptureError.CAPTURE_NO_MEDIA_FILES = 3; -CaptureError.CAPTURE_NOT_SUPPORTED = 20; - -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -var Capture = function(){ - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -}; - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ - PhoneGap.exec(successCallback, errorCallback, "Capture", "captureAudio", [options]); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options){ - PhoneGap.exec(successCallback, errorCallback, "Capture", "captureImage", [options]); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype._castMediaFile = function(pluginResult){ - var mediaFiles = []; - var i; - for (i = 0; i < pluginResult.message.length; i++) { - var mediaFile = new MediaFile(); - mediaFile.name = pluginResult.message[i].name; - mediaFile.fullPath = pluginResult.message[i].fullPath; - mediaFile.type = pluginResult.message[i].type; - mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate; - mediaFile.size = pluginResult.message[i].size; - mediaFiles.push(mediaFile); - } - pluginResult.message = mediaFiles; - return pluginResult; -}; - -/** - * Launch device camera application for recording video(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ - PhoneGap.exec(successCallback, errorCallback, "Capture", "captureVideo", [options]); -}; - -/** - * Encapsulates a set of parameters that the capture device supports. - */ -var ConfigurationData = function(){ - // The ASCII-encoded string in lower case representing the media type. - this.type = null; - // The height attribute represents height of the image or video in pixels. - // In the case of a sound clip this attribute has value 0. - this.height = 0; - // The width attribute represents width of the image or video in pixels. - // In the case of a sound clip this attribute has value 0 - this.width = 0; -}; - -/** - * Encapsulates all image capture operation configuration options. - */ -var CaptureImageOptions = function(){ - // Upper limit of images user can take. Value must be equal or greater than 1. - this.limit = 1; - // The selected image mode. Must match with one of the elements in supportedImageModes array. - this.mode = null; -}; - -/** - * Encapsulates all video capture operation configuration options. - */ -var CaptureVideoOptions = function(){ - // Upper limit of videos user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single video clip in seconds. - this.duration = 0; - // The selected video mode. Must match with one of the elements in supportedVideoModes array. - this.mode = null; -}; - -/** - * Encapsulates all audio capture operation configuration options. - */ -var CaptureAudioOptions = function(){ - // Upper limit of sound clips user can record. Value must be equal or greater than 1. - this.limit = 1; - // Maximum duration of a single sound clip in seconds. - this.duration = 0; - // The selected audio mode. Must match with one of the elements in supportedAudioModes array. - this.mode = null; -}; - -PhoneGap.addConstructor(function(){ - if (typeof navigator.device.capture === "undefined") { - navigator.device.capture = window.device.capture = new Capture(); - } -}); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("compass")) { -PhoneGap.addResource("compass"); - -var CompassError = function(){ - this.code = null; -}; - -// Capture error codes -CompassError.COMPASS_INTERNAL_ERR = 0; -CompassError.COMPASS_NOT_SUPPORTED = 20; - -var CompassHeading = function() { - this.magneticHeading = null; - this.trueHeading = null; - this.headingAccuracy = null; - this.timestamp = null; -}; - -/** - * This class provides access to device Compass data. - * @constructor - */ -var Compass = function() { - /** - * The last known Compass position. - */ - this.lastHeading = null; - - /** - * List of compass watch timers - */ - this.timers = {}; -}; - -Compass.ERROR_MSG = ["Not running", "Starting", "", "Failed to start"]; - -/** - * Asynchronously aquires the current heading. - * - * @param {Function} successCallback The function to call when the heading data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) - * @param {PositionOptions} options The options for getting the heading data such as timeout. (OPTIONAL) - */ -Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) { - - // successCallback required - if (typeof successCallback !== "function") { - console.log("Compass Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Compass Error: errorCallback is not a function"); - return; - } - - // Get heading - PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); -}; - -/** - * Asynchronously aquires the heading repeatedly at a given interval. - * - * @param {Function} successCallback The function to call each time the heading data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) - * @param {HeadingOptions} options The options for getting the heading data such as timeout and the frequency of the watch. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ -Compass.prototype.watchHeading= function(successCallback, errorCallback, options) { - - // Default interval (100 msec) - var frequency = (options !== undefined) ? options.frequency : 100; - - // successCallback required - if (typeof successCallback !== "function") { - console.log("Compass Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Compass Error: errorCallback is not a function"); - return; - } - - // Make sure compass timeout > frequency + 10 sec - PhoneGap.exec( - function(timeout) { - if (timeout < (frequency + 10000)) { - PhoneGap.exec(null, null, "Compass", "setTimeout", [frequency + 10000]); - } - }, - function(e) { }, "Compass", "getTimeout", []); - - // Start watch timer to get headings - var id = PhoneGap.createUUID(); - navigator.compass.timers[id] = setInterval( - function() { - PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); - }, (frequency ? frequency : 1)); - - return id; -}; - - -/** - * Clears the specified heading watch. - * - * @param {String} id The ID of the watch returned from #watchHeading. - */ -Compass.prototype.clearWatch = function(id) { - - // Stop javascript timer & remove from timer list - if (id && navigator.compass.timers[id]) { - clearInterval(navigator.compass.timers[id]); - delete navigator.compass.timers[id]; - } -}; - -Compass.prototype._castDate = function(pluginResult) { - if (pluginResult.message.timestamp) { - var timestamp = new Date(pluginResult.message.timestamp); - pluginResult.message.timestamp = timestamp; - } - return pluginResult; -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.compass === "undefined") { - navigator.compass = new Compass(); - } -}); -} -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -if (!PhoneGap.hasResource("contact")) { -PhoneGap.addResource("contact"); - -/** -* Contains information about a single contact. -* @constructor -* @param {DOMString} id unique identifier -* @param {DOMString} displayName -* @param {ContactName} name -* @param {DOMString} nickname -* @param {Array.} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** - * ContactError. - * An error code assigned by an implementation when an error has occurreds - * @constructor - */ -var ContactError = function() { - this.code=null; -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - if (this.id === null) { - var errorObj = new ContactError(); - errorObj.code = ContactError.UNKNOWN_ERROR; - errorCB(errorObj); - } - else { - PhoneGap.exec(successCB, errorCB, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = PhoneGap.clone(this); - var i; - clonedContact.id = null; - clonedContact.rawId = null; - // Loop through and clear out any id's in phones, emails, etc. - if (clonedContact.phoneNumbers) { - for (i = 0; i < clonedContact.phoneNumbers.length; i++) { - clonedContact.phoneNumbers[i].id = null; - } - } - if (clonedContact.emails) { - for (i = 0; i < clonedContact.emails.length; i++) { - clonedContact.emails[i].id = null; - } - } - if (clonedContact.addresses) { - for (i = 0; i < clonedContact.addresses.length; i++) { - clonedContact.addresses[i].id = null; - } - } - if (clonedContact.ims) { - for (i = 0; i < clonedContact.ims.length; i++) { - clonedContact.ims[i].id = null; - } - } - if (clonedContact.organizations) { - for (i = 0; i < clonedContact.organizations.length; i++) { - clonedContact.organizations[i].id = null; - } - } - if (clonedContact.tags) { - for (i = 0; i < clonedContact.tags.length; i++) { - clonedContact.tags[i].id = null; - } - } - if (clonedContact.photos) { - for (i = 0; i < clonedContact.photos.length; i++) { - clonedContact.photos[i].id = null; - } - } - if (clonedContact.urls) { - for (i = 0; i < clonedContact.urls.length; i++) { - clonedContact.urls[i].id = null; - } - } - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - PhoneGap.exec(successCB, errorCB, "Contacts", "save", [this]); -}; - -/** -* Contact name. -* @constructor -* @param formatted -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = type || null; - this.value = value || null; - this.pref = pref || null; -}; - -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = pref || null; - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = pref || null; - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -/** -* Represents a group of Contacts. -* @constructor -*/ -var Contacts = function() { - this.inProgress = false; - this.records = []; -}; -/** -* Returns an array of Contacts matching the search criteria. -* @param fields that should be searched -* @param successCB success callback -* @param errorCB error callback -* @param {ContactFindOptions} options that can be applied to contact searching -* @return array of Contacts matching search criteria -*/ -Contacts.prototype.find = function(fields, successCB, errorCB, options) { - if (successCB === null) { - throw new TypeError("You must specify a success callback for the find command."); - } - if (fields === null || fields === "undefined" || fields.length === "undefined" || fields.length <= 0) { - if (typeof errorCB === "function") { - errorCB({"code": ContactError.INVALID_ARGUMENT_ERROR}); - } - } else { - PhoneGap.exec(successCB, errorCB, "Contacts", "search", [fields, options]); - } -}; - -/** -* This function creates a new contact, but it does not persist the contact -* to device storage. To persist the contact to device storage, invoke -* contact.save(). -* @param properties an object who's properties will be examined to create a new Contact -* @returns new Contact object -*/ -Contacts.prototype.create = function(properties) { - var i; - var contact = new Contact(); - for (i in properties) { - if (contact[i] !== 'undefined') { - contact[i] = properties[i]; - } - } - return contact; -}; - -/** -* This function returns and array of contacts. It is required as we need to convert raw -* JSON objects into concrete Contact objects. Currently this method is called after -* navigator.contacts.find but before the find methods success call back. -* -* @param jsonArray an array of JSON Objects that need to be converted to Contact objects. -* @returns an array of Contact objects -*/ -Contacts.prototype.cast = function(pluginResult) { - var contacts = []; - var i; - for (i=0; i][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - this.fileName = ""; - if (typeof file.fullPath === "undefined") { - this.fileName = file; - } else { - this.fileName = file.fullPath; - } - - // LOADING state - this.readyState = FileReader.LOADING; - - // If loadstart callback - if (typeof this.onloadstart === "function") { - this.onloadstart({"type":"loadstart", "target":this}); - } - - var me = this; - - // Read file - PhoneGap.exec( - // Success callback - function(r) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save result - me.result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload({"type":"load", "target":me}); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend({"type":"loadend", "target":me}); - } - }, - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror({"type":"error", "target":me}); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend({"type":"loadend", "target":me}); - } - }, "File", "readAsDataURL", [this.fileName]); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsBinaryString = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -//----------------------------------------------------------------------------- -// File Writer -//----------------------------------------------------------------------------- - -/** - * This class writes to the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To write to the SD card, the file name is "sdcard/my_file.txt" - * - * @constructor - * @param file {File} File object containing file properties - * @param append if true write to the end of the file, otherwise overwrite the file - */ -var FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -}; - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw FileError.INVALID_STATE_ERR; - } - - // set error - var error = new FileError(), evt; - error.code = error.ABORT_ERR; - this.error = error; - - // If error callback - if (typeof this.onerror === "function") { - this.onerror({"type":"error", "target":this}); - } - // If abort callback - if (typeof this.onabort === "function") { - this.onabort({"type":"abort", "target":this}); - } - - this.readyState = FileWriter.DONE; - - // If write end callback - if (typeof this.onwriteend === "function") { - this.onwriteend({"type":"writeend", "target":this}); - } -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart({"type":"writestart", "target":me}); - } - - // Write file - PhoneGap.exec( - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - me.length = me.position; - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite({"type":"write", "target":me}); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend({"type":"writeend", "target":me}); - } - }, - // Error callback - function(e) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror({"type":"error", "target":me}); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend({"type":"writeend", "target":me}); - } - }, "File", "write", [this.fileName, text, this.position]); -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - if (!offset) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger then file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart({"type":"writestart", "target":this}); - } - - // Write file - PhoneGap.exec( - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite({"type":"write", "target":me}); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend({"type":"writeend", "target":me}); - } - }, - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror({"type":"error", "target":me}); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend({"type":"writeend", "target":me}); - } - }, "File", "truncate", [this.fileName, size]); -}; - -/** - * Information about the state of the file or directory - * - * @constructor - * {Date} modificationTime (readonly) - */ -var Metadata = function() { - this.modificationTime=null; -}; - -/** - * Supplies arguments to methods that lookup or create files and directories - * - * @constructor - * @param {boolean} create file or directory if it doesn't exist - * @param {boolean} exclusive if true the command will fail if the file or directory exists - */ -var Flags = function(create, exclusive) { - this.create = create || false; - this.exclusive = exclusive || false; -}; - -/** - * An interface representing a file system - * - * @constructor - * {DOMString} name the unique name of the file system (readonly) - * {DirectoryEntry} root directory of the file system (readonly) - */ -var FileSystem = function() { - this.name = null; - this.root = null; -}; - -/** - * An interface that lists the files and directories in a directory. - * @constructor - */ -var DirectoryReader = function(fullPath){ - this.fullPath = fullPath || null; -}; - -/** - * Returns a list of entries from a directory. - * - * @param {Function} successCallback is called with a list of entries - * @param {Function} errorCallback is called with a FileError - */ -DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "readEntries", [this.fullPath]); -}; - -/** - * An interface representing a directory on the file system. - * - * @constructor - * {boolean} isFile always false (readonly) - * {boolean} isDirectory always true (readonly) - * {DOMString} name of the directory, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the directory (readonly) - * {FileSystem} filesystem on which the directory resides (readonly) - */ -var DirectoryEntry = function() { - this.isFile = false; - this.isDirectory = true; - this.name = null; - this.fullPath = null; - this.filesystem = null; -}; - -/** - * Copies a directory to a new location - * - * @param {DirectoryEntry} parent the directory to which to copy the entry - * @param {DOMString} newName the new name of the entry, defaults to the current name - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "copyTo", [this.fullPath, parent, newName]); -}; - -/** - * Looks up the metadata of the entry - * - * @param {Function} successCallback is called with a Metadata object - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getMetadata = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getMetadata", [this.fullPath]); -}; - -/** - * Gets the parent of the entry - * - * @param {Function} successCallback is called with a parent entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getParent = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getParent", [this.fullPath]); -}; - -/** - * Moves a directory to a new location - * - * @param {DirectoryEntry} parent the directory to which to move the entry - * @param {DOMString} newName the new name of the entry, defaults to the current name - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "moveTo", [this.fullPath, parent, newName]); -}; - -/** - * Removes the entry - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.remove = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "remove", [this.fullPath]); -}; - -/** - * Returns a URI that can be used to identify this entry. - * - * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI. - * @return uri - */ -DirectoryEntry.prototype.toURI = function(mimeType) { - return "file://" + this.fullPath; -}; - -/** - * Creates a new DirectoryReader to read entries from this directory - */ -DirectoryEntry.prototype.createReader = function(successCallback, errorCallback) { - return new DirectoryReader(this.fullPath); -}; - -/** - * Creates or looks up a directory - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory - * @param {Flags} options to create or excluively create the directory - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getDirectory", [this.fullPath, path, options]); -}; - -/** - * Creates or looks up a file - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file - * @param {Flags} options to create or excluively create the file - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getFile", [this.fullPath, path, options]); -}; - -/** - * Deletes a directory and all of it's contents - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "removeRecursively", [this.fullPath]); -}; - -/** - * An interface representing a directory on the file system. - * - * @constructor - * {boolean} isFile always true (readonly) - * {boolean} isDirectory always false (readonly) - * {DOMString} name of the file, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the file (readonly) - * {FileSystem} filesystem on which the directory resides (readonly) - */ -var FileEntry = function() { - this.isFile = true; - this.isDirectory = false; - this.name = null; - this.fullPath = null; - this.filesystem = null; -}; - -/** - * Copies a file to a new location - * - * @param {DirectoryEntry} parent the directory to which to copy the entry - * @param {DOMString} newName the new name of the entry, defaults to the current name - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "copyTo", [this.fullPath, parent, newName]); -}; - -/** - * Looks up the metadata of the entry - * - * @param {Function} successCallback is called with a Metadata object - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.getMetadata = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getMetadata", [this.fullPath]); -}; - -/** - * Gets the parent of the entry - * - * @param {Function} successCallback is called with a parent entry - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.getParent = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getParent", [this.fullPath]); -}; - -/** - * Moves a directory to a new location - * - * @param {DirectoryEntry} parent the directory to which to move the entry - * @param {DOMString} newName the new name of the entry, defaults to the current name - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "moveTo", [this.fullPath, parent, newName]); -}; - -/** - * Removes the entry - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.remove = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "remove", [this.fullPath]); -}; - -/** - * Returns a URI that can be used to identify this entry. - * - * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI. - * @return uri - */ -FileEntry.prototype.toURI = function(mimeType) { - return "file://" + this.fullPath; -}; - -/** - * Creates a new FileWriter associated with the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new FileWriter - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.createWriter = function(successCallback, errorCallback) { - this.file(function(filePointer) { - var writer = new FileWriter(filePointer); - - if (writer.fileName === null || writer.fileName === "") { - if (typeof errorCallback === "function") { - errorCallback({ - "code": FileError.INVALID_STATE_ERR - }); - } - } - - if (typeof successCallback === "function") { - successCallback(writer); - } - }, errorCallback); -}; - -/** - * Returns a File that represents the current state of the file that this FileEntry represents. - * - * @param {Function} successCallback is called with the new File object - * @param {Function} errorCallback is called with a FileError - */ -FileEntry.prototype.file = function(successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "getFileMetadata", [this.fullPath]); -}; - -/** @constructor */ -var LocalFileSystem = function() { -}; - -// File error codes -LocalFileSystem.TEMPORARY = 0; -LocalFileSystem.PERSISTENT = 1; -LocalFileSystem.RESOURCE = 2; -LocalFileSystem.APPLICATION = 3; - -/** - * Requests a filesystem in which to store application data. - * - * @param {int} type of file system being requested - * @param {Function} successCallback is called with the new FileSystem - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { - if (type < 0 || type > 3) { - if (typeof errorCallback === "function") { - errorCallback({ - "code": FileError.SYNTAX_ERR - }); - } - } - else { - PhoneGap.exec(successCallback, errorCallback, "File", "requestFileSystem", [type, size]); - } -}; - -/** - * - * @param {DOMString} uri referring to a local file in a filesystem - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "File", "resolveLocalFileSystemURI", [uri]); -}; - -/** -* This function returns and array of contacts. It is required as we need to convert raw -* JSON objects into concrete Contact objects. Currently this method is called after -* navigator.service.contacts.find but before the find methods success call back. -* -* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. -* @returns an entry -*/ -LocalFileSystem.prototype._castFS = function(pluginResult) { - var entry = null; - entry = new DirectoryEntry(); - entry.isDirectory = pluginResult.message.root.isDirectory; - entry.isFile = pluginResult.message.root.isFile; - entry.name = pluginResult.message.root.name; - entry.fullPath = pluginResult.message.root.fullPath; - pluginResult.message.root = entry; - return pluginResult; -}; - -LocalFileSystem.prototype._castEntry = function(pluginResult) { - var entry = null; - if (pluginResult.message.isDirectory) { - entry = new DirectoryEntry(); - } - else if (pluginResult.message.isFile) { - entry = new FileEntry(); - } - entry.isDirectory = pluginResult.message.isDirectory; - entry.isFile = pluginResult.message.isFile; - entry.name = pluginResult.message.name; - entry.fullPath = pluginResult.message.fullPath; - pluginResult.message = entry; - return pluginResult; -}; - -LocalFileSystem.prototype._castEntries = function(pluginResult) { - var entries = pluginResult.message; - var retVal = []; - for (var i=0; i 0) - { - var constructor = PhoneGap._constructors.shift(); - try - { - constructor(); - } - catch(e) - { - if (typeof(console['log']) == 'function') - { - console.log("Failed to run constructor: " + console.processMessage(e)); - } - else - { - alert("Failed to run constructor: " + e.message); - } - } - } - // all constructors run, now fire the deviceready event - var e = document.createEvent('Events'); - e.initEvent('deviceready'); - document.dispatchEvent(e); - } - }, 1); -})(); - -// session id for calls -PhoneGap.sessionKey = 0; - -// centralized callbacks -PhoneGap.callbackId = 0; -PhoneGap.callbacks = {}; -PhoneGap.callbackStatus = { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }; - -/** - * Creates a gap bridge iframe used to notify the native code about queued - * commands. - * - * @private - */ -PhoneGap.createGapBridge = function() { - gapBridge = document.createElement("iframe"); - gapBridge.setAttribute("style", "display:none;"); - gapBridge.setAttribute("height","0px"); - gapBridge.setAttribute("width","0px"); - gapBridge.setAttribute("frameborder","0"); - document.documentElement.appendChild(gapBridge); - return gapBridge; -} - -/** - * Execute a PhoneGap command by queuing it and letting the native side know - * there are queued commands. The native side will then request all of the - * queued commands and execute them. - * - * Arguments may be in one of two formats: - * - * FORMAT ONE (preferable) - * The native side will call PhoneGap.callbackSuccess or - * PhoneGap.callbackError, depending upon the result of the action. - * - * @param {Function} success The success callback - * @param {Function} fail The fail callback - * @param {String} service The name of the service to use - * @param {String} action The name of the action to use - * @param {String[]} [args] Zero or more arguments to pass to the method - * - * FORMAT TWO - * @param {String} command Command to be run in PhoneGap, e.g. - * "ClassName.method" - * @param {String[]} [args] Zero or more arguments to pass to the method - * object parameters are passed as an array object - * [object1, object2] each object will be passed as - * JSON strings - */ -PhoneGap.exec = function() { - if (!PhoneGap.available) { - alert("ERROR: Attempting to call PhoneGap.exec()" - +" before 'deviceready'. Ignoring."); - return; - } - - var successCallback, failCallback, service, action, actionArgs; - var callbackId = null; - if (typeof arguments[0] !== "string") { - // FORMAT ONE - successCallback = arguments[0]; - failCallback = arguments[1]; - service = arguments[2]; - action = arguments[3]; - actionArgs = arguments[4]; - - // Since we need to maintain backwards compatibility, we have to pass - // an invalid callbackId even if no callback was provided since plugins - // will be expecting it. The PhoneGap.exec() implementation allocates - // an invalid callbackId and passes it even if no callbacks were given. - callbackId = 'INVALID'; - } else { - // FORMAT TWO - splitCommand = arguments[0].split("."); - action = splitCommand.pop(); - service = splitCommand.join("."); - actionArgs = Array.prototype.splice.call(arguments, 1); - } - - // Start building the command object. - var command = { - className: service, - methodName: action, - arguments: [] - }; - - // Register the callbacks and add the callbackId to the positional - // arguments if given. - if (successCallback || failCallback) { - callbackId = service + PhoneGap.callbackId++; - PhoneGap.callbacks[callbackId] = - {success:successCallback, fail:failCallback}; - } - if (callbackId != null) { - command.arguments.push(callbackId); - } - - for (var i = 0; i < actionArgs.length; ++i) { - var arg = actionArgs[i]; - if (arg == undefined || arg == null) { - continue; - } else if (typeof(arg) == 'object') { - command.options = arg; - } else { - command.arguments.push(arg); - } - } - - // Stringify and queue the command. We stringify to command now to - // effectively clone the command arguments in case they are mutated before - // the command is executed. - PhoneGap.commandQueue.push(JSON.stringify(command)); - - // If the queue length is 1, then that means it was empty before we queued - // the given command, so let the native side know that we have some - // commands to execute, unless the queue is currently being flushed, in - // which case the command will be picked up without notification. - if (PhoneGap.commandQueue.length == 1 && !PhoneGap.commandQueueFlushing) { - if (!PhoneGap.gapBridge) { - PhoneGap.gapBridge = PhoneGap.createGapBridge(); - } - - PhoneGap.gapBridge.src = "gap://ready"; - } -} - -/** - * Called by native code to retrieve all queued commands and clear the queue. - */ -PhoneGap.getAndClearQueuedCommands = function() { - json = JSON.stringify(PhoneGap.commandQueue); - PhoneGap.commandQueue = []; - return json; -} - -/** - * Called by native code when returning successful result from an action. - * - * @param callbackId - * @param args - * args.status - PhoneGap.callbackStatus - * args.message - return value - * args.keepCallback - 0 to remove callback, 1 to keep callback in PhoneGap.callbacks[] - */ -PhoneGap.callbackSuccess = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - - // If result is to be sent to callback - if (args.status == PhoneGap.callbackStatus.OK) { - try { - if (PhoneGap.callbacks[callbackId].success) { - PhoneGap.callbacks[callbackId].success(args.message); - } - } - catch (e) { - console.log("Error in success callback: "+callbackId+" = "+e); - } - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - -/** - * Called by native code when returning error result from an action. - * - * @param callbackId - * @param args - */ -PhoneGap.callbackError = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - try { - if (PhoneGap.callbacks[callbackId].fail) { - PhoneGap.callbacks[callbackId].fail(args.message); - } - } - catch (e) { - console.log("Error in error callback: "+callbackId+" = "+e); - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - - -/** - * Does a deep clone of the object. - * - * @param obj - * @return - */ -PhoneGap.clone = function(obj) { - if(!obj) { - return obj; - } - - if(obj instanceof Array){ - var retVal = new Array(); - for(var i = 0; i < obj.length; ++i){ - retVal.push(PhoneGap.clone(obj[i])); - } - return retVal; - } - - if (obj instanceof Function) { - return obj; - } - - if(!(obj instanceof Object)){ - return obj; - } - - if (obj instanceof Date) { - return obj; - } - - retVal = new Object(); - for(i in obj){ - if(!(i in retVal) || retVal[i] != obj[i]) { - retVal[i] = PhoneGap.clone(obj[i]); - } - } - return retVal; -}; - -// Intercept calls to document.addEventListener -PhoneGap.m_document_addEventListener = document.addEventListener; - -// Intercept calls to window.addEventListener -PhoneGap.m_window_addEventListener = window.addEventListener; - -/** - * Add a custom window event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addWindowEventHandler = function(event, callback) { - PhoneGap.windowEventHandler[event] = callback; -} - -/** - * Add a custom document event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addDocumentEventHandler = function(event, callback) { - PhoneGap.documentEventHandler[event] = callback; -} - -/** - * Intercept adding document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If subscribing to an event that is handled by a plugin - if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); -}; - -/** - * Intercept adding window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If subscribing to an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); -}; - -// Intercept calls to document.removeEventListener and watch for events that -// are generated by PhoneGap native code -PhoneGap.m_document_removeEventListener = document.removeEventListener; - -// Intercept calls to window.removeEventListener -PhoneGap.m_window_removeEventListener = window.removeEventListener; - -/** - * Intercept removing document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); -}; - -/** - * Intercept removing window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); -}; - -/** - * Method to fire document event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireDocumentEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - document.dispatchEvent(e); -}; - -/** - * Method to fire window event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireWindowEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - window.dispatchEvent(e); -}; - -/** - * Method to fire event from native code - * Leaving this generic version to handle problems with iOS 3.x. Is currently used by orientation and battery events - * Remove when iOS 3.x no longer supported and call fireWindowEvent or fireDocumentEvent directly - */ -PhoneGap.fireEvent = function(type, target, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - target = target || document; - if (target.dispatchEvent === undefined) { // ie window.dispatchEvent is undefined in iOS 3.x - target = document; - } - - target.dispatchEvent(e); -}; -/** - * Create a UUID - * - * @return - */ -PhoneGap.createUUID = function() { - return PhoneGap.UUIDcreatePart(4) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(6); -}; - -PhoneGap.UUIDcreatePart = function(length) { - var uuidpart = ""; - for (var i=0; i -1) { - me._batteryListener.splice(pos, 1); - } - } else if (eventType === "batterylow") { - var pos = me._lowListener.indexOf(handler); - if (pos > -1) { - me._lowListener.splice(pos, 1); - } - } else if (eventType === "batterycritical") { - var pos = me._criticalListener.indexOf(handler); - if (pos > -1) { - me._criticalListener.splice(pos, 1); - } - } - - // If there are no more registered event listeners stop the battery listener on native side. - if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { - PhoneGap.exec(null, null, "com.phonegap.battery", "stop", []); - } - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = this; - if (me._level != info.level || me._isPlugged != info.isPlugged) { - // Fire batterystatus event - //PhoneGap.fireWindowEvent("batterystatus", info); - // use this workaround since iOS 3.x does have window.dispatchEvent - PhoneGap.fireEvent("batterystatus", window, info); - - // Fire low battery event - if (info.level == 20 || info.level == 5) { - if (info.level == 20) { - //PhoneGap.fireWindowEvent("batterylow", info); - // use this workaround since iOS 3.x does not have window.dispatchEvent - PhoneGap.fireEvent("batterylow", window, info); - } - else { - //PhoneGap.fireWindowEvent("batterycritical", info); - // use this workaround since iOS 3.x does not have window.dispatchEvent - PhoneGap.fireEvent("batterycritical", window, info); - } - } - } - me._level = info.level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.battery === "undefined") { - navigator.battery = new Battery(); - PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); - } -}); -}if (!PhoneGap.hasResource("camera")) { - PhoneGap.addResource("camera"); - - -/** - * This class provides access to the device camera. - * @constructor - */ -Camera = function() { - -} -/** - * Available Camera Options - * {boolean} allowEdit - true to allow editing image, default = false - * {number} quality 0-100 (low to high) default = 100 - * {Camera.DestinationType} destinationType default = DATA_URL - * {Camera.PictureSourceType} sourceType default = CAMERA - * {number} targetWidth - width in pixels to scale image default = 0 (no scaling) - * {number} targetHeight - height in pixels to scale image default = 0 (no scaling) - * {Camera.EncodingType} - encodingType default = JPEG - * {boolean} correctOrientation - Rotate the image to correct for the orientation of the device during capture (iOS only) - * {boolean} saveToPhotoAlbum - Save the image to the photo album on the device after capture (iOS only) - */ -/** - * Format of image that is returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.DestinationType = { - DATA_URL: 0, // Return base64 encoded string - FILE_URI: 1 // Return file uri -}; -Camera.prototype.DestinationType = Camera.DestinationType; - -/** - * Source to getPicture from. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.PictureSourceType = { - PHOTOLIBRARY : 0, // Choose image from picture library - CAMERA : 1, // Take picture from camera - SAVEDPHOTOALBUM : 2 // Choose image from picture library -}; -Camera.prototype.PictureSourceType = Camera.PictureSourceType; - -/** - * Encoding of image returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.CAMERA, - * encodingType: Camera.EncodingType.PNG}) - */ -Camera.EncodingType = { - JPEG: 0, // Return JPEG encoded image - PNG: 1 // Return PNG encoded image -}; -Camera.prototype.EncodingType = Camera.EncodingType; - -/** - * Type of pictures to select from. Only applicable when - * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, - * mediaType: Camera.MediaType.PICTURE}) - */ -Camera.MediaType = { - PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType - VIDEO: 1, // allow selection of video only, ONLY RETURNS URL - ALLMEDIA : 2 // allow selection from all media types -}; -Camera.prototype.MediaType = Camera.MediaType; - -/** - * Gets a picture from source defined by "options.sourceType", and returns the - * image as defined by the "options.destinationType" option. - - * The defaults are sourceType=CAMERA and destinationType=DATA_URL. - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options - */ -Camera.prototype.getPicture = function(successCallback, errorCallback, options) { - // successCallback required - if (typeof successCallback != "function") { - console.log("Camera Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback != "function")) { - console.log("Camera Error: errorCallback is not a function"); - return; - } - - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.camera","getPicture",[options]); -}; - - - -PhoneGap.addConstructor(function() { - if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); -}); -}; - -if (!PhoneGap.hasResource("device")) { - PhoneGap.addResource("device"); - -/** - * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the - * phone, etc. - * @constructor - */ -Device = function() -{ - this.platform = null; - this.version = null; - this.name = null; - this.phonegap = null; - this.uuid = null; - try - { - this.platform = DeviceInfo.platform; - this.version = DeviceInfo.version; - this.name = DeviceInfo.name; - this.phonegap = DeviceInfo.gap; - this.uuid = DeviceInfo.uuid; - - } - catch(e) - { - // TODO: - } - this.available = PhoneGap.available = this.uuid != null; -} - -PhoneGap.addConstructor(function() { - if (typeof navigator.device === "undefined") { - navigator.device = window.device = new Device(); - } -}); -}; -if (!PhoneGap.hasResource("capture")) { - PhoneGap.addResource("capture"); -/** - * The CaptureError interface encapsulates all errors in the Capture API. - */ -function CaptureError() { - this.code = null; -}; - -// Capture error codes -CaptureError.CAPTURE_INTERNAL_ERR = 0; -CaptureError.CAPTURE_APPLICATION_BUSY = 1; -CaptureError.CAPTURE_INVALID_ARGUMENT = 2; -CaptureError.CAPTURE_NO_MEDIA_FILES = 3; -CaptureError.CAPTURE_NOT_SUPPORTED = 20; - -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -function Capture() { - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -}; - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - * - * No audio recorder to launch for iOS - return CAPTURE_NOT_SUPPORTED - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options) { - /*if (errorCallback && typeof errorCallback === "function") { - errorCallback({ - "code": CaptureError.CAPTURE_NOT_SUPPORTED - }); - }*/ - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureAudio", [options]); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options) { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureImage", [options]); -}; - -/** - * Casts a PluginResult message property (array of objects) to an array of MediaFile objects - * (used in Objective-C) - * - * @param {PluginResult} pluginResult - */ -Capture.prototype._castMediaFile = function(pluginResult) { - var mediaFiles = []; - var i; - for (i=0; i} categories -* @param {ContactField[]} urls contact's web sites -*/ -var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; // JS Date - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; - this.urls = urls || null; // ContactField[] -}; - -/** -* Converts Dates to milliseconds before sending to iOS -*/ -Contact.prototype.convertDatesOut = function() -{ - var dates = new Array("birthday"); - for (var i=0; i][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - this.fileName = ""; - - if (typeof file.fullPath === "undefined") { - this.fileName = file; - } else { - this.fileName = file.fullPath; - } - - // LOADING state - this.readyState = FileReader.LOADING; - - // If loadstart callback - if (typeof this.onloadstart === "function") { - var evt = File._createEvent("loadstart", this); - this.onloadstart(evt); - } - - var me = this; - - // Read file - navigator.fileMgr.readAsDataURL(this.fileName, - - // Success callback - function(r) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save result - me.result = r; - - // If onload callback - if (typeof me.onload === "function") { - evt = File._createEvent("load", me); - me.onload(evt); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - evt = File._createEvent("loadend", me); - me.onloadend(evt); - } - }, - - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - evt = File._createEvent("loadend", me); - me.onloadend(evt); - } - } - ); -}; - -/** - * Read file and return data as a binary data. - * - * @param file The name of the file - */ -FileReader.prototype.readAsBinaryString = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -/** - * Read file and return data as a binary data. - * - * @param file The name of the file - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -//----------------------------------------------------------------------------- -// File Writer -//----------------------------------------------------------------------------- - -/** - * This class writes to the mobile device file system. - * - @param file {File} a File object representing a file on the file system -*/ -FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -} - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw FileError.INVALID_STATE_ERR; - } - - // set error - var error = new FileError(), evt; - error.code = error.ABORT_ERR; - this.error = error; - - // If error callback - if (typeof this.onerror === "function") { - evt = File._createEvent("error", this); - this.onerror(evt); - } - // If abort callback - if (typeof this.onabort === "function") { - evt = File._createEvent("abort", this); - this.onabort(evt); - } - - this.readyState = FileWriter.DONE; - - // If write end callback - if (typeof this.onwriteend == "function") { - evt = File._createEvent("writeend", this); - this.onwriteend(evt); - } -}; - -/** - * @Deprecated: use write instead - * - * @param file to write the data to - * @param text to be written - * @param bAppend if true write to end of file, otherwise overwrite the file - */ -FileWriter.prototype.writeAsText = function(file, text, bAppend) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - if (bAppend !== true) { - bAppend = false; // for null values - } - - this.fileName = file; - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - - // Write file - navigator.fileMgr.writeAsText(file, text, bAppend, - // Success callback - function(r) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save result - me.result = r; - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - // Write file - navigator.fileMgr.write(this.fileName, text, this.position, - - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - me.length = me.position; - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); - -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - if (!offset) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger then file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - // what if no size specified? - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - // Write file - navigator.fileMgr.truncate(this.fileName, size, - - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); -}; - -LocalFileSystem = function() { -}; - -// File error codes -LocalFileSystem.TEMPORARY = 0; -LocalFileSystem.PERSISTENT = 1; -LocalFileSystem.RESOURCE = 2; -LocalFileSystem.APPLICATION = 3; - -/** - * Requests a filesystem in which to store application data. - * - * @param {int} type of file system being requested - * @param {Function} successCallback is called with the new FileSystem - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { - if (type < 0 || type > 3) { - if (typeof errorCallback == "function") { - errorCallback({ - "code": FileError.SYNTAX_ERR - }); - } - } - else { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "requestFileSystem", [type, size]); - } -}; - -/** - * - * @param {DOMString} uri referring to a local file in a filesystem - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "resolveLocalFileSystemURI", [uri]); -}; - -/** -* This function is required as we need to convert raw -* JSON objects into concrete File and Directory objects. -* -* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. -* @returns an entry -*/ -LocalFileSystem.prototype._castFS = function(pluginResult) { - var entry = null; - entry = new DirectoryEntry(); - entry.isDirectory = pluginResult.message.root.isDirectory; - entry.isFile = pluginResult.message.root.isFile; - entry.name = pluginResult.message.root.name; - entry.fullPath = pluginResult.message.root.fullPath; - pluginResult.message.root = entry; - return pluginResult; -} - -LocalFileSystem.prototype._castEntry = function(pluginResult) { - var entry = null; - if (pluginResult.message.isDirectory) { - entry = new DirectoryEntry(); - } - else if (pluginResult.message.isFile) { - entry = new FileEntry(); - } - entry.isDirectory = pluginResult.message.isDirectory; - entry.isFile = pluginResult.message.isFile; - entry.name = pluginResult.message.name; - entry.fullPath = pluginResult.message.fullPath; - pluginResult.message = entry; - return pluginResult; -} - -LocalFileSystem.prototype._castEntries = function(pluginResult) { - var entries = pluginResult.message; - var retVal = []; - for (i=0; i - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml b/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml deleted file mode 100644 index bc12cd8231..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml b/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml deleted file mode 100644 index 4af1380e95..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml b/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml deleted file mode 100644 index 44673ed78b..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Hello World, WebODFActivity! - WebODF - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml b/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml deleted file mode 100755 index 97f31ea110..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml b/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml deleted file mode 100644 index 3d8d48d838..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java b/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java deleted file mode 100644 index 9c826c9210..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.webodf; - -import android.os.Bundle; - -import com.phonegap.DroidGap; - -public class WebODFActivity extends DroidGap { - - private String path; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - path = null; - if (getIntent() != null && getIntent().getData() != null) { - path = getIntent().getData().getPath(); - } - setContentView(R.layout.main); - super.loadUrl("file:///android_asset/www/index.html"); - } - - @Override - protected void onResume() { - super.onResume(); - if (path == null) { - return; - } - String escapedPath = "file://" + path.replace("'", "\\'"); - sendJavascript("invokeString = '" + escapedPath + "';"); - } - -} \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh b/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh deleted file mode 100755 index b51e94290b..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh +++ /dev/null @@ -1,3 +0,0 @@ -# /bin/bash -cd assets -for f in `find . -type f`; do cp ../../webodf/$f $f; done diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/docnosis/CMakeLists.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng deleted file mode 100644 index 97fe580eab..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng deleted file mode 100644 index 4082d4ba95..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng deleted file mode 100644 index cf4ee51741..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng +++ /dev/null @@ -1,17666 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - short - int - long - double - string - datetime - base64Binary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - simple - - - - - replace - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - date - - - - - - time - - - - - - boolean - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - none - - - - - condition - - - - - - - - - - - - - - - - - - - - - simple - - - - - embed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - footnote - endnote - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - previous - current - next - - - - - - - - - - - - - - previous - next - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - name - number - number-and-name - plain-number-and-name - plain-number - - - - - - - - - - - - - - - - - - - full - path - name - name-and-extension - - - - - - - - - - - - - - - - - - full - path - name - name-and-extension - area - title - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:page-count - text:paragraph-count - text:word-count - text:character-count - text:table-count - text:image-count - text:object-count - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - table - text-box - image - object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:reference-ref - text:bookmark-ref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page - chapter - direction - text - - - - - - - - - page - chapter - direction - text - category-and-value - caption - value - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - unit - gap - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - - - percentage - - - - - - - - currency - - - - - - - - - - - - - date - - - - - - - - time - - - - - - - - boolean - - - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - none - - - - - - - - - value - formula - none - - - - - - - - - value - formula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:identifier - text:address - text:annote - text:author - text:booktitle - text:chapter - text:edition - text:editor - text:howpublished - text:institution - text:journal - text:month - text:note - text:number - text:organizations - text:pages - text:publisher - text:school - text:series - text:title - text:report-type - text:volume - text:year - text:url - text:custom1 - text:custom2 - text:custom3 - text:custom4 - text:custom5 - text:isbn - text:issn - - - - - - - - - - article - book - booklet - conference - custom1 - custom2 - custom3 - custom4 - custom5 - email - inbook - incollection - inproceedings - journal - manual - mastersthesis - misc - phdthesis - proceedings - techreport - unpublished - www - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - category-and-value - caption - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - separator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - name - number - number-and-name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - right - - - - left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - collapse - filter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+ - - - - - ($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+)? - - - - - - - - - - - - - - - - - - - copy-all - copy-results-only - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - trace-dependents - remove-dependents - trace-precedents - remove-precedents - trace-errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-another-table - to-another-table - from-same-table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enable - disable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - unsorted - sort-ascending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - stop - warning - information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - print-range - filter - repeat-row - repeat-column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - self - cell-range - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - data - hidden - - - - - page - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-top - from-bottom - - - - - - - - - - - - - - data - - - - - - - - none - manual - name - - - - - - - - ascending - descending - - - - - - - - - - - - - tabular-layout - outline-subtotals-top - outline-subtotals-bottom - - - - - - - - - - - - - - - - - - - - - - - named - - - - - - - - previous - next - - - - - - - - none - member-difference - member-percentage - member-percentage-difference - running-total - row-percentage - column-percentage - total-percentage - index - - - - - - - - - - - - - - - - - - - - - - auto - - - - - - auto - - - - - - - - - - auto - - - - - - auto - - - - - - - - - - - - - seconds - minutes - hours - days - months - quarters - years - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - accepted - rejected - pending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - always - screen - printer - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - full - section - cut - arc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - standard - lines - line - curve - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page - frame - paragraph - char - as-char - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom-right - - - - - - - auto - left - right - up - down - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - scale - scale-min - - - - - - - - scale - scale-min - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - onRequest - - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - nohref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - non-primitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - segments - rectangle - - - - - - - - - - - - - - - - - - - - - normal - path - shape - - - - - - - - - path - shape - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - title - outline - subtitle - text - graphic - object - chart - table - orgchart - page - notes - handout - header - footer - date-time - page-number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - fade - move - stripes - open - close - dissolve - wavyline - random - lines - laser - appear - hide - move-short - checkerboard - rotate - stretch - - - - - - - - - - - - none - from-left - from-top - from-right - from-bottom - from-center - from-upper-left - from-upper-right - from-lower-left - from-lower-right - to-left - to-top - to-right - to-bottom - to-upper-left - to-upper-right - to-lower-right - to-lower-left - path - spiral-inward-left - spiral-inward-right - spiral-outward-left - spiral-outward-right - vertical - horizontal - to-center - clockwise - counter-clockwise - - - - - - - - - - - - slow - medium - fast - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - on-click - with-previous - after-previous - timing-root - main-sequence - interactive-sequence - - - - - - - - - - - - - - - - - - - - - - - custom - entrance - exit - emphasis - motion-path - ole-action - media-call - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - previous-page - next-page - first-page - last-page - hide - stop - execute - show - verb - fade-out - sound - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - current-date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - top-start - bottom-start - top-end - bottom-end - - - - - - - - - - - - - wide - high - balanced - - - - - custom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x - y - z - - - - - - - - - - - - - - - - - - - - - - - - - - - major - minor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - get - post - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - current - parent - - - - - - - - - - - - - - - - - - - records - current - page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unchecked - checked - unknown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - submit - reset - push - url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - 3d - - - - - - - - - center - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - sql - sql-pass-through - value-list - table-fields - - - - - - - - - - - - - - - - - - - - - - - - - - - void - - - - - - - - - - - - - - float - - - - - - - - - - - - percentage - - - - - - - - - - - - currency - - - - - - - - - - - - - - - - - date - - - - - - - - - - - - time - - - - - - - - - - - - boolean - - - - - - - - - - - - string - - - - - - - - - - - void - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - i - I - - - - - - - - a - A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - into-default-style-data-style - into-english-number - keep-text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - - - - - - - - - - - rgb - hsl - - - - - - - - - clockwise - counter-clockwise - - - - - - - - - - - - - - - - - - translate - scale - rotate - skewX - skewY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - forward - reverse - - - - - - - - - in - out - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - - - - - - - - - - - - - none - sum - - - - - - - - - replace - sum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - first - last - all - media - - - - - - - - - - - - - - - - - - - remove - freeze - hold - auto - default - transition - - - - - - - - - remove - freeze - hold - transition - auto - inherit - - - - - - - - - never - always - whenNotActive - default - - - - - - - - - never - always - whenNotActive - inherit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - left - right - mirrored - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - ultra-condensed - extra-condensed - condensed - semi-condensed - semi-expanded - expanded - extra-expanded - ultra-expanded - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - medium - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gregorian - gengou - ROC - hanja_yoil - hanja - hijri - jewish - buddhist - - - - - - - - - text - - - - - - - - - - paragraph - - - - - - - - - - - - - section - - - - - - - - - - ruby - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - rigth - inner - outer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - page - - - - - - - - - text - page - section - document - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - - - - - - - - - - table-column - - - - - - - - - - table-row - - - - - - - - - - table-cell - - - - - - - - - - - - - - - - - graphic - presentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - drawing-page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - linear - axial - radial - ellipsoid - square - rectangular - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - objectBoundingBox - - - - - - - - - - - pad - reflect - repeat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - single - double - triple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rect - round - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - - - - - - - - - - portrait - landscape - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - headers - grid - annotations - objects - charts - drawings - formulas - zero-values - - - - - - - - - - - ttb - ltr - - - - - - - - - - continue - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - both - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - - - - - - - - - - - - - - none - line - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - small-caps - - - - - - - none - lowercase - uppercase - capitalize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - super - sub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - roman - swiss - modern - decorative - script - system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - variable - - - - - - - - - - - - - [A-Za-z][A-Za-z0-9._\-]* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - latin - asian - complex - ignore - - - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - italic - oblique - - - - - - - none - embossed - engraved - - - - - - - - - - - - - - - none - - - - - - - - - - - - - - - none - single - double - - - - - - - - - - - - - none - solid - dotted - dash - long-dash - dot-dash - dot-dot-dash - wave - - - - - - - - - - - - - auto - normal - bold - thin - dash - medium - thick - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - normal - bold - 100 - 200 - 300 - 400 - 500 - 600 - 700 - 800 - 900 - - - - - - - - - - - - - continuous - skip-white-space - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - letters - lines - - - - - - - - - - - - - - - - - - - - - none - - - none - accent - dot - circle - disc - - - above - below - - - - - - - - - - - - - - - - - - - - - - - - - fixed - line-height - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - none - - - - condition - - - none - - - - - - - - - - - - - - - - - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - start - end - left - right - center - justify - - - - - - - - - start - center - justify - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - char - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - page - - - - - - - - - no-limit - - - - - - - - - - - - - - - - - - - - - - word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - column - page - - - - - - - auto - column - page - - - - - - - - - - - - - transparent - - - - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - - - left - center - right - top - bottom - - - - - - - - - - - - - - - - left - center - right - - - - - top - center - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - none - ideograph-alpha - - - - - - - - - simple - hanging - - - - - - - - - normal - strict - - - - - - - - - top - middle - bottom - auto - - - - - - - - - - - - - lr-tb - rl-tb - tb-rl - tb-lr - lr - rl - tb - page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - above - below - - - - - - - - - left - center - right - distribute-letter - distribute-space - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - solid - dotted - dashed - dot-dashed - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - margins - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - collapsing - separating - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - automatic - - - - - - - - - fix - value-type - - - - - - - - - - - - - ltr - ttb - - - - - - - - - auto - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-wrap - wrap - - - - - - - - - - - - - - - - - - - - none - bottom - top - center - - - - - - - - - none - hidden-and-protected - - - - protected - formula-hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - dash - solid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 1 - - - - - - - - - - - miter - round - bevel - middle - none - inherit - - - - - - - - - none - solid - bitmap - gradient - hatch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom - bottom-right - - - - - - - - - - - - - - - - - - - - - - - - - - - - nonzero - evenodd - - - - - - - - - - - - - - - - none - scroll - alternate - slide - - - - - - - - - left - right - up - down - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - justify - - - - - - - - - left - center - right - justify - - - - - - - - - no-wrap - wrap - - - - - - - - - - - - - - greyscale - mono - watermark - standard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - below - above - - - - - - - - - - - - - - - - automatic - left-outside - inside - right-outside - - - - - - - automatic - above - below - center - - - - - - - - - automatic - mm - cm - m - km - pt - pc - inch - ft - mi - - - - - - - - - - - - - - - - - - - - - - - straight-line - angled-line - angled-connector-line - - - - - - - - - fixed - free - - - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - auto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - correct - attractive - - - - - - - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - standard - double-sided - - - - - - - - - object - flat - sphere - - - - - - - - - normal - inverse - - - - - - - - - object - parallel - sphere - - - - - - - object - parallel - sphere - - - - - - - - - luminance - intesity - color - - - - - - - - - enabled - disabled - - - - - - - - - replace - modulate - blend - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - content - position - size - - - - - - - - - - - - left - center - right - from-left - inside - outside - from-inside - - - - - - - - - - - - - - page - page-content - page-start-margin - page-end-margin - frame - frame-content - frame-start-margin - frame-end-margin - paragraph - paragraph-content - paragraph-start-margin - paragraph-end-margin - char - - - - - - - - - - - - - top - middle - bottom - from-top - below - - - - - - - - - - - - - - - - - - page - page-content - frame - frame-content - paragraph - paragraph-content - char - line - baseline - text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - left - right - parallel - dynamic - run-through - biggest - - - - - - - - - - - - - - - - no-limit - - - - - - - - - - - - - - - - - full - outside - - - - - - - - - foreground - background - - - - - - - - - - - - - - - - clip - auto-create-new-frame - - - - - - - - - none - vertical - - - vertical - - - - - vertical - - - - - - - - - horizontal - horizontal-on-odd - horizontal-on-even - - - - - - - - - - - - - - - iterative - once-concurrent - once-successive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - automatic - - - - named-symbol - - - - square - diamond - arrow-down - arrow-up - arrow-right - arrow-left - bow-tie - hourglass - circle - star - x - plus - asterisk - horizontal-bar - vertical-bar - - - - - - image - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - cubic-spline - b-spline - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cuboid - cylinder - cone - pyramid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - side-by-side - stagger-even - stagger-odd - - - - - - - - - - - - - - - none - value - percentage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - variance - standard-deviation - percentage - error-margin - constant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - columns - rows - - - - - - - - - none - linear - logarithmic - exponential - power - - - - - - - - - manual - automatic - semi-automatic - - - - - - - - - none - fade-from-left - fade-from-top - fade-from-right - fade-from-bottom - fade-from-upperleft - fade-from-upperright - fade-from-lowerleft - fade-from-lowerright - move-from-left - move-from-top - move-from-right - move-from-bottom - move-from-upperleft - move-from-upperright - move-from-lowerleft - move-from-lowerright - uncover-to-left - uncover-to-top - uncover-to-right - uncover-to-bottom - uncover-to-upperleft - uncover-to-upperright - uncover-to-lowerleft - uncover-to-lowerright - fade-to-center - fade-from-center - vertical-stripes - horizontal-stripes - clockwise - counterclockwise - open-vertical - open-horizontal - close-vertical - close-horizontal - wavyline-from-left - wavyline-from-top - wavyline-from-right - wavyline-from-bottom - spiralin-left - spiralin-right - spiralout-left - spiralout-right - roll-from-top - roll-from-left - roll-from-right - roll-from-bottom - stretch-from-left - stretch-from-top - stretch-from-right - stretch-from-bottom - - vertical-lines - horizontal-lines - dissolve - random - vertical-checkerboard - horizontal-checkerboard - interlocking-horizontal-left - interlocking-horizontal-right - interlocking-vertical-top - interlocking-vertical-bottom - fly-away - open - close - melt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - forward - reverse - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - full - border - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - - - - - - - - - - - - - - - - - [A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})* - - - - - [A-Za-z0-9]{1,8} - - - - - [A-Za-z]{1,8} - - - - - 1 - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% - - - - - [0-9]+\* - - - - - - - - - - - #[0-9a-fA-F]{6} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _self - _blank - _parent - _top - - - - - - - float - time - date - percentage - currency - boolean - string - - - - - - -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* - - - - - - - - - \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) - - - - - - - [0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+ - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng deleted file mode 100644 index 3ba6a687c4..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng +++ /dev/null @@ -1,17891 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - short - int - long - double - string - datetime - base64Binary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - simple - - - - - replace - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - date - - - - - - time - - - - - - boolean - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - none - - - - - condition - - - - - - - - - - - - - - - - - - - - - simple - - - - - embed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - footnote - endnote - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - previous - current - next - - - - - - - - - - - - - - previous - next - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - name - number - number-and-name - plain-number-and-name - plain-number - - - - - - - - - - - - - - - - - - - full - path - name - name-and-extension - - - - - - - - - - - - - - - - - - full - path - name - name-and-extension - area - title - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:page-count - text:paragraph-count - text:word-count - text:character-count - text:table-count - text:image-count - text:object-count - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - table - text-box - image - object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:reference-ref - text:bookmark-ref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page - chapter - direction - text - - - - - - - - - page - chapter - direction - text - category-and-value - caption - value - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - unit - gap - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - - - percentage - - - - - - - - currency - - - - - - - - - - - - - date - - - - - - - - time - - - - - - - - boolean - - - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - none - - - - - - - - - value - formula - none - - - - - - - - - value - formula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:identifier - text:address - text:annote - text:author - text:booktitle - text:chapter - text:edition - text:editor - text:howpublished - text:institution - text:journal - text:month - text:note - text:number - text:organizations - text:pages - text:publisher - text:school - text:series - text:title - text:report-type - text:volume - text:year - text:url - text:custom1 - text:custom2 - text:custom3 - text:custom4 - text:custom5 - text:isbn - text:issn - - - - - - - - - - article - book - booklet - conference - custom1 - custom2 - custom3 - custom4 - custom5 - email - inbook - incollection - inproceedings - journal - manual - mastersthesis - misc - phdthesis - proceedings - techreport - unpublished - www - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - category-and-value - caption - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - separator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - name - number - number-and-name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - right - - - - left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - collapse - filter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+ - - - - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)? - - - - - - - - - - - - - - - - - - - copy-all - copy-results-only - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - trace-dependents - remove-dependents - trace-precedents - remove-precedents - trace-errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-another-table - to-another-table - from-same-table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enable - disable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - unsorted - sort-ascending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - stop - warning - information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - print-range - filter - repeat-row - repeat-column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - self - cell-range - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - data - hidden - - - - - page - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-top - from-bottom - - - - - - - - - - - - - - data - - - - - - - - none - manual - name - - - - - - - - ascending - descending - - - - - - - - - - - - - tabular-layout - outline-subtotals-top - outline-subtotals-bottom - - - - - - - - - - - - - - - - - - - - - - - named - - - - - - - - previous - next - - - - - - - - none - member-difference - member-percentage - member-percentage-difference - running-total - row-percentage - column-percentage - total-percentage - index - - - - - - - - - - - - - - - - - - - - - - auto - - - - - - auto - - - - - - - - - - auto - - - - - - auto - - - - - - - - - - - - - seconds - minutes - hours - days - months - quarters - years - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - accepted - rejected - pending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - always - screen - printer - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - full - section - cut - arc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - standard - lines - line - curve - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page - frame - paragraph - char - as-char - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom-right - - - - - - - - auto - left - right - up - down - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - scale - scale-min - - - - - - - - scale - scale-min - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - onRequest - - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - nohref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - non-primitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - segments - rectangle - - - - - - - - - - - - - - - - - - - - - normal - path - shape - - - - - - - - - path - shape - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - title - outline - subtitle - text - graphic - object - chart - table - orgchart - page - notes - handout - header - footer - date-time - page-number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - fade - move - stripes - open - close - dissolve - wavyline - random - lines - laser - appear - hide - move-short - checkerboard - rotate - stretch - - - - - - - - - - - - none - from-left - from-top - from-right - from-bottom - from-center - from-upper-left - from-upper-right - from-lower-left - from-lower-right - to-left - to-top - to-right - to-bottom - to-upper-left - to-upper-right - to-lower-right - to-lower-left - path - spiral-inward-left - spiral-inward-right - spiral-outward-left - spiral-outward-right - vertical - horizontal - to-center - clockwise - counter-clockwise - - - - - - - - - - - - slow - medium - fast - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - on-click - with-previous - after-previous - timing-root - main-sequence - interactive-sequence - - - - - - - - - - - - - - - - - - - - - - - custom - entrance - exit - emphasis - motion-path - ole-action - media-call - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - previous-page - next-page - first-page - last-page - hide - stop - execute - show - verb - fade-out - sound - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - current-date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - top-start - bottom-start - top-end - bottom-end - - - - - - - - - - - - - wide - high - balanced - - - - - custom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x - y - z - - - - - - - - - - - - - - - - - - - - - - - - - - - major - minor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - get - post - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - current - parent - - - - - - - - - - - - - - - - - - - records - current - page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unchecked - checked - unknown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - submit - reset - push - url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - 3d - - - - - - - - - center - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - sql - sql-pass-through - value-list - table-fields - - - - - - - - - - - - - - - - - - - - - - - - - - - void - - - - - - - - - - - - - - float - - - - - - - - - - - - percentage - - - - - - - - - - - - currency - - - - - - - - - - - - - - - - - date - - - - - - - - - - - - time - - - - - - - - - - - - boolean - - - - - - - - - - - - string - - - - - - - - - - - void - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - i - I - - - - - - - - a - A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - into-default-style-data-style - into-english-number - keep-text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - - - - - - - - - - - rgb - hsl - - - - - - - - - clockwise - counter-clockwise - - - - - - - - - - - - - - - - - - translate - scale - rotate - skewX - skewY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - forward - reverse - - - - - - - - - in - out - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - - - - - - - - - - - - - none - sum - - - - - - - - - replace - sum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - first - last - all - media - - - - - - - - - - - - - - - indefinite - - - - - - - - - remove - freeze - hold - auto - default - transition - - - - - - - - - remove - freeze - hold - transition - auto - inherit - - - - - - - - - never - always - whenNotActive - default - - - - - - - - - never - always - whenNotActive - inherit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - left - right - mirrored - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - ultra-condensed - extra-condensed - condensed - semi-condensed - semi-expanded - expanded - extra-expanded - ultra-expanded - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - medium - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gregorian - gengou - ROC - hanja_yoil - hanja - hijri - jewish - buddhist - - - - - - - - - text - - - - - - - - - - paragraph - - - - - - - - - - - - - section - - - - - - - - - - ruby - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - right - inner - outer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - page - - - - - - - - - text - page - section - document - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - - - - - - - - - - table-column - - - - - - - - - - table-row - - - - - - - - - - table-cell - - - - - - - - - - - - - - - - - graphic - presentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - drawing-page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - linear - axial - radial - ellipsoid - square - rectangular - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - objectBoundingBox - - - - - - - - - - - pad - reflect - repeat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - single - double - triple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rect - round - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - - - - - - - - - - portrait - landscape - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - headers - grid - annotations - objects - charts - drawings - formulas - zero-values - - - - - - - - - - - ttb - ltr - - - - - - - - - - continue - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - both - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - - - - - - - - - - - - - - none - line - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - small-caps - - - - - - - none - lowercase - uppercase - capitalize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - super - sub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - roman - swiss - modern - decorative - script - system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - variable - - - - - - - - - - - - - - - - - - - - - - - [A-Za-z][A-Za-z0-9._\-]* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - latin - asian - complex - ignore - - - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - italic - oblique - - - - - - - none - embossed - engraved - - - - - - - - - - - - - - - none - - - - - - - - - - - - - - - none - single - double - - - - - - - - - - - - - none - solid - dotted - dash - long-dash - dot-dash - dot-dot-dash - wave - - - - - - - - - - - - - auto - normal - bold - thin - dash - medium - thick - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - normal - bold - 100 - 200 - 300 - 400 - 500 - 600 - 700 - 800 - 900 - - - - - - - - - - - - - continuous - skip-white-space - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - letters - lines - - - - - - - - - - - - - - - - - - - - - none - - - none - accent - dot - circle - disc - - - above - below - - - - - - - - - - - - - - - - - - - - - - - - - fixed - line-height - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - none - - - - condition - - - none - - - - - - - - - - - - - - - - - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - start - end - left - right - center - justify - - - - - - - - - start - center - justify - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - char - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - page - - - - - - - - - no-limit - - - - - - - - - - - - - - - - - - - - - - word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - column - page - - - - - - - auto - column - page - - - - - - - - - - - - - transparent - - - - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - - - left - center - right - top - bottom - - - - - - - - - - - - - - - - left - center - right - - - - - top - center - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - none - ideograph-alpha - - - - - - - - - simple - hanging - - - - - - - - - normal - strict - - - - - - - - - top - middle - bottom - auto - baseline - - - - - - - - - - - - - lr-tb - rl-tb - tb-rl - tb-lr - lr - rl - tb - page - - - - - - - - - - - - - - - - - - - - - - - - - - auto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - above - below - - - - - - - - - left - center - right - distribute-letter - distribute-space - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - solid - dotted - dashed - dot-dashed - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - margins - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - collapsing - separating - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - automatic - - - - - - - - - fix - value-type - - - - - - - - - - - - - ltr - ttb - - - - - - - - - auto - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-wrap - wrap - - - - - - - - - - - - - - - - - - - - none - bottom - top - center - - - - - - - - - none - hidden-and-protected - - - - protected - formula-hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - dash - solid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 1 - - - - - - - - - - - miter - round - bevel - middle - none - inherit - - - - - - - - - none - solid - bitmap - gradient - hatch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom - bottom-right - - - - - - - - - - - - - - - - - - - - - - - - - - - - nonzero - evenodd - - - - - - - - - - - - - - - - none - scroll - alternate - slide - - - - - - - - - left - right - up - down - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - justify - - - - - - - - - left - center - right - justify - - - - - - - - - no-wrap - wrap - - - - - - - - - - - - - - greyscale - mono - watermark - standard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - below - above - - - - - - - - - - - - - - - - automatic - left-outside - inside - right-outside - - - - - - - automatic - above - below - center - - - - - - - - - automatic - mm - cm - m - km - pt - pc - inch - ft - mi - - - - - - - - - - - - - - - - - - - - - - - straight-line - angled-line - angled-connector-line - - - - - - - - - fixed - free - - - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - auto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - correct - attractive - - - - - - - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - standard - double-sided - - - - - - - - - object - flat - sphere - - - - - - - - - normal - inverse - - - - - - - - - object - parallel - sphere - - - - - - - object - parallel - sphere - - - - - - - - - luminance - intensity - color - - - - - - - - - enabled - disabled - - - - - - - - - replace - modulate - blend - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - content - position - size - - - - - - - - - - - - left - center - right - from-left - inside - outside - from-inside - - - - - - - - - - - - - - page - page-content - page-start-margin - page-end-margin - frame - frame-content - frame-start-margin - frame-end-margin - paragraph - paragraph-content - paragraph-start-margin - paragraph-end-margin - char - - - - - - - - - - - - - top - middle - bottom - from-top - below - - - - - - - - - - - - - - - - - - page - page-content - frame - frame-content - paragraph - paragraph-content - char - line - baseline - text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - left - right - parallel - dynamic - run-through - biggest - - - - - - - - - - - - - - - - no-limit - - - - - - - - - - - - - - - - - full - outside - - - - - - - - - foreground - background - - - - - - - - - - - - - - - - clip - auto-create-new-frame - - - - - - - - - none - vertical - - - vertical - - - - - vertical - - - - - - - - - horizontal - horizontal-on-odd - horizontal-on-even - - - - - - - - - - - - - - - iterative - once-concurrent - once-successive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - automatic - - - - named-symbol - - - - square - diamond - arrow-down - arrow-up - arrow-right - arrow-left - bow-tie - hourglass - circle - star - x - plus - asterisk - horizontal-bar - vertical-bar - - - - - - image - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - cubic-spline - b-spline - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cuboid - cylinder - cone - pyramid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - side-by-side - stagger-even - stagger-odd - - - - - - - - - - - - - - - none - value - percentage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - variance - standard-deviation - percentage - error-margin - constant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - columns - rows - - - - - - - - - none - linear - logarithmic - exponential - power - - - - - - - - - manual - automatic - semi-automatic - - - - - - - - - none - fade-from-left - fade-from-top - fade-from-right - fade-from-bottom - fade-from-upperleft - fade-from-upperright - fade-from-lowerleft - fade-from-lowerright - move-from-left - move-from-top - move-from-right - move-from-bottom - move-from-upperleft - move-from-upperright - move-from-lowerleft - move-from-lowerright - uncover-to-left - uncover-to-top - uncover-to-right - uncover-to-bottom - uncover-to-upperleft - uncover-to-upperright - uncover-to-lowerleft - uncover-to-lowerright - fade-to-center - fade-from-center - vertical-stripes - horizontal-stripes - clockwise - counterclockwise - open-vertical - open-horizontal - close-vertical - close-horizontal - wavyline-from-left - wavyline-from-top - wavyline-from-right - wavyline-from-bottom - spiralin-left - spiralin-right - spiralout-left - spiralout-right - roll-from-top - roll-from-left - roll-from-right - roll-from-bottom - stretch-from-left - stretch-from-top - stretch-from-right - stretch-from-bottom - - vertical-lines - horizontal-lines - dissolve - random - vertical-checkerboard - horizontal-checkerboard - interlocking-horizontal-left - interlocking-horizontal-right - interlocking-vertical-top - interlocking-vertical-bottom - fly-away - open - close - melt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - full - border - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - - - - - - - - - - - - - - - - - - - - [A-Za-z0-9]{1,8} - - - - - [A-Za-z]{1,8} - - - - - 1 - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - ([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% - - - - - [0-9]+\* - - - - - - - - - - - #[0-9a-fA-F]{6} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _self - _blank - _parent - _top - - - - - - - float - time - date - percentage - currency - boolean - string - - - - - - -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* - - - - - - - - - \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) - - - - - - - [0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+ - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng deleted file mode 100644 index aa761dc880..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng deleted file mode 100644 index e77fe4ba6e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng deleted file mode 100644 index bb2e591d86..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng deleted file mode 100644 index 8902970eec..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - edit - presentation-slide-show - read-only - - - - - - - - - - - - - - - - - - - - - - - - - - - SHA1/1K - - - - - - - - - - - - - - - - - - - Blowfish CFB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PBKDF2 - - - - - - - - - - - - - - - - - - - - - - - - - - - SHA1 - - - - - - - - - - - - - - - - [^:]+:[^:]+ - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng deleted file mode 100644 index bd57af13f7..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng +++ /dev/null @@ -1,18127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - short - int - long - double - string - datetime - base64Binary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - - - - - - - simple - - - - - - - replace - - - - - onLoad - - - - - - - - - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - date - - - - - - time - - - - - - boolean - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - none - - - - - condition - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:page-count - text:paragraph-count - text:word-count - text:character-count - text:table-count - text:image-count - text:object-count - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:reference-ref - text:bookmark-ref - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - unit - gap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text:identifier - text:address - text:annote - text:author - text:booktitle - text:chapter - text:edition - text:editor - text:howpublished - text:institution - text:journal - text:month - text:note - text:number - text:organizations - text:pages - text:publisher - text:school - text:series - text:title - text:report-type - text:volume - text:year - text:url - text:custom1 - text:custom2 - text:custom3 - text:custom4 - text:custom5 - text:isbn - text:issn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - footnote - endnote - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - previous - current - next - - - - - - - - - - previous - next - - - - - - - - - - - - - - name - number - number-and-name - plain-number-and-name - plain-number - - - - - - - - - - - - - full - path - name - name-and-extension - - - - - - - - - - - full - path - name - name-and-extension - area - title - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - table - text-box - image - object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - number-no-superior - number-all-superior - number - - - - - - - - - - - - - - - - - - - - - - category-and-value - caption - value - - - - - - - page - chapter - direction - text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - float - - - - - - - - percentage - - - - - - - - currency - - - - - - - - - - - - - date - - - - - - - - time - - - - - - - - boolean - - - - - - - - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - value - none - - - - - - - - - value - formula - none - - - - - - - - - value - formula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - article - book - booklet - conference - custom1 - custom2 - custom3 - custom4 - custom5 - email - inbook - incollection - inproceedings - journal - manual - mastersthesis - misc - phdthesis - proceedings - techreport - unpublished - www - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - category-and-value - caption - - - - - - - - - - document - chapter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - separator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - name - number - number-and-name - plain-number - plain-number-and-name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - right - - - - left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - collapse - filter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+ - - - - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)? - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+:($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+ - - - ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+ - - - - - - Value is a space separated list of "cellRangeAddress" patterns - - - - - - - - - - - - - - copy-all - copy-results-only - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - trace-dependents - remove-dependents - trace-precedents - remove-precedents - trace-errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-another-table - to-another-table - from-same-table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - date - - - - - - - - - - - - - - - - enable - disable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - unsorted - sort-ascending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - stop - warning - information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - print-range - filter - repeat-row - repeat-column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - column - row - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - alpha-numeric - integer - double - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - automatic - - - - - - - - ascending - descending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - self - cell-range - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - number - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - data - hidden - - - - - page - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - from-top - from-bottom - - - - - - - - - - - - - - - - data - - - - - - - - none - manual - name - - - - - - ascending - descending - - - - - - - - - - - - - - - tabular-layout - outline-subtotals-top - outline-subtotals-bottom - - - - - - - - - - - - - - - - - - - - - named - - - - - - - - previous - next - - - - - - none - member-difference - member-percentage - member-percentage-difference - running-total - row-percentage - column-percentage - total-percentage - index - - - - - - - - - - - - - - - - - - - - - - auto - - - - - - auto - - - - - - - - auto - - - - - - auto - - - - - - - - - seconds - minutes - hours - days - months - quarters - years - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - average - count - countnums - max - min - product - stdev - stdevp - sum - var - varp - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - accepted - rejected - pending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - always - screen - printer - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - full - section - cut - arc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - standard - lines - line - curve - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page - frame - paragraph - char - as-char - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom-right - - - - - - auto - left - right - up - down - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - scale - scale-min - - - - - - - - scale - scale-min - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - new - replace - - - - - - - - - - - - nohref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - phong - gouraud - draft - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - parallel - perspective - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - segments - rectangle - - - - - - - - - - - - - - - - - normal - path - shape - - - - - - - path - shape - - - - - - - - - - - - - - - - - - non-primitive - - - - - - \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))){2}[ ]*\) - - - - - -0.5 - 0.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - title - outline - subtitle - text - graphic - object - chart - table - orgchart - page - notes - handout - header - footer - date-time - page-number - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - new - replace - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - fade - move - stripes - open - close - dissolve - wavyline - random - lines - laser - appear - hide - move-short - checkerboard - rotate - stretch - - - - - none - from-left - from-top - from-right - from-bottom - from-center - from-upper-left - from-upper-right - from-lower-left - from-lower-right - to-left - to-top - to-right - to-bottom - to-upper-left - to-upper-right - to-lower-right - to-lower-left - path - spiral-inward-left - spiral-inward-right - spiral-outward-left - spiral-outward-right - vertical - horizontal - to-center - clockwise - counter-clockwise - - - - - slow - medium - fast - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - on-click - with-previous - after-previous - timing-root - main-sequence - interactive-sequence - - - - - - - - - - - - - - - - - custom - entrance - exit - emphasis - motion-path - ole-action - media-call - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - previous-page - next-page - first-page - last-page - hide - stop - execute - show - verb - fade-out - sound - last-visited-page - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fixed - current-date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - top-start - bottom-start - top-end - bottom-end - - - - - - - - - wide - high - balanced - - - - - custom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - row - column - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x - y - z - - - - - - - - - - - - - - - - - - - - - - major - minor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - none - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - equal-integer - is-boolean - equal-boolean - equal-use-only-zero - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - short - int - long - double - string - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - none - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-nulls - nullable - - - - - - - - - - - - - - - - - - - - bit - boolean - tinyint - smallint - integer - bigint - float - real - double - numeric - decimal - char - varchar - longvarchar - date - time - timestmp - binary - varbinary - longvarbinary - sqlnull - other - object - distinct - struct - array - blob - clob - ref - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - primary - unique - foreign - - - - - - - - - - - - - cascade - restrict - set-null - no-action - set-default - - - - - - - - cascade - restrict - set-null - no-action - set-default - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - - get - post - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - command - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - current - parent - - - - - records - current - page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - selection - selection-indices - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unchecked - checked - unknown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - horizontal - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - submit - reset - push - url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - flat - 3d - - - - - - - - - center - - - - - - start - end - top - bottom - - - - - - start - center - end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - table - query - sql - sql-pass-through - value-list - table-fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void - - - - - - - - float - - - - - - - - - - - - percentage - - - - - - - - - - - - currency - - - - - - - - - - - - - - - - - date - - - - - - - - - - - - time - - - - - - - - - - - - boolean - - - - - - - - - - - - string - - - - - - - - - - - void - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - i - I - - - - - - - - a - A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - - - To avoid inclusion of the complete MathML schema, anything is allowed within a math:math top-level element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - into-default-style-data-style - into-english-number - keep-text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - rgb - hsl - - - - - - - clockwise - counter-clockwise - - - - - - - - - translate - scale - rotate - skewX - skewY - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - - - - in - out - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - discrete - linear - paced - spline - - - - - - - - - - - - - - - - - - - - - - - - none - sum - - - - - - - replace - sum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - first - last - all - media - - - - - - - - - - - - - - - - indefinite - - - - - - - 0.0 - - - - - - - remove - freeze - hold - auto - default - transition - - - - - - - - - remove - freeze - hold - transition - auto - inherit - - - - - - - - - never - always - whenNotActive - default - - - - - - - - - never - always - whenNotActive - inherit - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - left - right - mirrored - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row - column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - normal - ultra-condensed - extra-condensed - condensed - semi-condensed - semi-expanded - expanded - extra-expanded - ultra-expanded - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - onRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - short - long - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - short - medium - long - - - - - - - - - - - - - - - - - fixed - language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gregorian - gengou - ROC - hanja_yoil - hanja - hijri - jewish - buddhist - - - - - - - - - - text - - - - - - - - paragraph - - - - - - - - - - - section - - - - - - - - ruby - - - - - - - - table - - - - - - - - table-column - - - - - - - - table-row - - - - - - - - table-cell - - - - - - - - - - - - - - - graphic - presentation - - - - - - - - - - - - - - - drawing-page - - - - - - - - chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - right - inner - outer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - document - chapter - page - - - - - - - text - page - section - document - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - address - annote - author - bibliography-type - booktitle - chapter - custom1 - custom2 - custom3 - custom4 - custom5 - edition - editor - howpublished - identifier - institution - isbn - issn - journal - month - note - number - organizations - pages - publisher - report-type - school - series - title - url - volume - year - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - linear - axial - radial - ellipsoid - square - rectangular - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - objectBoundingBox - - - - - - - - - - - pad - reflect - repeat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - single - double - triple - - - - - - - - - - - - - - - - - - - - - - - - simple - - - - - - - embed - - - - - onLoad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rect - round - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - - - - - - - - portrait - landscape - - - - - - - - - - - - - - - - - - - - - - headers - grid - annotations - objects - charts - drawings - formulas - zero-values - - - - - - - - - ttb - ltr - - - - - - - - continue - - - - - - - - - - - - - - - - - horizontal - vertical - both - none - - - - - - - - - - - - - none - line - both - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - lowercase - uppercase - capitalize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - super - sub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - latin - asian - complex - ignore - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - embossed - engraved - - - - - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - letters - lines - - - - - - - - - - - - - - - - - none - - - none - accent - dot - circle - disc - - - above - below - - - - - - - - - - - - - - - - - - - fixed - line-height - - - - - - - - - - - - - - - - - - - - - true - - - none - - - - condition - - - none - - - - - - - - - normal - small-caps - - - - - roman - swiss - modern - decorative - script - system - - - - - fixed - variable - - - - - [A-Za-z][A-Za-z0-9._\-]* - - - - - normal - italic - oblique - - - - - none - - - - - - none - single - double - - - - - none - solid - dotted - dash - long-dash - dot-dash - dot-dot-dash - wave - - - - - auto - normal - bold - thin - medium - thick - - - - - - - - normal - bold - 100 - 200 - 300 - 400 - 500 - 600 - 700 - 800 - 900 - - - - - continuous - skip-white-space - - - - - - - - - - - - - - - - - normal - - - - - - - - - - - - - - - - - - - - - - - - - start - center - justify - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - auto - page - - - - - - - no-limit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - ideograph-alpha - - - - - - - simple - hanging - - - - - - - normal - strict - - - - - - - top - middle - bottom - auto - baseline - - - - - - - - - - - - - - - - - - - - - - - start - end - left - right - center - justify - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - - char - - - - - - - - - - - - - - - - - - - - - - - font-color - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - column - page - - - - - - - auto - column - page - - - - - - - - - transparent - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - left - center - right - top - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - - - - - top - center - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - lr-tb - rl-tb - tb-rl - tb-lr - lr - rl - tb - page - - - - - - - - - - auto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - above - below - - - - - - - left - center - right - distribute-letter - distribute-space - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - solid - dotted - dashed - dot-dashed - - - - - - - - - - - - - - - top - middle - bottom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - left - center - right - margins - - - - - - - - - - - - - - - - - - - - collapsing - separating - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - auto - always - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - automatic - - - - - - - fix - value-type - - - - - - - - auto - 0 - 0deg - 0rad - 0grad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-wrap - wrap - - - - - - - - none - bottom - top - center - - - - - - - none - hidden-and-protected - - - - protected - formula-hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ltr - ttb - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - label-width-and-position - label-alignment - - - - - - - - - - - - - - - - - - - - - listtab - space - nothing - - - - - - - - - - - - - - - - - - - - - - - - - none - dash - solid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 1 - - - - - - - - - miter - round - bevel - middle - none - - - - - - - butt - square - round - - - - - - - - - - - - none - scroll - alternate - slide - - - - - - - left - right - up - down - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top - middle - bottom - justify - - - - - - - left - center - right - justify - - - - - - - no-wrap - wrap - - - - - - - - - - - - greyscale - mono - watermark - standard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - below - above - - - - - - - - - - - - automatic - left-outside - inside - right-outside - - - - - - - automatic - above - below - center - - - - - - - automatic - mm - cm - m - km - pt - pc - inch - ft - mi - - - - - - - - - - - - - - - - - straight-line - angled-line - angled-connector-line - - - - - - - fixed - free - - - - - - - - - - - - - - - - - horizontal - vertical - auto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - correct - attractive - - - - - - - - - - - - - - - - - enabled - disabled - - - - - - - - - - - - - - - - - - - - - - standard - double-sided - - - - - - - object - flat - sphere - - - - - - - normal - inverse - - - - - - - object - parallel - sphere - - - - - - - object - parallel - sphere - - - - - - - luminance - intensity - color - - - - - - - enabled - disabled - - - - - - - replace - modulate - blend - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - - content - position - size - - - - - - - - - - left - center - right - from-left - inside - outside - from-inside - - - - - - - - - - - - page - page-content - page-start-margin - page-end-margin - frame - frame-content - frame-start-margin - frame-end-margin - paragraph - paragraph-content - paragraph-start-margin - paragraph-end-margin - char - - - - - - - - - - - - - - - - - none - left - right - parallel - dynamic - run-through - biggest - - - - - - - - - - - - no-limit - - - - - - - - - - - - - full - outside - - - - - - - foreground - background - - - - - - - - - - - - clip - auto-create-new-frame - - - - - - - none - vertical - - - vertical - - - - - vertical - - - - - - - - auto - - - - - - - - iterative - once-concurrent - once-successive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - content - thumbnail - icon - print-view - - - - - - - - - - - - - - - - none - solid - bitmap - gradient - hatch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - no-repeat - repeat - stretch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - top-left - top - top-right - left - center - right - bottom-left - bottom - bottom-right - - - - - - - - - horizontal - vertical - - - - - - - - - - - - - - - - - - nonzero - evenodd - - - - - - - - - - - - - - - - - - - top - middle - bottom - from-top - below - - - - - - - - - - - - - - page - page-content - frame - frame-content - paragraph - paragraph-content - char - line - baseline - text - - - - - - - - - - - - - - horizontal - horizontal-on-odd - horizontal-on-even - - - - - rect\([ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)))|(auto))([ ]*,[ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))))|(auto)){3}[ ]*\) - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - - - automatic - - - - named-symbol - - - - square - diamond - arrow-down - arrow-up - arrow-right - arrow-left - bow-tie - hourglass - circle - star - x - plus - asterisk - horizontal-bar - vertical-bar - - - - - - image - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - cubic-spline - b-spline - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cuboid - cylinder - cone - pyramid - - - - - - - - - - - - - - - - - use-zero - leave-gap - ignore - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - side-by-side - stagger-even - stagger-odd - - - - - - - - - none - value - percentage - value-and-percentage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - none - variance - standard-deviation - percentage - error-margin - constant - standard-error - cell-range - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - columns - rows - - - - - - - none - linear - logarithmic - exponential - power - - - - - - - start - end - - - - - - - - near-axis - near-axis-other-side - outside-start - outside-end - - - - - - - at-labels - at-axis - at-labels-and-axis - - - - - - - - - - - - - avoid-overlap - center - top - top-right - right - bottom-right - bottom - bottom-left - left - top-left - inside - outside - near-origin - - - - - - - - manual - automatic - semi-automatic - - - - - - - none - fade-from-left - fade-from-top - fade-from-right - fade-from-bottom - fade-from-upperleft - fade-from-upperright - fade-from-lowerleft - fade-from-lowerright - move-from-left - move-from-top - move-from-right - move-from-bottom - move-from-upperleft - move-from-upperright - move-from-lowerleft - move-from-lowerright - uncover-to-left - uncover-to-top - uncover-to-right - uncover-to-bottom - uncover-to-upperleft - uncover-to-upperright - uncover-to-lowerleft - uncover-to-lowerright - fade-to-center - fade-from-center - vertical-stripes - horizontal-stripes - clockwise - counterclockwise - open-vertical - open-horizontal - close-vertical - close-horizontal - wavyline-from-left - wavyline-from-top - wavyline-from-right - wavyline-from-bottom - spiralin-left - spiralin-right - spiralout-left - spiralout-right - roll-from-top - roll-from-left - roll-from-right - roll-from-bottom - stretch-from-left - stretch-from-top - stretch-from-right - stretch-from-bottom - vertical-lines - horizontal-lines - dissolve - random - vertical-checkerboard - horizontal-checkerboard - interlocking-horizontal-left - interlocking-horizontal-right - interlocking-vertical-top - interlocking-vertical-bottom - fly-away - open - close - melt - - - - - - - - - - - - - - - - - - - - - - forward - reverse - - - - - - - - - - - - - - - - - visible - hidden - - - - - - - full - border - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - - - - - - - - - - - - - - - - - - - - [A-Za-z0-9]{1,8} - - - - - [A-Za-z]{1,8} - - - - - [A-Za-z0-9]{1,8} - - - - - 1 - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - ([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px)) - - - - - -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% - - - - - ([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)% - - - - - -?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)% - - - - - [0-9]+\* - - - - - - - - - - - #[0-9a-fA-F]{6} - - - - - - - - (([\i-[:]][\c-[:]]*)?:)?.+ - 1 - - - - - - - - - - - - \[(([\i-[:]][\c-[:]]*)?:)?.+\] - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _self - _blank - _parent - _top - - - - - - float - time - date - percentage - currency - boolean - string - - - - - -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* - - - - - - - - \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) - - - - - [^:]+:[^:]+ - - - - - An IRI-reference as defined in [RFC3987]. See ODF 1.2 Part 1 section 18.3. - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png deleted file mode 100644 index 1d0fdc08af..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png deleted file mode 100644 index 9614ca81d6..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png deleted file mode 100644 index 3fa71f4dc1..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js b/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js deleted file mode 100644 index 4bddc12cc2..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js +++ /dev/null @@ -1,779 +0,0 @@ -/*global runtime, Node, window, DOMParser, core, xmldom, NodeFilter, alert, - FileReader*/ -runtime.loadClass("core.Zip"); -runtime.loadClass("core.Base64"); -runtime.loadClass("xmldom.RelaxNG"); - -/** This code runs a number of tests on an ODF document. - * Ideally, it would use ODFContainer, but for now, it uses a custome container - * for loaded odf files. - */ - -function conformsToPattern(object, pattern, name) { - "use strict"; - var i; - if (object === undefined || object === null) { - return pattern === null || (typeof pattern) !== "object"; - } - for (i in pattern) { - if (pattern.hasOwnProperty(i)) { - if (!(object.hasOwnProperty(i) || - (i === "length" && object.length)) || - !conformsToPattern(object[i], pattern[i], i)) { - return false; - } - } - } - return true; -} - -function getConformingObjects(object, pattern, name) { - "use strict"; - var c = [], i, j; - name = name || "??"; - // we do not look inside long arrays and strings atm, - // detection of these types could be better - function accept(object) { - return object !== null && object !== undefined && - (typeof object) === "object" && - (object.length === undefined || object.length < 1000) && - !(object instanceof Node) && - !(object.constructor && object.constructor === window.Uint8Array); - } - for (i in object) { - if (object.hasOwnProperty(i) && accept(object[i])) { - c = c.concat(getConformingObjects(object[i], pattern, i)); - } - } - if (conformsToPattern(object, pattern, "?")) { - c.push(object); - } - return c; -} -function parseXml(data, errorlog, name) { - "use strict"; - function getText(e) { - var str = "", c = e.firstChild; - while (c) { - if (c.nodeType === 3) { - str += c.nodeValue; - } else { - str += getText(c); - } - c = c.nextSibling; - } - return str; - } - var str, parser, errorelements; - try { - str = runtime.byteArrayToString(data, "utf8"); - parser = new DOMParser(); - str = parser.parseFromString(str, "text/xml"); - if (str.documentElement.localName === "parsererror" - || str.documentElement.localName === "html") { - errorelements = str.getElementsByTagName("parsererror"); - if (errorelements.length > 0) { - errorlog.push("invalid XML in " + name + ": " + - getText(errorelements[0])); - str = null; - } - } - } catch (err) { - errorlog.push(err); - } - return str; -} - -/*** the jobs / tests ***/ - -function ParseXMLJob() { - "use strict"; - this.inputpattern = { file: { entries: [] } }; - this.outputpattern = { - file: { entries: [] }, - errors: { parseXmlErrors: [] }, - content_xml: null, - manifest_xml: null, - settings_xml: null, - meta_xml: null, - styles_xml: null - }; - function parseXmlFiles(input, position, callback) { - var e = input.file.entries, - filename, - ext, - dom; - if (position >= e.length) { - return callback(); - } - filename = e[position].filename; - ext = filename.substring(filename.length - 4); - if (ext === ".xml" || ext === ".rdf") { - dom = parseXml(e[position].data, input.errors.parseXmlErrors, - filename); - if (filename === "content.xml") { - input.content_xml = dom; - } else if (filename === "META-INF/manifest.xml") { - input.manifest_xml = dom; - } else if (filename === "styles.xml") { - input.styles_xml = dom; - } else if (filename === "meta.xml") { - input.meta_xml = dom; - } else if (filename === "settings.xml") { - input.settings_xml = dom; - } - e[position].dom = dom; - } - window.setTimeout(function () { - parseXmlFiles(input, position + 1, callback); - }, 0); - } - this.run = function (input, callback) { - input.errors = input.errors || {}; - input.errors.parseXmlErrors = []; - input.content_xml = null; - input.manifest_xml = null; - input.styles_xml = null; - input.meta_xml = null; - input.settings_xml = null; - parseXmlFiles(input, 0, callback); - }; -} -function UnpackJob() { - "use strict"; - this.inputpattern = { file: { path: "", data: { length: 0 } } }; - this.outputpattern = { - file: { entries: [], dom: null }, errors: { unpackErrors: [] } - }; - function getText(e) { - var str = "", c = e.firstChild; - while (c) { - if (c.nodeType === 3) { - str += c.nodeValue; - } else { - str += getText(c); - } - c = c.nextSibling; - } - return str; - } - function loadZipEntries(input, position, callback) { - if (position >= input.file.entries.length) { - return callback(); - } - var e = input.file.entries[position]; - e.load(function (err, data) { - if (err) { - input.errors.unpackErrors.push(err); - } - e.error = err; - e.data = data; - window.setTimeout(function () { - loadZipEntries(input, position + 1, callback); - }, 0); - }); - } - function loadZip(input, callback) { - var zip = new core.Zip(input.file.path, function (err, zip) { - var i; - if (err) { - input.errors.unpackErrors.push(err); - callback(); - } else { - input.file.entries = zip.getEntries(); - loadZipEntries(input, 0, callback); - } - }); - } - function loadXml(input, callback) { - input.file.dom = parseXml(input.file.data, input.errors.unpackErrors, - input.file.name); - callback(); - } - this.run = function (input, callback) { - input.errors = input.errors || {}; - input.errors.unpackErrors = []; - input.file.dom = null; - input.file.entries = []; - - if (input.file.data.length < 1) { - input.errors.unpackErrors.push("Input data is empty."); - return; - } - if (input.file.data[0] === 80) { // a ZIP file starts with 'P' - loadZip(input, callback); - } else { - loadXml(input, callback); - } - }; -} -function MimetypeTestJob(odffile) { - "use strict"; - this.inputpattern = { - file: { entries: [], dom: null }, - manifest_xml: null - }; - this.outputpattern = { mimetype: "", errors: { mimetypeErrors: [] } }; - var manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"; - function getManifestMimetype(manifest) { - if (!manifest) { - return null; - } - var path, mimetype, node; - node = manifest.documentElement.firstChild; - while (node) { - if (node.nodeType === 1 && node.localName === "file-entry" && - node.namespaceURI === manifestns) { - path = node.getAttributeNS(manifestns, "full-path"); - if (path === "/") { - mimetype = node.getAttributeNS(manifestns, "media-type"); - break; - } - } - node = node.nextSibling; - } - return mimetype; - } - this.run = function (input, callback) { - input.mimetype = null; - input.errors.mimetypeErrors = []; - var mime = null, - altmime, - e = input.file.entries, - i; - if (input.file.dom) { - mime = input.file.dom.documentElement.getAttributeNS( - "urn:oasis:names:tc:opendocument:xmlns:office:1.0", "mimetype"); - } else { - if (e.length < 1 || e[0].filename !== "mimetype") { - input.errors.mimetypeErrors.push( - "First file in zip is not 'mimetype'"); - } - for (i = 0; i < e.length; i += 1) { - if (e[i].filename === "mimetype") { - mime = runtime.byteArrayToString(e[i].data, "binary"); - break; - } - } - if (mime) { - altmime = input.file.data.slice(38, 38 + mime.length); - altmime = runtime.byteArrayToString(altmime, "binary"); - if (mime !== altmime) { - input.errors.mimetypeErrors.push( - "mimetype should start at byte 38 in the zip file."); - } - } - // compare with mimetype from manifest_xml - altmime = getManifestMimetype(input.manifest_xml); - if (altmime !== mime) { - input.errors.mimetypeErrors.push( - "manifest.xml has a different mimetype."); - } - } - if (!mime) { - input.errors.mimetypeErrors.push("No mimetype was found."); - } - input.mimetype = mime; - callback(); - }; -} -function VersionTestJob() { - "use strict"; - this.inputpattern = { - file: { dom: null }, - content_xml: null, - styles_xml: null, - meta_xml: null, - settings_xml: null, - manifest_xml: null - }; - this.outputpattern = { version: "", errors: { versionErrors: [] } }; - var officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"; - function getVersion(dom, filename, log, vinfo, filerequired) { - var v, ns = officens; - if (!dom) { - if (filerequired) { - log.push(filename + " is missing, so version cannot be found."); - } - return; - } - if (filename === "META-INF/manifest.xml") { - ns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"; - } - if (!dom.documentElement.hasAttributeNS(ns, "version")) { - if (vinfo.versionrequired) { - log.push(filename + " has no version number."); - } - return; - } - v = dom.documentElement.getAttributeNS(ns, "version"); - if (vinfo.version === undefined) { - vinfo.version = v; - // version number is required since ODF 1.2 - vinfo.needversion = vinfo.version === "1.2"; - vinfo.versionSource = filename; - } else if (v !== vinfo.version) { - log.push(vinfo.versionSource + " and " + filename + " " + - " have different version number."); - } - } - this.run = function (input, callback) { - input.errors.versionErrors = []; - var v, - e = input.file.entries, - log = input.errors.versionErrors, - vinfo = { - version: undefined, - needversion: null, - versionSource: null - }, - contentxmlhasnoversionnumber; - if (input.file.dom) { - getVersion(input.file.dom, input.file.name, log, vinfo, true); - } else { - // until we know the version number, we cannot claim that - // content.xml needs a version number - getVersion(input.content_xml, "content.xml", log, vinfo, true); - contentxmlhasnoversionnumber = vinfo.version === undefined; - getVersion(input.manifest_xml, "META-INF/manifest.xml", log, - vinfo, true); - getVersion(input.styles_xml, "styles.xml", log, vinfo); - getVersion(input.meta_xml, "meta.xml", log, vinfo); - getVersion(input.settings_xml, "settings.xml", log, vinfo); - if (vinfo.needversion && contentxmlhasnoversionnumber) { - log.push("content.xml has no version number."); - } - } - input.version = vinfo.version; - callback(); - }; -} -function GetThumbnailJob() { - "use strict"; - var base64 = new core.Base64(); - this.inputpattern = { file: { entries: [] }, errors: {}, mimetype: "" }; - this.outputpattern = { thumbnail: "", errors: { thumbnailErrors: [] } }; - this.run = function (input, callback) { - input.thumbnail = null; - input.errors.thumbnailErrors = []; - var i, e = input.file.entries, mime = input.mimetype, thumb = null; - if (mime === "application/vnd.oasis.opendocument.text") { - thumb = "application-vnd.oasis.opendocument.text.png"; - } else if (mime === "application/vnd.oasis.opendocument.spreadsheet") { - thumb = "application-vnd.oasis.opendocument.spreadsheet.png"; - } else if (mime === "application/vnd.oasis.opendocument.presentation") { - thumb = "application-vnd.oasis.opendocument.presentation.png"; - } - for (i = 0; i < e.length; i += 1) { - if (e[i].filename === "Thumbnails/thumbnail.png") { - thumb = "data:image/png;base64," + - base64.convertUTF8ArrayToBase64(e[i].data); - break; - } - } - input.thumbnail = thumb; - callback(); - }; -} -function RelaxNGJob() { - "use strict"; - var parser = new xmldom.RelaxNGParser(), - validators = {}; - this.inputpattern = { file: {dom: null}, version: null }; - this.outputpattern = { errors: { relaxngErrors: [] } }; - function loadValidator(ns, version, callback) { - var rng; - if (ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") { - if (version === "1.2") { - rng = "OpenDocument-v1.2-cos01-manifest-schema.rng"; - } else if (version === "1.1") { - rng = "OpenDocument-manifest-schema-v1.1.rng"; - } else if (version === "1.0") { - rng = "OpenDocument-manifest-schema-v1.0-os.rng"; - } - } else if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0") { - if (version === "1.2") { - rng = "OpenDocument-v1.2-cos01-schema.rng"; - } else if (version === "1.1") { - rng = "OpenDocument-schema-v1.1.rng"; - } else if (version === "1.0") { - rng = "OpenDocument-schema-v1.0-os.rng"; - } - } - if (rng) { - runtime.loadXML(rng, function (err, dom) { - var relaxng; - if (err) { - runtime.log(err); - } else { - relaxng = new xmldom.RelaxNG(); - err = parser.parseRelaxNGDOM(dom, relaxng.makePattern); - if (err) { - runtime.log(err); - } else { - relaxng.init(parser.rootPattern); - } - } - validators[ns] = validators[ns] || {}; - validators[ns][version] = relaxng; - callback(relaxng); - }); - } else { - callback(null); - } - } - function getValidator(ns, version, callback) { - if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0" || - ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") { - if (!version) { - version = "1.1"; - } - } - if (validators[ns] && validators[ns][version]) { - return callback(validators[ns][version]); - } - loadValidator(ns, version, callback); - } - function validate(log, dom, filename, version, callback) { - var ns = dom.documentElement.namespaceURI; - getValidator(ns, version, function (relaxng) { - if (!relaxng) { - return callback(); - } - var walker = dom.createTreeWalker(dom.firstChild, 0xFFFFFFFF, - { acceptNode: function(node) { - return NodeFilter.FILTER_ACCEPT; } - }, false), - err; -runtime.log("START VALIDATING"); - err = relaxng.validate(walker, function (err) { -runtime.log("FINISHED VALIDATING"); - var i; - if (err) { - for (i = 0; i < err.length; i += 1) { - log.push(filename + ": " + err[i]); - } - } - callback(); - }); - }); - } - function validateEntries(log, entries, position, version, callback) { - if (position >= entries.length) { - return callback(); - } - var e = entries[position]; - if (e.dom) { - validate(log, e.dom, e.filename, version, function () { - window.setTimeout(function () { - validateEntries(log, entries, position + 1, version, - callback); - }, 0); - }); - } else { - validateEntries(log, entries, position + 1, version, callback); - } - } - this.run = function (input, callback) { - input.errors = input.errors || {}; - input.errors.relaxngErrors = []; - runtime.log(input.version); - if (input.file.dom) { - validate(input.errors.relaxngErrors, input.file.dom, - input.file.path, input.version, callback); - return; - } - var i, e = input.file.entries; - validateEntries(input.errors.relaxngErrors, input.file.entries, 0, - input.version, callback); - }; -} - -function DataRenderer(parentelement) { - "use strict"; - var doc = parentelement.ownerDocument, - element = doc.createElement("div"), - lastrendertime, - delayedRenderComing, - renderinterval = 300; // minimal milliseconds between renders - function clear(element) { - while (element.firstChild) { - element.removeChild(element.firstChild); - } - } - function addParagraph(div, text) { - var p = doc.createElement("p"); - p.appendChild(doc.createTextNode(text)); - div.appendChild(p); - } - function addSpan(parent, nodename, text) { - var e = doc.createElement(nodename); - e.appendChild(doc.createTextNode(text)); - parent.appendChild(e); - } - function addErrors(div, e, active) { - var i, o; - for (i in e) { - if (e.hasOwnProperty(i)) { - o = e[i]; - if (active && ((typeof o) === "string" - || o instanceof String)) { - addParagraph(div, o); - } else if (o && (typeof o) === "object" && - !(o instanceof Node) && - !(o.constructor && - o.constructor === window.Uint8Array)) { - addErrors(div, o, active || i === "errors"); - } - } - } - } - function renderFile(data) { - var div = doc.createElement("div"), - h1 = doc.createElement("h1"), - icon = doc.createElement("img"); - div.style.clear = "both"; - div.appendChild(h1); - div.appendChild(icon); - h1.appendChild(doc.createTextNode(data.file.path)); - element.appendChild(div); - if (data.thumbnail) { - icon.src = data.thumbnail; - } - icon.style.width = "128px"; - icon.style.float = "left"; - icon.style.mozBoxShadow = icon.style.webkitBoxShadow = - icon.style.boxShadow = "3px 3px 4px #000"; - icon.style.marginRight = icon.style.marginBottom = "10px"; - addParagraph(div, "mimetype: " + data.mimetype); - addParagraph(div, "version: " + data.version); - addParagraph(div, "document representation: " + - ((data.file.dom) ? "single XML document" :"package")); - addErrors(div, data, false); - } - function dorender(data) { - clear(element); - var i; - for (i = 0; i < data.length; i += 1) { - renderFile(data[i]); - } - } - this.render = function render(data) { - var now = Date.now(); - if (!lastrendertime || now - lastrendertime > renderinterval) { - lastrendertime = now; - dorender(data); - } else if (!delayedRenderComing) { - delayedRenderComing = true; - window.setTimeout(function () { - delayedRenderComing = false; - lastrendertime = now + renderinterval; - dorender(data); - }, renderinterval); - } - }; - parentelement.appendChild(element); -} - -function JobRunner(datarenderer) { - "use strict"; - var jobrunner = this, - jobtypes = [], - data, - busy = false, - todo = []; - - jobtypes.push(new UnpackJob()); - jobtypes.push(new MimetypeTestJob()); - jobtypes.push(new GetThumbnailJob()); - jobtypes.push(new VersionTestJob()); - jobtypes.push(new ParseXMLJob()); - jobtypes.push(new RelaxNGJob()); - - function run() { - if (busy) { - return; - } - var job = todo.shift(); - if (job) { - busy = true; - job.job.run(job.object, function () { - busy = false; - if (!conformsToPattern(job.object, job.job.outputpattern)) { - throw "Job does not give correct output."; - } - datarenderer.render(data); - window.setTimeout(run, 0); - }); - } - } - - function update(ignore, callback) { - var i, jobtype, j, inobjects, outobjects; - todo = []; - for (i = 0; i < jobtypes.length; i += 1) { - jobtype = jobtypes[i]; - inobjects = getConformingObjects(data, jobtype.inputpattern); - outobjects = getConformingObjects(data, jobtype.outputpattern); - for (j = 0; j < inobjects.length; j += 1) { - if (outobjects.indexOf(inobjects[j]) === -1) { - todo.push({job: jobtype, object: inobjects[j]}); - } - } - } - if (todo.length > 0) { - // run update again after all todos are done - todo.push({job: jobrunner, object: null}); - } - if (callback) { - callback(); - } else { - run(); - } - } - - this.run = update; - - this.setData = function setData(newdata) { - data = newdata; - if (busy) { - todo = []; - todo.push({job: jobrunner, object: null}); - } else { - update(); - } - }; -} -function LoadingFile(file) { - "use strict"; - var data, - error, - readRequests = []; - function load(callback) { - var reader = new FileReader(); - reader.onloadend = function(evt) { - data = runtime.byteArrayFromString(evt.target.result, "binary"); - error = evt.target.error && String(evt.target.error); - var i = 0; - for (i = 0; i < readRequests.length; i += 1) { - readRequests[i](); - } - readRequests = undefined; - reader = undefined; - callback(error, data); - }; - reader.readAsBinaryString(file); - } - this.file = file; - this.read = function (offset, length, callback) { - function read() { - if (error) { - return callback(error); - } - if (data) { - return callback(error, data.slice(offset, offset + length)); - } - readRequests.push(read); - } - read(); - }; - this.load = load; -} -function Docnosis(element) { - "use strict"; - var doc = element.ownerDocument, - form, - diagnoses = doc.createElement("div"), - openedFiles = {}, - datarenderer = new DataRenderer(diagnoses), - jobrunner = new JobRunner(datarenderer), - jobrunnerdata = []; - - function dragHandler(evt) { - var over = evt.type === "dragover" && evt.target.nodeName !== "INPUT"; - if (over || evt.type === "drop") { - evt.stopPropagation(); - evt.preventDefault(); - } - if (evt.target.style) { - evt.target.style.background = (over ? "#CCCCCC" : "inherit"); - } - } - - function fileSelectHandler(evt) { - // cancel event and hover styling - dragHandler(evt); - - function diagnoseFile(file) { - var loadingfile, path; - path = file.name; - loadingfile = new LoadingFile(file); - openedFiles[path] = loadingfile; - loadingfile.load(function (error, data) { - jobrunnerdata.push({file:{ - path: path, - data: data - }}); - jobrunner.setData(jobrunnerdata); - }); - } - // process all File objects - var i, files, div; - files = (evt.target && evt.target.files) || - (evt.dataTransfer && evt.dataTransfer.files); - if (files) { - for (i = 0; files && i < files.length; i += 1) { - div = doc.createElement("div"); - diagnoses.appendChild(div); - diagnoseFile(files[i]); - } - } else { - alert("File(s) could not be opened in this browser."); - } - } - - function createForm() { - var form = doc.createElement("form"), - fieldset = doc.createElement("fieldset"), - legend = doc.createElement("legend"), - input = doc.createElement("input"); - form = doc.createElement("form"); - form.appendChild(fieldset); - fieldset.appendChild(legend); - input.setAttribute("type", "file"); - input.setAttribute("name", "fileselect[]"); - input.setAttribute("multiple", "multiple"); - input.addEventListener("change", fileSelectHandler, false); - fieldset.appendChild(input); - fieldset.appendChild(doc.createTextNode("or drop files here")); - legend.appendChild(doc.createTextNode("docnosis")); - form.addEventListener("dragover", dragHandler, false); - form.addEventListener("dragleave", dragHandler, false); - form.addEventListener("drop", fileSelectHandler, false); - return form; - } - - function enhanceRuntime() { - var read = runtime.read, - getFileSize = runtime.getFileSize; - runtime.read = function (path, offset, length, callback) { - if (openedFiles.hasOwnProperty(path)) { - return openedFiles[path].read(offset, length, callback); - } else { - return read(path, offset, length, callback); - } - }; - runtime.getFileSize = function (path, callback) { - if (openedFiles.hasOwnProperty(path)) { - return callback(openedFiles[path].file.size); - } else { - return getFileSize(path, callback); - } - }; - } - - form = createForm(); - element.appendChild(form); - element.appendChild(diagnoses); - enhanceRuntime(); -} diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/index.html b/apps/files_odfviewer/src/webodf/programs/docnosis/index.html deleted file mode 100644 index cd56d4f746..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/docnosis/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - docnosis - - - - - - - -
    - - diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt deleted file mode 100644 index 92d1e19f7c..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# the files that go into the extension -set(FIREFOXEXTENSIONFILES - bootstrap.js - chrome.manifest - skin/default/icon.png - content/odf.html - components/odfContentHandler.js -) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/install.rdf.in - ${CMAKE_CURRENT_SOURCE_DIR}/install.rdf) -set(WEBODFXPI ${CMAKE_CURRENT_BINARY_DIR}/webodf-${WEBODF_VERSION}.xpi) -add_custom_command( - OUTPUT ${WEBODFXPI} - # copy the common webodf.css and webodf.js - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different - ${CMAKE_SOURCE_DIR}/webodf/webodf.css - ${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.css - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different - ${CMAKE_BINARY_DIR}/webodf/webodf.js - ${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.js - # zip using javascript code running in node.js - COMMAND ${NODE} ARGS ../../webodf/lib/runtime.js packextension.js - ${WEBODFXPI} - ${FIREFOXEXTENSIONFILES} - content/webodf.js - content/webodf.css - install.rdf - DEPENDS NodeJS - packextension.js ${FIREFOXEXTENSIONFILES} - install.rdf.in - ${CMAKE_SOURCE_DIR}/webodf/webodf.css - ${CMAKE_BINARY_DIR}/webodf/webodf.js - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) -add_custom_target(firefoxextension ALL DEPENDS ${WEBODFXPI}) diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js deleted file mode 100644 index c95dbd4a90..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js +++ /dev/null @@ -1,36 +0,0 @@ -/*global Components: true, dump: true, Services: true*/ - -var Cc = Components.classes; -var Ci = Components.interfaces; -var Cm = Components.manager; -var Cu = Components.utils; - -Cu["import"]('resource://gre/modules/Services.jsm'); - -function log(str) { - "use strict"; - dump(str + '\n'); -} - -function startup(aData, aReason) { - "use strict"; - var manifestPath = 'chrome.manifest', - file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); - try { - file.initWithPath(aData.installPath.path); - file.append(manifestPath); - Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file); - } catch (e) { - log(e); - } -} - -function shutdown(aData, aReason) { - "use strict"; -} - -function install(aData, aReason) { - "use strict"; - var url = 'chrome://webodf.js/content/odf.html?file=%s'; - Services.prefs.setCharPref('extensions.webodf.js.url', url); -} diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest b/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest deleted file mode 100644 index b6f6e75cfb..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest +++ /dev/null @@ -1,13 +0,0 @@ -content webodf.js content/ -skin webodf.js default skin/default/ - -component {afe5fa21-709d-4916-b51c-56f60d574a0a} components/odfContentHandler.js -contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.text {afe5fa21-709d-4916-b51c-56f60d574a0a} -contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.spreadsheet {afe5fa21-709d-4916-b51c-56f60d574a0a} -contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.presentation {afe5fa21-709d-4916-b51c-56f60d574a0a} -category ext-to-type-mapping odt application/vnd.oasis.opendocument.text -category ext-to-type-mapping fodt application/vnd.oasis.opendocument.text -category ext-to-type-mapping ods application/vnd.oasis.opendocument.spreadsheet -category ext-to-type-mapping fods application/vnd.oasis.opendocument.spreadsheet -category ext-to-type-mapping odp application/vnd.oasis.opendocument.presentation -category ext-to-type-mapping fodp application/vnd.oasis.opendocument.presentation diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js deleted file mode 100644 index 47a3d349ac..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js +++ /dev/null @@ -1,196 +0,0 @@ -/*jslint bitwise: true*/ -/*global Components: true, dump: true, Uint8Array: true, Services: true, - XPCOMUtils: true*/ -var Cc = Components.classes; -var Ci = Components.interfaces; -var Cr = Components.results; -var Cu = Components.utils; - -var ODF_CONTENT_TYPE_PREFIX = 'application/vnd.oasis.opendocument.'; -var NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001; - -Cu["import"]('resource://gre/modules/XPCOMUtils.jsm'); -Cu["import"]('resource://gre/modules/Services.jsm'); - -function log(aMsg) { - "use strict"; - var msg = 'odfContentHandler.js: ' + (aMsg.join ? aMsg.join('') : aMsg); - Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService) - .logStringMessage(msg); - dump(msg + '\n'); -} - -function fireEventTo(aName, aData, aWindow) { - "use strict"; - var mywindow = aWindow.wrappedJSObject, - evt = mywindow.document.createEvent('CustomEvent'); - evt.initCustomEvent('odf' + aName, false, false, aData); - mywindow.document.dispatchEvent(evt); -} - -function loadDocument(aWindow, aDocumentUrl) { - "use strict"; - var xhr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1'] - .createInstance(Ci.nsIXMLHttpRequest); - xhr.onprogress = function updateProgress(evt) { - if (evt.lengthComputable) { - fireEventTo(evt.type, evt.loaded / evt.total, aWindow); - } - }; - - xhr.onerror = function error(evt) { - fireEventTo(evt.type, false, aWindow); - }; - - xhr.onload = function load(evt) { - var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || - xhr.responseArrayBuffer || xhr.response), - view, - mywindow, - arrayBuffer, - view2, - array, - i; - try { - view = new Uint8Array(data); - mywindow = aWindow.wrappedJSObject; - arrayBuffer = new mywindow.ArrayBuffer(data.byteLength); - view2 = new mywindow.Uint8Array(arrayBuffer); - view2.set(view); - array = []; - array.length = view2.byteLength; - for (i = 0; i < view2.byteLength; i += 1) { - array[i] = view2[i]; - } - fireEventTo(evt.type, array, aWindow); - } catch (e) { - log('Error - ' + e); - } - }; - - xhr.open('GET', aDocumentUrl); - xhr.responseType = 'arraybuffer'; - xhr.send(null); -} - -var WebProgressListener = { - init: function WebProgressListenerInit(aWindow, aUrl) { - "use strict"; - this.locationHasChanged = false; - this.documentUrl = aUrl; - - var flags = Ci.nsIWebProgress.NOTIFY_LOCATION | - Ci.nsIWebProgress.NOTIFY_STATE_NETWORK | - Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT, - docShell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebNavigation) - .QueryInterface(Ci.nsIDocShell), - webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebProgress); - try { - webProgress.removeProgressListener(this); - } catch (e) { - } - webProgress.addProgressListener(this, flags); - }, - - onStateChange: function onStateChange(aWebProgress, aRequest, aStateFlags, - aStatus) { - "use strict"; - var complete = Ci.nsIWebProgressListener.STATE_IS_WINDOW + - Ci.nsIWebProgressListener.STATE_STOP; - if ((aStateFlags & complete) === complete && this.locationHasChanged) { - aWebProgress.removeProgressListener(this); - loadDocument(aWebProgress.DOMWindow, this.documentUrl); - } - }, - - onProgressChange: function onProgressChange(aWebProgress, aRequest, - aCurSelf, aMaxSelf, aCurTotal, - aMaxTotal) { - "use strict"; - }, - - onLocationChange: function onLocationChange(aWebProgress, aRequest, - aLocationURI) { - "use strict"; - this.locationHasChanged = true; - }, - - onStatusChange: function onStatusChange(aWebProgress, aRequest, aStatus, - aMessage) { - "use strict"; - }, - - onSecurityChange: function onSecurityChange(aWebProgress, aRequest, aState) { - "use strict"; - }, - - QueryInterface: function QueryInterface(aIID) { - "use strict"; - if (aIID.equals(Ci.nsIWebProgressListener) || - aIID.equals(Ci.nsISupportsWeakReference) || - aIID.equals(Ci.nsISupports)) { - return this; - } - throw Components.results.NS_ERROR_NO_INTERFACE; - } -}; - -function odfContentHandler() { - "use strict"; -} - -odfContentHandler.prototype = { - handleContent: function handleContent(aMimetype, aContext, aRequest) { - "use strict"; - - if (!(aMimetype.indexOf(ODF_CONTENT_TYPE_PREFIX) === 0 || - aMimetype === "application/octet-stream")) { - throw NS_ERROR_WONT_HANDLE_CONTENT; - } - - if (!(aRequest instanceof Ci.nsIChannel)) { - throw NS_ERROR_WONT_HANDLE_CONTENT; - } - - var mywindow = null, - callbacks, - uri = aRequest.URI, - targetUrl = uri.spec, - tail = targetUrl.substring(targetUrl.length-9), - url; - - // if the url ends with a download parameter, then do not handle it - if (tail === "#download") { - throw NS_ERROR_WONT_HANDLE_CONTENT; - } - - callbacks = aRequest.notificationCallbacks || - aRequest.loadGroup.notificationCallbacks; - if (!callbacks) { - return; - } - - mywindow = callbacks.getInterface(Ci.nsIDOMWindow); - - WebProgressListener.init(mywindow, uri.spec); - - try { - url = Services.prefs.getCharPref('extensions.webodf.js.url'); - //url = url.replace('%s', encodeURIComponent(targetUrl)); - url = url.replace('%s', targetUrl); - } catch (e) { - log('Error retrieving the webodf base url - ' + e); - throw NS_ERROR_WONT_HANDLE_CONTENT; - } - - aRequest.cancel(Cr.NS_BINDING_ABORTED); - mywindow.location = url; - }, - - classID: Components.ID('{afe5fa21-709d-4916-b51c-56f60d574a0a}'), - QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentHandler]) -}; - -var NSGetFactory = XPCOMUtils.generateNSGetFactory([odfContentHandler]); diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html b/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html deleted file mode 100644 index 0dc023aed8..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - -
    -
    -
    - - diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in b/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in deleted file mode 100644 index caf59198a2..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - uriloader@webodf.js - WebODF - 2 - @WEBODF_VERSION@ - chrome://webodf.js/skin/icon.png - - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 3.6 - 9.* - - - - - - {a23983c0-fd0e-11dc-95ff-0800200c9a66} - 4.0 - 9.* - - - true - true - Jos van den Oever - OpenDocument Viewer - http://webodf.org/ - - diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js deleted file mode 100644 index ce606817ea..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true*/ -runtime.loadClass("core.Zip"); -runtime.loadClass("core.Base64"); - -function addFiles(zip, pos, files, callback) { - "use strict"; - if (pos >= files.length) { - zip.write(function (err) { - return callback(err); - }); - return; - } - var path = files[pos]; - runtime.readFile(path, "binary", function (err, data) { - var base64; - if (err) { - return callback(err); - } - if (path === "content/webodf.js") { - // replace eval() with evil(), since Firefox does not approve of it - base64 = new core.Base64(); - data = base64.convertUTF8ArrayToUTF16String(data); - data = data.replace(new RegExp('eval\\(', 'g'), 'evil('); - data = runtime.byteArrayFromString(data); - } - zip.save(path, data, false, new Date()); - addFiles(zip, pos + 1, files, callback); - }); -} - -var args = arguments, - filename = args[1], - zipmembers = [], - i, - zip = new core.Zip(filename, null); -for (i = 2; i < arguments.length; i += 1) { - zipmembers.push(arguments[i]); -} - -addFiles(zip, 0, zipmembers, function (err) { - "use strict"; - if (err) { - runtime.log(err); - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png b/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png deleted file mode 100644 index 94d7d8da5d..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png deleted file mode 100644 index 06bb96b394..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png deleted file mode 100644 index dbfed967af..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj b/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj deleted file mode 100644 index d4a76518f3..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj +++ /dev/null @@ -1,512 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */; }; - CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */; }; - CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */; }; - CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */; }; - CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECC014FFBC1B00CEAEE3 /* mztools.c */; }; - CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CB29ECC214FFBC5500CEAEE3 /* libz.dylib */; }; - CB36D11814F68F7F0084BECB /* www in Resources */ = {isa = PBXBuildFile; fileRef = CB36D11714F68F7F0084BECB /* www */; }; - CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9014DABDA600C733F6 /* Foundation.framework */; }; - CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9214DABDA600C733F6 /* UIKit.framework */; }; - CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9414DABDA600C733F6 /* CoreGraphics.framework */; }; - CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9614DABDA600C733F6 /* AddressBook.framework */; }; - CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9814DABDA600C733F6 /* AddressBookUI.framework */; }; - CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */; }; - CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9C14DABDA600C733F6 /* AVFoundation.framework */; }; - CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9E14DABDA600C733F6 /* CoreLocation.framework */; }; - CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA014DABDA600C733F6 /* MediaPlayer.framework */; }; - CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA214DABDA600C733F6 /* QuartzCore.framework */; }; - CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */; }; - CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */; }; - CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA814DABDA600C733F6 /* CoreMedia.framework */; }; - CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DAD14DABDA600C733F6 /* InfoPlist.strings */; }; - CB533DB114DABDA600C733F6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DB014DABDA600C733F6 /* main.m */; }; - CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DB314DABDA600C733F6 /* PhoneGap.framework */; }; - CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DB714DABDA600C733F6 /* Localizable.strings */; }; - CB533DC014DABDA600C733F6 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DBF14DABDA600C733F6 /* icon.png */; }; - CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC114DABDA600C733F6 /* icon@2x.png */; }; - CB533DC414DABDA600C733F6 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC314DABDA600C733F6 /* icon-72.png */; }; - CB533DC714DABDA600C733F6 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC614DABDA600C733F6 /* Default.png */; }; - CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC814DABDA600C733F6 /* Default@2x.png */; }; - CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = CB533DCC14DABDA600C733F6 /* PhoneGap.plist */; }; - CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD014DABDA600C733F6 /* AppDelegate.m */; }; - CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD314DABDA600C733F6 /* MainViewController.m */; }; - CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB533DD514DABDA600C733F6 /* MainViewController.xib */; }; - CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */ = {isa = PBXBuildFile; fileRef = CBD2B77214FF8E9700FC3A44 /* NativeZip.m */; }; - CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "../Default-Portrait~ipad.png"; sourceTree = ""; }; - CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "../Default-Landscape~ipad.png"; sourceTree = ""; }; - CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = WebODF/Classes/minizip/unzip.c; sourceTree = ""; }; - CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = WebODF/Classes/minizip/ioapi.c; sourceTree = ""; }; - CB29ECC014FFBC1B00CEAEE3 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mztools.c; path = WebODF/Classes/minizip/mztools.c; sourceTree = ""; }; - CB29ECC214FFBC5500CEAEE3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - CB36D11714F68F7F0084BECB /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; - CB533D8C14DABDA500C733F6 /* KO Viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "KO Viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - CB533D9014DABDA600C733F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - CB533D9214DABDA600C733F6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - CB533D9414DABDA600C733F6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - CB533D9614DABDA600C733F6 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - CB533D9814DABDA600C733F6 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - CB533D9C14DABDA600C733F6 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - CB533D9E14DABDA600C733F6 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - CB533DA014DABDA600C733F6 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - CB533DA214DABDA600C733F6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - CB533DA814DABDA600C733F6 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WebODF-Info.plist"; sourceTree = ""; }; - CB533DAE14DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - CB533DB014DABDA600C733F6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WebODF-Prefix.pch"; sourceTree = ""; }; - CB533DB314DABDA600C733F6 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; - CB533DB814DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; - CB533DBF14DABDA600C733F6 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; - CB533DC114DABDA600C733F6 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; - CB533DC314DABDA600C733F6 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; - CB533DC614DABDA600C733F6 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; - CB533DC814DABDA600C733F6 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; - CB533DCC14DABDA600C733F6 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; - CB533DCF14DABDA600C733F6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; - CB533DD014DABDA600C733F6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; - CB533DD214DABDA600C733F6 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; - CB533DD314DABDA600C733F6 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; - CB533DD514DABDA600C733F6 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; - CBD2B77114FF8E9700FC3A44 /* NativeZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NativeZip.h; path = Classes/NativeZip.h; sourceTree = ""; }; - CBD2B77214FF8E9700FC3A44 /* NativeZip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NativeZip.m; path = Classes/NativeZip.m; sourceTree = ""; }; - CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebViewCache.h; path = Classes/WebViewCache.h; sourceTree = ""; }; - CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebViewCache.m; path = Classes/WebViewCache.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - CB533D8614DABDA500C733F6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */, - CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */, - CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */, - CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */, - CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */, - CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */, - CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */, - CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */, - CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */, - CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */, - CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */, - CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */, - CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */, - CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */, - CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CB533D8914DABDA500C733F6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - CB533D7E14DABDA500C733F6 = { - isa = PBXGroup; - children = ( - CB29ECC214FFBC5500CEAEE3 /* libz.dylib */, - CB29ECC014FFBC1B00CEAEE3 /* mztools.c */, - CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */, - CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */, - CB36D11714F68F7F0084BECB /* www */, - CB533DAA14DABDA600C733F6 /* WebODF */, - CB533D8F14DABDA500C733F6 /* Frameworks */, - CB533D8D14DABDA500C733F6 /* Products */, - ); - sourceTree = ""; - }; - CB533D8D14DABDA500C733F6 /* Products */ = { - isa = PBXGroup; - children = ( - CB533D8C14DABDA500C733F6 /* KO Viewer.app */, - ); - name = Products; - sourceTree = ""; - }; - CB533D8F14DABDA500C733F6 /* Frameworks */ = { - isa = PBXGroup; - children = ( - CB533D9014DABDA600C733F6 /* Foundation.framework */, - CB533D9214DABDA600C733F6 /* UIKit.framework */, - CB533D9414DABDA600C733F6 /* CoreGraphics.framework */, - CB533D9614DABDA600C733F6 /* AddressBook.framework */, - CB533D9814DABDA600C733F6 /* AddressBookUI.framework */, - CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */, - CB533D9C14DABDA600C733F6 /* AVFoundation.framework */, - CB533D9E14DABDA600C733F6 /* CoreLocation.framework */, - CB533DA014DABDA600C733F6 /* MediaPlayer.framework */, - CB533DA214DABDA600C733F6 /* QuartzCore.framework */, - CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */, - CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */, - CB533DA814DABDA600C733F6 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - CB533DAA14DABDA600C733F6 /* WebODF */ = { - isa = PBXGroup; - children = ( - CB533DB314DABDA600C733F6 /* PhoneGap.framework */, - CB533DB514DABDA600C733F6 /* Resources */, - CB533DCE14DABDA600C733F6 /* Classes */, - CB533DAB14DABDA600C733F6 /* Supporting Files */, - ); - path = WebODF; - sourceTree = ""; - }; - CB533DAB14DABDA600C733F6 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */, - CB533DAD14DABDA600C733F6 /* InfoPlist.strings */, - CB533DB014DABDA600C733F6 /* main.m */, - CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */, - CB533DCC14DABDA600C733F6 /* PhoneGap.plist */, - CB533DD514DABDA600C733F6 /* MainViewController.xib */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CB533DB514DABDA600C733F6 /* Resources */ = { - isa = PBXGroup; - children = ( - CB533DB614DABDA600C733F6 /* en.lproj */, - CB533DBE14DABDA600C733F6 /* icons */, - CB533DC514DABDA600C733F6 /* splash */, - ); - name = Resources; - sourceTree = ""; - }; - CB533DB614DABDA600C733F6 /* en.lproj */ = { - isa = PBXGroup; - children = ( - CB533DB714DABDA600C733F6 /* Localizable.strings */, - ); - name = en.lproj; - sourceTree = ""; - }; - CB533DBE14DABDA600C733F6 /* icons */ = { - isa = PBXGroup; - children = ( - CB533DBF14DABDA600C733F6 /* icon.png */, - CB533DC114DABDA600C733F6 /* icon@2x.png */, - CB533DC314DABDA600C733F6 /* icon-72.png */, - ); - name = icons; - sourceTree = ""; - }; - CB533DC514DABDA600C733F6 /* splash */ = { - isa = PBXGroup; - children = ( - CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */, - CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */, - CB533DC614DABDA600C733F6 /* Default.png */, - CB533DC814DABDA600C733F6 /* Default@2x.png */, - ); - name = splash; - sourceTree = ""; - }; - CB533DCE14DABDA600C733F6 /* Classes */ = { - isa = PBXGroup; - children = ( - CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */, - CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */, - CB533DCF14DABDA600C733F6 /* AppDelegate.h */, - CB533DD014DABDA600C733F6 /* AppDelegate.m */, - CB533DD214DABDA600C733F6 /* MainViewController.h */, - CB533DD314DABDA600C733F6 /* MainViewController.m */, - CBD2B77114FF8E9700FC3A44 /* NativeZip.h */, - CBD2B77214FF8E9700FC3A44 /* NativeZip.m */, - ); - name = Classes; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - CB533D8B14DABDA500C733F6 /* KO Viewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */; - buildPhases = ( - CB533D8514DABDA500C733F6 /* Sources */, - CB533D8614DABDA500C733F6 /* Frameworks */, - CB533D8714DABDA500C733F6 /* Resources */, - CB533D8814DABDA500C733F6 /* Sources */, - CB533D8914DABDA500C733F6 /* Frameworks */, - CB533D8A14DABDA500C733F6 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "KO Viewer"; - productName = WebODF; - productReference = CB533D8C14DABDA500C733F6 /* KO Viewer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - CB533D8014DABDA500C733F6 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0420; - }; - buildConfigurationList = CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - ); - mainGroup = CB533D7E14DABDA500C733F6; - productRefGroup = CB533D8D14DABDA500C733F6 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - CB533D8B14DABDA500C733F6 /* KO Viewer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - CB533D8714DABDA500C733F6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */, - CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */, - CB533DC014DABDA600C733F6 /* icon.png in Resources */, - CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */, - CB533DC414DABDA600C733F6 /* icon-72.png in Resources */, - CB533DC714DABDA600C733F6 /* Default.png in Resources */, - CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */, - CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */, - CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */, - CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */, - CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */, - CB36D11814F68F7F0084BECB /* www in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - CB533D8A14DABDA500C733F6 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/bash; - shellScript = "rsync -a ../touchui/app/ www/app/\ncp ../../webodf/webodf.css www/\ncp ../touchui/sencha-touch.* www/\ncp ../touchui/Zoom*.png www/\nif [ ! -e www/webodf.js ]; then\n # webodf.js should be built\n if [ ! -e build ]; then mkdir build; fi\n cd build\n cmake -G Xcode ../../.. && make && cp webodf/webodf.js ..\n if [ ! -e webodf.js ]; then\n echo \"put webodf.js in the ios/www directory\"\n exit 1;\n fi\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - CB533D8514DABDA500C733F6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CB533DB114DABDA600C733F6 /* main.m in Sources */, - CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */, - CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */, - CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */, - CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */, - CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */, - CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */, - CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CB533D8814DABDA500C733F6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - CB533DAD14DABDA600C733F6 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - CB533DAE14DABDA600C733F6 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - CB533DB714DABDA600C733F6 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - CB533DB814DABDA600C733F6 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - CB533DD914DABDA600C733F6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - }; - name = Debug; - }; - CB533DDA14DABDA600C733F6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - CB533DDC14DABDA600C733F6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)"; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INFOPLIST_FILE = "WebODF/WebODF-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - CB533DDD14DABDA600C733F6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = ( - armv6, - "$(ARCHS_STANDARD_32_BIT)", - ); - CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)"; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INFOPLIST_FILE = "WebODF/WebODF-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ( - "-weak_framework", - UIKit, - "-weak_framework", - AVFoundation, - "-weak_framework", - CoreMedia, - "-weak_library", - /usr/lib/libSystem.B.dylib, - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CB533DD914DABDA600C733F6 /* Debug */, - CB533DDA14DABDA600C733F6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CB533DDC14DABDA600C733F6 /* Debug */, - CB533DDD14DABDA600C733F6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = CB533D8014DABDA500C733F6 /* Project object */; -} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h deleted file mode 100644 index e2e93b0d9e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. - */ - -// -// AppDelegate.h -// WebODF -// -// Created by KO GmbH on 2/2/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGViewController.h" -#endif - - -@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate > { - - NSString* invokeString; -} - -// invoke string is passed to your app on launch, this is only valid if you -// edit FooBar.plist to add a protocol -// a simple tutorial can be found here : -// http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html - -@property (nonatomic, copy) NSString* invokeString; -@property (nonatomic, retain) IBOutlet UIWindow* window; -@property (nonatomic, retain) IBOutlet PGViewController* viewController; - -@end - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m deleted file mode 100644 index 6845e95349..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m +++ /dev/null @@ -1,202 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. - */ - -// -// AppDelegate.m -// WebODF -// -// Created by KO GmbH on 2/2/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import "AppDelegate.h" -#import "MainViewController.h" - -#ifdef PHONEGAP_FRAMEWORK - #import - #import -#else - #import "PGPlugin.h" - #import "PGURLProtocol.h" -#endif -#import "WebViewCache.h" - - -@implementation AppDelegate - -@synthesize invokeString, window, viewController; - -- (id) init -{ - /** If you need to do any extra app-specific initialization, you can do it here - * -jm - **/ - NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; - - [PGURLProtocol registerPGHttpURLProtocol]; - - return [super init]; -} - -#pragma UIApplicationDelegate implementation - -/** - * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) - */ -- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions -{ - NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; - if (url && [url isKindOfClass:[NSURL class]]) { - self.invokeString = [url absoluteString]; - NSLog(@"WebODF launchOptions = %@", url); - } - - CGRect screenBounds = [[UIScreen mainScreen] bounds]; - self.window = [[UIWindow alloc] initWithFrame:screenBounds]; - self.window.autoresizesSubviews = YES; - - CGRect viewBounds = [[UIScreen mainScreen] applicationFrame]; - - self.viewController = [[MainViewController alloc] init]; - self.viewController.useSplashScreen = YES; - self.viewController.wwwFolderName = @"www"; - self.viewController.startPage = @"index.html"; - self.viewController.view.frame = viewBounds; - - // over-ride delegates - self.viewController.webView.delegate = self; - self.viewController.commandDelegate = self; - - // check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation - BOOL forceStartupRotation = YES; - UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation]; - - if (UIDeviceOrientationUnknown == curDevOrientation) { - // UIDevice isn't firing orientation notifications yet… go look at the status bar - curDevOrientation = (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]; - } - - if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) { - for (NSNumber *orient in self.viewController.supportedOrientations) { - if ([orient intValue] == curDevOrientation) { - forceStartupRotation = NO; - break; - } - } - } - - if (forceStartupRotation) { - NSLog(@"supportedOrientations: %@", self.viewController.supportedOrientations); - // The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait) - UIInterfaceOrientation newOrient = [[self.viewController.supportedOrientations objectAtIndex:0] intValue]; - NSLog(@"AppDelegate forcing status bar to: %d from: %d", newOrient, curDevOrientation); - [[UIApplication sharedApplication] setStatusBarOrientation:newOrient]; - } - - [self.window addSubview:self.viewController.view]; - [self.window makeKeyAndVisible]; - - - NSString *path = @"./cache"; - NSUInteger discCapacity = 1*1024*1024; - NSUInteger memoryCapacity = 0*1024*1024; - - WebViewCache *cache = - [[WebViewCache alloc] initWithMemoryCapacity: memoryCapacity - diskCapacity: discCapacity diskPath:path]; - [NSURLCache setSharedURLCache:cache]; - - - return YES; -} - -// this happens while we are running ( in the background, or from within our own app ) -// only valid if FooBar.plist specifies a protocol to handle -- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url -{ - if (!url) { - return NO; - } - - // calls into javascript global function 'handleOpenURL' - NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url]; - [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString]; - - // all plugins will get the notification, and their handlers will be called - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]]; - - return YES; -} - -#pragma PGCommandDelegate implementation - -- (id) getCommandInstance:(NSString*)className -{ - return [self.viewController getCommandInstance:className]; -} - -- (BOOL) execute:(InvokedUrlCommand*)command -{ - return [self.viewController execute:command]; -} - -- (NSString*) pathForResource:(NSString*)resourcepath; -{ - return [self.viewController pathForResource:resourcepath]; -} - -#pragma UIWebDelegate implementation - -- (void) webViewDidFinishLoad:(UIWebView*) theWebView -{ - // only valid if FooBar.plist specifies a protocol to handle - if (self.invokeString) - { - // this is passed before the deviceready event is fired, so you can access it in js when you receive deviceready - NSString* jsString = [NSString stringWithFormat:@"var invokeString = \"%@\";", self.invokeString]; - [theWebView stringByEvaluatingJavaScriptFromString:jsString]; - } - - // Black base color for background matches the native apps - theWebView.backgroundColor = [UIColor blackColor]; - - return [self.viewController webViewDidFinishLoad:theWebView]; -} - -- (void) webViewDidStartLoad:(UIWebView*)theWebView -{ - return [self.viewController webViewDidStartLoad:theWebView]; -} - -- (void) webView:(UIWebView*)theWebView didFailLoadWithError:(NSError*)error -{ - return [self.viewController webView:theWebView didFailLoadWithError:error]; -} - -- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType -{ - return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType]; -} - -- (void) dealloc -{ -} - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h deleted file mode 100644 index 33ddbc2103..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// MainViewController.h -// FooBar -// -// Created by Shazron Abdullah on 12-01-26. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#ifdef PHONEGAP_FRAMEWORK - #import -#else - #import "PGViewController.h" -#endif - -@interface MainViewController : PGViewController - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m deleted file mode 100644 index 550e4b25c2..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m +++ /dev/null @@ -1,47 +0,0 @@ -// -// MainViewController.m -// WebODF -// -#import "MainViewController.h" - -@implementation MainViewController - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization - } - return self; -} - -- (void)didReceiveMemoryWarning -{ - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -#pragma mark - View lifecycle - -- (void)viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view from its nib. -} - -- (void)viewDidUnload -{ - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib deleted file mode 100644 index 9837f578ca..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib +++ /dev/null @@ -1,118 +0,0 @@ - - - - 1280 - 11C25 - 1919 - 1138.11 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 916 - - - IBProxyObject - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 20}, {320, 460}} - - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - - - 0 - - - - - - 1 - - - - - -1 - - - File's Owner - - - -2 - - - - - - - MainViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 3 - - - - - MainViewController - UIViewController - - IBProjectSource - ./Classes/MainViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 916 - - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h deleted file mode 100644 index eb1ff485a7..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// NSData+Base64.h -// base64 -// -// Created by Matt Gallagher on 2009/06/03. -// Copyright 2009 Matt Gallagher. All rights reserved. -// -// Permission is given to use this source code file, free of charge, in any -// project, commercial or otherwise, entirely at your risk, with the condition -// that any redistribution (in part or whole) of source code must retain -// this copyright and permission notice. Attribution in compiled projects is -// appreciated but not required. -// - -#import - -void *NewBase64Decode( - const char *inputBuffer, - size_t length, - size_t *outputLength); - -char *NewBase64Encode( - const void *inputBuffer, - size_t length, - bool separateLines, - size_t *outputLength); - -@interface NSData (Base64) - -+ (NSData *)dataFromBase64String:(NSString *)aString; -- (NSString *)base64EncodedString; - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m deleted file mode 100644 index 13f828d09c..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m +++ /dev/null @@ -1,299 +0,0 @@ -// -// NSData+Base64.m -// base64 -// -// Created by Matt Gallagher on 2009/06/03. -// Copyright 2009 Matt Gallagher. All rights reserved. -// -// Permission is given to use this source code file, free of charge, in any -// project, commercial or otherwise, entirely at your risk, with the condition -// that any redistribution (in part or whole) of source code must retain -// this copyright and permission notice. Attribution in compiled projects is -// appreciated but not required. -// - -#import "NSData+Base64.h" - -// -// Mapping from 6 bit pattern to ASCII character. -// -static unsigned char base64EncodeLookup[65] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -// -// Definition for "masked-out" areas of the base64DecodeLookup mapping -// -#define xx 65 - -// -// Mapping from ASCII character to 6 bit pattern. -// -static unsigned char base64DecodeLookup[256] = -{ - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, - xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx, - xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, -}; - -// -// Fundamental sizes of the binary and base64 encode/decode units in bytes -// -#define BINARY_UNIT_SIZE 3 -#define BASE64_UNIT_SIZE 4 - -// -// NewBase64Decode -// -// Decodes the base64 ASCII string in the inputBuffer to a newly malloced -// output buffer. -// -// inputBuffer - the source ASCII string for the decode -// length - the length of the string or -1 (to specify strlen should be used) -// outputLength - if not-NULL, on output will contain the decoded length -// -// returns the decoded buffer. Must be free'd by caller. Length is given by -// outputLength. -// -void *NewBase64Decode( - const char *inputBuffer, - size_t length, - size_t *outputLength) -{ - if (length == -1) - { - length = strlen(inputBuffer); - } - - size_t outputBufferSize = (length / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE; - unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize); - - size_t i = 0; - size_t j = 0; - while (i < length) - { - // - // Accumulate 4 valid characters (ignore everything else) - // - unsigned char accumulated[BASE64_UNIT_SIZE]; - bzero(accumulated, sizeof(unsigned char) * BASE64_UNIT_SIZE); - size_t accumulateIndex = 0; - while (i < length) - { - unsigned char decode = base64DecodeLookup[inputBuffer[i++]]; - if (decode != xx) - { - accumulated[accumulateIndex] = decode; - accumulateIndex++; - - if (accumulateIndex == BASE64_UNIT_SIZE) - { - break; - } - } - } - - // - // Store the 6 bits from each of the 4 characters as 3 bytes - // - outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4); - outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2); - outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3]; - j += accumulateIndex - 1; - } - - if (outputLength) - { - *outputLength = j; - } - return outputBuffer; -} - -// -// NewBase64Decode -// -// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced -// output buffer. -// -// inputBuffer - the source data for the encode -// length - the length of the input in bytes -// separateLines - if zero, no CR/LF characters will be added. Otherwise -// a CR/LF pair will be added every 64 encoded chars. -// outputLength - if not-NULL, on output will contain the encoded length -// (not including terminating 0 char) -// -// returns the encoded buffer. Must be free'd by caller. Length is given by -// outputLength. -// -char *NewBase64Encode( - const void *buffer, - size_t length, - bool separateLines, - size_t *outputLength) -{ - const unsigned char *inputBuffer = (const unsigned char *)buffer; - - #define MAX_NUM_PADDING_CHARS 2 - #define OUTPUT_LINE_LENGTH 64 - #define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE) - #define CR_LF_SIZE 0 - - // - // Byte accurate calculation of final buffer size - // - size_t outputBufferSize = - ((length / BINARY_UNIT_SIZE) - + ((length % BINARY_UNIT_SIZE) ? 1 : 0)) - * BASE64_UNIT_SIZE; - if (separateLines) - { - outputBufferSize += - (outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE; - } - - // - // Include space for a terminating zero - // - outputBufferSize += 1; - - // - // Allocate the output buffer - // - char *outputBuffer = (char *)malloc(outputBufferSize); - if (!outputBuffer) - { - return NULL; - } - - size_t i = 0; - size_t j = 0; - const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length; - size_t lineEnd = lineLength; - - while (true) - { - if (lineEnd > length) - { - lineEnd = length; - } - - for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE) - { - // - // Inner loop: turn 48 bytes into 64 base64 characters - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) - | ((inputBuffer[i + 1] & 0xF0) >> 4)]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2) - | ((inputBuffer[i + 2] & 0xC0) >> 6)]; - outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F]; - } - - if (lineEnd == length) - { - break; - } - - // - // Add the newline - // - //outputBuffer[j++] = '\r'; - //outputBuffer[j++] = '\n'; - lineEnd += lineLength; - } - - if (i + 1 < length) - { - // - // Handle the single '=' case - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) - | ((inputBuffer[i + 1] & 0xF0) >> 4)]; - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2]; - outputBuffer[j++] = '='; - } - else if (i < length) - { - // - // Handle the double '=' case - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4]; - outputBuffer[j++] = '='; - outputBuffer[j++] = '='; - } - outputBuffer[j] = 0; - - // - // Set the output length and return the buffer - // - if (outputLength) - { - *outputLength = j; - } - return outputBuffer; -} - -@implementation NSData (Base64) - -// -// dataFromBase64String: -// -// Creates an NSData object containing the base64 decoded representation of -// the base64 string 'aString' -// -// Parameters: -// aString - the base64 string to decode -// -// returns the autoreleased NSData representation of the base64 string -// -+ (NSData *)dataFromBase64String:(NSString *)aString -{ - NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding]; - size_t outputLength; - void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength); - NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength]; - free(outputBuffer); - return result; -} - -// -// base64EncodedString -// -// Creates an NSString object that contains the base 64 encoding of the -// receiver's data. Lines are broken at 64 characters long. -// -// returns an autoreleased NSString being the base 64 representation of the -// receiver. -// -- (NSString *)base64EncodedString -{ - size_t outputLength; - char *outputBuffer = - NewBase64Encode([self bytes], [self length], true, &outputLength); - - NSString *result = - [[[NSString alloc] - initWithBytes:outputBuffer - length:outputLength - encoding:NSASCIIStringEncoding] - autorelease]; - free(outputBuffer); - return result; -} - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h deleted file mode 100644 index 44e296b8cf..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -@interface NativeZip : PGPlugin { - NSString* callbackID; -} - -@property (nonatomic, copy) NSString* callbackID; - -- (void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void) loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void) loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - -@end \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m deleted file mode 100644 index d8c241cf0b..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m +++ /dev/null @@ -1,79 +0,0 @@ -#import "NativeZip.h" -#import "minizip/unzip.h" -#import "NSData+Base64.h" - -@implementation NativeZip -@synthesize callbackID; - --(void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - self.callbackID = [arguments objectAtIndex:0]; - NSString *zipPath = [arguments objectAtIndex:1]; - NSString *entryPath = [arguments objectAtIndex:2]; - NSString *mimetype = nil; - if (base64 == TRUE) { - mimetype = [arguments objectAtIndex:3]; - } - - const char* path = [ zipPath cStringUsingEncoding:NSUTF8StringEncoding ]; - unzFile unzipFile = unzOpen(path); - NSString* jsString = nil; - BOOL error = TRUE; - if (!unzipFile) { - jsString = [[NSString alloc] initWithString: @"cannot open file"]; - } else { - path = [ entryPath cStringUsingEncoding:NSUTF8StringEncoding ]; - int r = unzLocateFile(unzipFile, path, 2); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot find entry"]; - } else { - unz_file_info info; - r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot determine size"]; - } else { - r = unzOpenCurrentFile(unzipFile); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot open entry"]; - } else { - char* contents = malloc(info.uncompressed_size); - r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); - if (r != info.uncompressed_size) { - jsString = [[NSString alloc] initWithString: @"cannot uncompress file"]; - } else { - if (base64) { - NSData* readData = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; - jsString = [NSString stringWithFormat:@"data:%@;base64,%@", mimetype, [readData base64EncodedString]]; - } else { - jsString = [[NSString alloc] initWithUTF8String: contents]; - } - } - unzCloseCurrentFile(unzipFile); - free(contents); - error = FALSE; - } - } - } - unzClose(unzipFile); - } - PluginResult* pluginResult = [PluginResult - resultWithStatus:PGCommandStatus_OK - messageAsString: jsString - ]; - if (!error) { - [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]]; - } else { - [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]]; - } -} - --(void)loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - [self load:FALSE arguments:arguments withDict:options]; -} --(void)loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - [self load:TRUE arguments:arguments withDict:options]; -} - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h deleted file mode 100644 index 216a0bf2bb..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// WebCache.h -// KO Viewer -// -// Created by Tobias Hintze on 3/5/12. -// Copyright (c) 2012 KO GmbH. All rights reserved. -// - -#import - -@interface WebViewCache : NSURLCache - -- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry; - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m deleted file mode 100644 index 4de0bb3a0c..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m +++ /dev/null @@ -1,72 +0,0 @@ -// -// WebCache.m -// KO Viewer -// -// Created by Tobias Hintze on 3/5/12. -// Copyright (c) 2012 KO GmbH. All rights reserved. -// - -#import "WebViewCache.h" -#import "minizip/unzip.h" - -@implementation WebViewCache - -- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request -{ - [super removeAllCachedResponses]; - NSURL *url = [request URL]; - if ([url query]) { - NSData *somedata = [self getSomeData:[url path] entry:[url query]]; - NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url - MIMEType:@"text/xml" - expectedContentLength:[somedata length] - textEncodingName:nil]; - NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] - initWithResponse:response data:somedata]; - return cachedResponse; - } - return [super cachedResponseForRequest:request]; -} - -- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry -{ - NSLog(@"get some data: %@ %@", zip, entry); - const char* path = [ zip cStringUsingEncoding:NSUTF8StringEncoding ]; - unzFile unzipFile = unzOpen(path); - NSData *data = nil; - if (!unzipFile) { - NSLog(@"cannot open file %@", zip); - } else { - path = [ entry cStringUsingEncoding:NSUTF8StringEncoding ]; - int r = unzLocateFile(unzipFile, path, 2); - if (r != UNZ_OK) { - NSLog(@"cannot find entry %@", entry); - } else { - unz_file_info info; - r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); - if (r != UNZ_OK) { - NSLog(@"cannot determine size of %@", entry); - } else { - r = unzOpenCurrentFile(unzipFile); - if (r != UNZ_OK) { - NSLog(@"cannot open entry %@", entry); - } else { - char* contents = malloc(info.uncompressed_size); - r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); - if (r != info.uncompressed_size) { - NSLog(@"cannot uncompress file %@", entry); - } else { - data = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; - NSLog(@"read file entry %li %@", info.uncompressed_size, entry); - } - unzCloseCurrentFile(unzipFile); - free(contents); - } - } - } - unzClose(unzipFile); - } - return data; -} - -@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h deleted file mode 100644 index 622f4bc2ec..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h +++ /dev/null @@ -1,132 +0,0 @@ -/* crypt.h -- base code for crypt/uncrypt ZIPfile - - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This code is a modified version of crypting code in Infozip distribution - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - - If you don't need crypting in your application, just define symbols - NOCRYPT and NOUNCRYPT. - - This code support the "Traditional PKWARE Encryption". - - The new AES encryption added on Zip format by Winzip (see the page - http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong - Encryption is not supported. -*/ - -#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) - -/*********************************************************************** - * Return the next byte in the pseudo-random sequence - */ -static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; - return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -/*********************************************************************** - * Update the encryption keys with the next byte of plain text - */ -static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) -{ - (*(pkeys+0)) = CRC32((*(pkeys+0)), c); - (*(pkeys+1)) += (*(pkeys+0)) & 0xff; - (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; - { - register int keyshift = (int)((*(pkeys+1)) >> 24); - (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); - } - return c; -} - - -/*********************************************************************** - * Initialize the encryption keys and the random header according to - * the given password. - */ -static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) -{ - *(pkeys+0) = 305419896L; - *(pkeys+1) = 591751049L; - *(pkeys+2) = 878082192L; - while (*passwd != '\0') { - update_keys(pkeys,pcrc_32_tab,(int)*passwd); - passwd++; - } -} - -#define zdecode(pkeys,pcrc_32_tab,c) \ - (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) - -#define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) - -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED - -#define RAND_HEAD_LEN 12 - /* "last resort" source for second part of crypt seed pattern */ -# ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ -# endif - -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) - const char *passwd; /* password string */ - unsigned char *buf; /* where to write header */ - int bufSize; - unsigned long* pkeys; - const unsigned long* pcrc_32_tab; - unsigned long crcForCrypting; -{ - int n; /* index in random header */ - int t; /* temporary */ - int c; /* random byte */ - unsigned char header[RAND_HEAD_LEN-2]; /* random header */ - static unsigned calls = 0; /* ensure different random header each time */ - - if (bufSize> 7) & 0xff; - header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); - } - /* Encrypt random header (last two bytes is high word of crc) */ - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); - } - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); - return n; -} - -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c deleted file mode 100644 index 7f20c182f9..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ioapi.c -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#include -#include -#include - -#include "zlib.h" -#include "ioapi.h" - - - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -voidpf ZCALLBACK fopen_file_func OF(( - voidpf opaque, - const char* filename, - int mode)); - -uLong ZCALLBACK fread_file_func OF(( - voidpf opaque, - voidpf stream, - void* buf, - uLong size)); - -uLong ZCALLBACK fwrite_file_func OF(( - voidpf opaque, - voidpf stream, - const void* buf, - uLong size)); - -long ZCALLBACK ftell_file_func OF(( - voidpf opaque, - voidpf stream)); - -long ZCALLBACK fseek_file_func OF(( - voidpf opaque, - voidpf stream, - uLong offset, - int origin)); - -int ZCALLBACK fclose_file_func OF(( - voidpf opaque, - voidpf stream)); - -int ZCALLBACK ferror_file_func OF(( - voidpf opaque, - voidpf stream)); - - -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; -{ - FILE* file = NULL; - const char* mode_fopen = NULL; - if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) - mode_fopen = "rb"; - else - if (mode & ZLIB_FILEFUNC_MODE_EXISTING) - mode_fopen = "r+b"; - else - if (mode & ZLIB_FILEFUNC_MODE_CREATE) - mode_fopen = "wb"; - - if ((filename!=NULL) && (mode_fopen != NULL)) - file = fopen(filename, mode_fopen); - return file; -} - - -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - - -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - -long ZCALLBACK ftell_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - long ret; - ret = ftell((FILE *)stream); - return ret; -} - -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; -{ - int fseek_origin=0; - long ret; - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR : - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END : - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET : - fseek_origin = SEEK_SET; - break; - default: return -1; - } - ret = 0; - fseek((FILE *)stream, offset, fseek_origin); - return ret; -} - -int ZCALLBACK fclose_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = fclose((FILE *)stream); - return ret; -} - -int ZCALLBACK ferror_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = ferror((FILE *)stream); - return ret; -} - -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ - pzlib_filefunc_def->zopen_file = fopen_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell_file = ftell_file_func; - pzlib_filefunc_def->zseek_file = fseek_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h deleted file mode 100644 index e73a3b2bd8..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#ifndef _ZLIBIOAPI_H -#define _ZLIBIOAPI_H - - -#define ZLIB_FILEFUNC_SEEK_CUR (1) -#define ZLIB_FILEFUNC_SEEK_END (2) -#define ZLIB_FILEFUNC_SEEK_SET (0) - -#define ZLIB_FILEFUNC_MODE_READ (1) -#define ZLIB_FILEFUNC_MODE_WRITE (2) -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) - -#define ZLIB_FILEFUNC_MODE_EXISTING (4) -#define ZLIB_FILEFUNC_MODE_CREATE (8) - - -#ifndef ZCALLBACK - -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) -#define ZCALLBACK CALLBACK -#else -#define ZCALLBACK -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); - -typedef struct zlib_filefunc_def_s -{ - open_file_func zopen_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell_file_func ztell_file; - seek_file_func zseek_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc_def; - - - -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); - -#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) -#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) -#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) -#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) -#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) -#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c deleted file mode 100644 index 74e6c75778..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -/* Code */ -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#define READ_8(adr) ((unsigned char)*(adr)) -#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) -#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) - -#define WRITE_8(buff, n) do { \ - *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ -} while(0) -#define WRITE_16(buff, n) do { \ - WRITE_8((unsigned char*)(buff), n); \ - WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ -} while(0) -#define WRITE_32(buff, n) do { \ - WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ - WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ -} while(0) diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h deleted file mode 100644 index 82d1597ad7..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -#ifndef _zip_tools_H -#define _zip_tools_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#include "unzip.h" - -/* Repair a ZIP file (missing central directory) - file: file to recover - fileOut: output file after recovery - fileOutTmp: temporary file name used for recovery -*/ -extern int ZEXPORT unzRepair(const char* file, - const char* fileOut, - const char* fileOutTmp, - uLong* nRecovered, - uLong* bytesRecovered); - -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c deleted file mode 100644 index 81aee6a149..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c +++ /dev/null @@ -1,1597 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - Read unzip.h for more info -*/ - -/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of -compatibility with older software. The following is from the original crypt.c. Code -woven in by Terry Thorsen 1/2003. -*/ -/* - Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - - See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. - If, for some reason, all these files are missing, the Info-ZIP license - also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html -*/ -/* - crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -/* - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - */ - - -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - -#ifndef CASESENSITIVITYDEFAULT_NO -# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) -# define CASESENSITIVITYDEFAULT_NO -# endif -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - - - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - int raw; -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ - int encrypted; -# ifndef NOUNCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; -# endif -} unz_s; - - -#ifndef NOUNCRYPT -#include "crypt.h" -#endif - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer - "zlib/zlib114.zip". - If the zipfile cannot be opened (file doesn't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) - const char *path; - zlib_filefunc_def* pzlib_filefunc_def; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&us.z_filefunc); - else - us.z_filefunc = *pzlib_filefunc_def; - - us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, - path, - ZLIB_FILEFUNC_MODE_READ | - ZLIB_FILEFUNC_MODE_EXISTING); - if (us.filestream==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); - if (central_pos==0) - err=UNZ_ERRNO; - - if (ZSEEK(us.z_filefunc, us.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - ZCLOSE(s->z_filefunc, s->filestream); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (ZSEEK(s->z_filefunc, s->filestream, - s->pos_in_central_dir+s->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - /* We remember the 'current' position in the file so that we can jump - * back there if we fail. - */ - unz_file_info cur_file_infoSaved; - unz_file_info_internal cur_file_info_internalSaved; - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - cur_file_infoSaved = s->cur_file_info; - cur_file_info_internalSaved = s->cur_file_info_internal; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - err = unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (err == UNZ_OK) - { - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - } - - /* We failed, so restore the state of the 'current file' to where we - * were. - */ - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - s->cur_file_info = cur_file_infoSaved; - s->cur_file_info_internal = cur_file_info_internalSaved; - return err; -} - - -/* -/////////////////////////////////////////// -// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) -// I need random access -// -// Further optimization could be realized by adding an ability -// to cache the directory in memory. The goal being a single -// comprehensive file read to put the file I need in a memory. -*/ - -/* -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; // offset in file - uLong num_of_file; // # of file -} unz_file_pos; -*/ - -extern int ZEXPORT unzGetFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - int err; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* -// Unzip Helper Functions - should be here? -/////////////////////////////////////////// -*/ - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) - unzFile file; - int* method; - int* level; - int raw; - const char* password; -{ - int err=UNZ_OK; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ -# ifndef NOUNCRYPT - char source[12]; -# else - if (password != NULL) - return UNZ_PARAMERROR; -# endif - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - pfile_in_zip_read_info->raw=raw; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if (method!=NULL) - *method = (int)s->cur_file_info.compression_method; - - if (level!=NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->filestream=s->filestream; - pfile_in_zip_read_info->z_filefunc=s->z_filefunc; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if ((s->cur_file_info.compression_method==Z_DEFLATED) && - (!raw)) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -# ifndef NOUNCRYPT - if (password != NULL) - { - int i; - s->pcrc_32_tab = get_crc_table(); - init_keys(password,s->keys,s->pcrc_32_tab); - if (ZSEEK(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + - s->pfile_in_zip_read->byte_before_the_zipfile, - SEEK_SET)!=0) - return UNZ_INTERNALERROR; - if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) - return UNZ_INTERNALERROR; - - for (i = 0; i<12; i++) - zdecode(s->keys,s->pcrc_32_tab,source[i]); - - s->pfile_in_zip_read->pos_in_zipfile+=12; - s->encrypted=1; - } -# endif - - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword (file, password) - unzFile file; - const char* password; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) - unzFile file; - int* method; - int* level; - int raw; -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if (pfile_in_zip_read_info->read_buffer == NULL) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && - (!(pfile_in_zip_read_info->raw))) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - if ((len>pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in) && - (pfile_in_zip_read_info->raw)) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->read_buffer, - uReadThis)!=uReadThis) - return UNZ_ERRNO; - - -# ifndef NOUNCRYPT - if(s->encrypted) - { - uInt i; - for(i=0;iread_buffer[i] = - zdecode(s->keys,s->pcrc_32_tab, - pfile_in_zip_read_info->read_buffer[i]); - } -# endif - - - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) - { - uInt uDoCopy,i ; - - if ((pfile_in_zip_read_info->stream.avail_in == 0) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; - - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) - err = Z_DATA_ERROR; - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - buf,read_now)!=read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} - -/* Additions by RX '2004 */ -extern uLong ZEXPORT unzGetOffset (file) - unzFile file; -{ - unz_s* s; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file==s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset (file, pos) - unzFile file; - uLong pos; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h deleted file mode 100644 index c3206a0589..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h +++ /dev/null @@ -1,354 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer - "zlib/zlib113.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); -/* - Open a Zip file, like unzOpen, but provide a set of file low level API - for read/write the zip file (see ioapi.h) -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -/* ****************************************** */ -/* Ryan supplied functions */ -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos); - -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos); - -/* ****************************************** */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); -/* - Open for reading data the current file in the zipfile. - password is a crypting password - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -/***************************************************************************/ - -/* Get the current file offset */ -extern uLong ZEXPORT unzGetOffset (unzFile file); - -/* Set the current file offset */ -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); - - - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h deleted file mode 100644 index a4f0716054..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Header.h -// WebODF -// -// Created by KO GmbH on 3/1/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#ifndef WebODF_Header_h -#define WebODF_Header_h - -void readZipEntry(const char* zippath, const char* entrypath) {} - - -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist deleted file mode 100644 index 29011e6d11..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist +++ /dev/null @@ -1,57 +0,0 @@ - - - - - TopActivityIndicator - gray - EnableLocation - - EnableViewportScale - - AutoHideSplashScreen - - ShowSplashScreenSpinner - - MediaPlaybackRequiresUserAction - - AllowInlineMediaPlayback - - OpenAllWhitelistURLsInWebView - - ExternalHosts - - zipserver - - Plugins - - ZipClass - NativeZip - com.phonegap.accelerometer - PGAccelerometer - com.phonegap.camera - PGCamera - com.phonegap.connection - PGConnection - com.phonegap.contacts - PGContacts - com.phonegap.debugconsole - PGDebugConsole - com.phonegap.file - PGFile - com.phonegap.filetransfer - PGFileTransfer - com.phonegap.geolocation - PGLocation - com.phonegap.notification - PGNotification - com.phonegap.media - PGSound - com.phonegap.mediacapture - PGCapture - com.phonegap.splashscreen - PGSplashScreen - com.phonegap.battery - PGBattery - - - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings deleted file mode 100644 index 8972684435..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings +++ /dev/null @@ -1,25 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. - */ - -// accessibility label for recording button -"toggle audio recording" = "toggle audio recording"; -// notification spoken by VoiceOver when timed recording finishes -"timed recording complete" = "timed recording complete"; -// accessibility hint for display of recorded elapsed time -"recorded time in minutes and seconds" = "recorded time in minutes and seconds"; \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png deleted file mode 100644 index 1aebf5d34b..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png deleted file mode 100644 index 9e654236c0..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png deleted file mode 100644 index b7ccb848e3..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png deleted file mode 100644 index 06bb96b394..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png deleted file mode 100644 index dbfed967af..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png deleted file mode 100755 index fbf06e22d2..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png deleted file mode 100755 index e845a3f0b0..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist deleted file mode 100644 index 18518ec4c1..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist +++ /dev/null @@ -1,122 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleDocumentTypes - - - CFBundleTypeIconFiles - - icon.png - - CFBundleTypeName - OpenDocument Text - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.oasis.opendocument.text - - - - CFBundleTypeIconFiles - - icon.png - - CFBundleTypeName - OpenDocument Presentation - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.oasis.opendocument.presentation - - - - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon.png - CFBundleIconFiles - - icon.png - icon@2x.png - icon-72.png - - CFBundleIdentifier - WebODF-03 - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeRight - - UTExportedTypeDeclarations - - - UTTypeConformsTo - - org.gnu.gnu-zip-archive - - UTTypeDescription - OpenDocument Text - UTTypeIdentifier - org.oasis.opendocument.text - UTTypeTagSpecification - - public.filename-extension - odt - public.mime-type - application/vnd.oasis.opendocument.text - - - - UTTypeConformsTo - - org.gnu.gnu-zip-archive - - UTTypeDescription - OpenDocument Presentation - UTTypeIdentifier - org.oasis.opendocument.presentation - UTTypeTagSpecification - - public.filename-extension - odp - public.mime-type - application/vnd.oasis.opendocument.presentation - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch deleted file mode 100644 index da48b6a1fd..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'WebODF' target in the 'WebODF' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28ff8f..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m deleted file mode 100644 index bda2f99ea3..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m +++ /dev/null @@ -1,32 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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.m -// WebODF -// -// Created by KO GmbH on 2/2/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); - return retVal; -} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/index.html b/apps/files_odfviewer/src/webodf/programs/ios/www/index.html deleted file mode 100644 index ec998a1005..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/www/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - WebODF - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js b/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js deleted file mode 100644 index 04a8ff13c7..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js +++ /dev/null @@ -1,84 +0,0 @@ -/*global PhoneGap, core*/ - -var ZipPlugin = { - loadAsString: function (zippath, entrypath, success, fail) { - "use strict"; - return PhoneGap.exec(success, fail, "ZipClass", "loadAsString", [zippath, entrypath]); - }, - loadAsDataURL: function (zippath, entrypath, mimetype, success, fail) { - "use strict"; - return PhoneGap.exec(success, fail, "ZipClass", "loadAsDataURL", [zippath, entrypath, mimetype]); - } -}; -core.Zip = function (url, entriesReadCallback) { - "use strict"; - // remove 'odf:' prefix - url = url.substr(4); - var zip = this; - this.load = function (filename, callback) { - //alert(filename); - callback(null, ""); - }; - this.loadAsString = function (filename, callback) { - alert("loadAsString"); - }; - this.loadAsDOM = function (filename, callback) { - var xhr = new XMLHttpRequest(); - function handleResult() { - var xml; - console.log("loading " + filename + " status " + xhr.status + " readyState " + xhr.readyState); - if (xhr.readyState === 4) { - xml = xhr.responseXML; - console.log("done accessing responseXML " + xml + " " + (xhr.responseText && xhr.responseText.length) - + " " + xhr.statusText); - console.log("statusText " + xhr.statusText); - if (xhr.status === 0 && !xml) { - // empty files are considered as errors - callback("File " + path + " is not valid XML."); - } else if (xhr.status === 200 || xhr.status === 0) { - try { - callback(null, xml); - } catch (e) { - console.log(e); - } - } else { - // report error - callback(xhr.responseText || xhr.statusText); - } - } - } - xhr.open('GET', "http://zipserver" + url + "?" + filename, true); - xhr.onreadystatechange = handleResult; - xhr.send(null); - }; - this.loadAsDataURL = function (filename, mimetype, callback) { - callback(null, "http://zipserver" + url + "?" + filename); - /* - ZipPlugin.loadAsDataURL(url, filename, mimetype, - function (content) { - callback(null, content); - }, - function (err) { callback(err, null); } - ); - */ - }; - this.getEntries = function () { - alert("getEntries"); - }; - this.loadContentXmlAsFragments = function (filename, handler) { - // the javascript implementation simply reads the file - zip.loadAsString(filename, function (err, data) { - if (err) { - return handler.rootElementReady(err); - } - handler.rootElementReady(null, data, true); - }); - }; - this.save = function () { - alert("save"); - }; - this.write = function () { - alert("write"); - }; - entriesReadCallback(null, this); -}; diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js b/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js deleted file mode 100644 index 680e180209..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js +++ /dev/null @@ -1,4123 +0,0 @@ -/* PhoneGap v1.4.1 */ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. -*/ - - -/* - * Some base contributions - * Copyright (c) 2011, Proyectos Equis Ka, S.L. - */ - -if (typeof PhoneGap === "undefined") { - -if (typeof(DeviceInfo) !== 'object'){ - DeviceInfo = {}; -} -/** - * This represents the PhoneGap API itself, and provides a global namespace for accessing - * information about the state of PhoneGap. - * @class - */ -PhoneGap = { - // This queue holds the currently executing command and all pending - // commands executed with PhoneGap.exec(). - commandQueue: [], - // Indicates if we're currently in the middle of flushing the command - // queue on the native side. - commandQueueFlushing: false, - _constructors: [], - documentEventHandler: {}, // Collection of custom document event handlers - windowEventHandler: {} -}; - -/** - * List of resource files loaded by PhoneGap. - * This is used to ensure JS and other files are loaded only once. - */ -PhoneGap.resources = {base: true}; - -/** - * Determine if resource has been loaded by PhoneGap - * - * @param name - * @return - */ -PhoneGap.hasResource = function(name) { - return PhoneGap.resources[name]; -}; - -/** - * Add a resource to list of loaded resources by PhoneGap - * - * @param name - */ -PhoneGap.addResource = function(name) { - PhoneGap.resources[name] = true; -}; - -/** - * Boolean flag indicating if the PhoneGap API is available and initialized. - */ // TODO: Remove this, it is unused here ... -jm -PhoneGap.available = DeviceInfo.uuid != undefined; - -/** - * Add an initialization function to a queue that ensures it will run and initialize - * application constructors only once PhoneGap has been initialized. - * @param {Function} func The function callback you want run once PhoneGap is initialized - */ -PhoneGap.addConstructor = function(func) { - var state = document.readyState; - if ( ( state == 'loaded' || state == 'complete' ) && DeviceInfo.uuid != null ) - { - func(); - } - else - { - PhoneGap._constructors.push(func); - } -}; - -(function() - { - var timer = setInterval(function() - { - - var state = document.readyState; - - if ( ( state == 'loaded' || state == 'complete' ) && DeviceInfo.uuid != null ) - { - clearInterval(timer); // stop looking - // run our constructors list - while (PhoneGap._constructors.length > 0) - { - var constructor = PhoneGap._constructors.shift(); - try - { - constructor(); - } - catch(e) - { - if (typeof(console['log']) == 'function') - { - console.log("Failed to run constructor: " + console.processMessage(e)); - } - else - { - alert("Failed to run constructor: " + e.message); - } - } - } - // all constructors run, now fire the deviceready event - var e = document.createEvent('Events'); - e.initEvent('deviceready'); - document.dispatchEvent(e); - } - }, 1); -})(); - -// session id for calls -PhoneGap.sessionKey = 0; - -// centralized callbacks -PhoneGap.callbackId = 0; -PhoneGap.callbacks = {}; -PhoneGap.callbackStatus = { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }; - -/** - * Creates a gap bridge iframe used to notify the native code about queued - * commands. - * - * @private - */ -PhoneGap.createGapBridge = function() { - gapBridge = document.createElement("iframe"); - gapBridge.setAttribute("style", "display:none;"); - gapBridge.setAttribute("height","0px"); - gapBridge.setAttribute("width","0px"); - gapBridge.setAttribute("frameborder","0"); - document.documentElement.appendChild(gapBridge); - return gapBridge; -} - -/** - * Execute a PhoneGap command by queuing it and letting the native side know - * there are queued commands. The native side will then request all of the - * queued commands and execute them. - * - * Arguments may be in one of two formats: - * - * FORMAT ONE (preferable) - * The native side will call PhoneGap.callbackSuccess or - * PhoneGap.callbackError, depending upon the result of the action. - * - * @param {Function} success The success callback - * @param {Function} fail The fail callback - * @param {String} service The name of the service to use - * @param {String} action The name of the action to use - * @param {String[]} [args] Zero or more arguments to pass to the method - * - * FORMAT TWO - * @param {String} command Command to be run in PhoneGap, e.g. - * "ClassName.method" - * @param {String[]} [args] Zero or more arguments to pass to the method - * object parameters are passed as an array object - * [object1, object2] each object will be passed as - * JSON strings - */ -PhoneGap.exec = function() { - if (!PhoneGap.available) { - alert("ERROR: Attempting to call PhoneGap.exec()" - +" before 'deviceready'. Ignoring."); - return; - } - - var successCallback, failCallback, service, action, actionArgs; - var callbackId = null; - if (typeof arguments[0] !== "string") { - // FORMAT ONE - successCallback = arguments[0]; - failCallback = arguments[1]; - service = arguments[2]; - action = arguments[3]; - actionArgs = arguments[4]; - - // Since we need to maintain backwards compatibility, we have to pass - // an invalid callbackId even if no callback was provided since plugins - // will be expecting it. The PhoneGap.exec() implementation allocates - // an invalid callbackId and passes it even if no callbacks were given. - callbackId = 'INVALID'; - } else { - // FORMAT TWO - splitCommand = arguments[0].split("."); - action = splitCommand.pop(); - service = splitCommand.join("."); - actionArgs = Array.prototype.splice.call(arguments, 1); - } - - // Start building the command object. - var command = { - className: service, - methodName: action, - arguments: [] - }; - - // Register the callbacks and add the callbackId to the positional - // arguments if given. - if (successCallback || failCallback) { - callbackId = service + PhoneGap.callbackId++; - PhoneGap.callbacks[callbackId] = - {success:successCallback, fail:failCallback}; - } - if (callbackId != null) { - command.arguments.push(callbackId); - } - - for (var i = 0; i < actionArgs.length; ++i) { - var arg = actionArgs[i]; - if (arg == undefined || arg == null) { - continue; - } else if (typeof(arg) == 'object') { - command.options = arg; - } else { - command.arguments.push(arg); - } - } - - // Stringify and queue the command. We stringify to command now to - // effectively clone the command arguments in case they are mutated before - // the command is executed. - PhoneGap.commandQueue.push(JSON.stringify(command)); - - // If the queue length is 1, then that means it was empty before we queued - // the given command, so let the native side know that we have some - // commands to execute, unless the queue is currently being flushed, in - // which case the command will be picked up without notification. - if (PhoneGap.commandQueue.length == 1 && !PhoneGap.commandQueueFlushing) { - if (!PhoneGap.gapBridge) { - PhoneGap.gapBridge = PhoneGap.createGapBridge(); - } - - PhoneGap.gapBridge.src = "gap://ready"; - } -} - -/** - * Called by native code to retrieve all queued commands and clear the queue. - */ -PhoneGap.getAndClearQueuedCommands = function() { - json = JSON.stringify(PhoneGap.commandQueue); - PhoneGap.commandQueue = []; - return json; -} - -/** - * Called by native code when returning successful result from an action. - * - * @param callbackId - * @param args - * args.status - PhoneGap.callbackStatus - * args.message - return value - * args.keepCallback - 0 to remove callback, 1 to keep callback in PhoneGap.callbacks[] - */ -PhoneGap.callbackSuccess = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - - // If result is to be sent to callback - if (args.status == PhoneGap.callbackStatus.OK) { - try { - if (PhoneGap.callbacks[callbackId].success) { - PhoneGap.callbacks[callbackId].success(args.message); - } - } - catch (e) { - console.log("Error in success callback: "+callbackId+" = "+e); - } - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - -/** - * Called by native code when returning error result from an action. - * - * @param callbackId - * @param args - */ -PhoneGap.callbackError = function(callbackId, args) { - if (PhoneGap.callbacks[callbackId]) { - try { - if (PhoneGap.callbacks[callbackId].fail) { - PhoneGap.callbacks[callbackId].fail(args.message); - } - } - catch (e) { - console.log("Error in error callback: "+callbackId+" = "+e); - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete PhoneGap.callbacks[callbackId]; - } - } -}; - - -/** - * Does a deep clone of the object. - * - * @param obj - * @return - */ -PhoneGap.clone = function(obj) { - if(!obj) { - return obj; - } - - if(obj instanceof Array){ - var retVal = new Array(); - for(var i = 0; i < obj.length; ++i){ - retVal.push(PhoneGap.clone(obj[i])); - } - return retVal; - } - - if (obj instanceof Function) { - return obj; - } - - if(!(obj instanceof Object)){ - return obj; - } - - if (obj instanceof Date) { - return obj; - } - - retVal = new Object(); - for(i in obj){ - if(!(i in retVal) || retVal[i] != obj[i]) { - retVal[i] = PhoneGap.clone(obj[i]); - } - } - return retVal; -}; - -// Intercept calls to document.addEventListener -PhoneGap.m_document_addEventListener = document.addEventListener; - -// Intercept calls to window.addEventListener -PhoneGap.m_window_addEventListener = window.addEventListener; - -/** - * Add a custom window event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addWindowEventHandler = function(event, callback) { - PhoneGap.windowEventHandler[event] = callback; -} - -/** - * Add a custom document event handler. - * - * @param {String} event The event name that callback handles - * @param {Function} callback The event handler - */ -PhoneGap.addDocumentEventHandler = function(event, callback) { - PhoneGap.documentEventHandler[event] = callback; -} - -/** - * Intercept adding document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If subscribing to an event that is handled by a plugin - if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); -}; - -/** - * Intercept adding window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If subscribing to an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, true)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); -}; - -// Intercept calls to document.removeEventListener and watch for events that -// are generated by PhoneGap native code -PhoneGap.m_document_removeEventListener = document.removeEventListener; - -// Intercept calls to window.removeEventListener -PhoneGap.m_window_removeEventListener = window.removeEventListener; - -/** - * Intercept removing document event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { - if (PhoneGap.documentEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); -}; - -/** - * Intercept removing window event listeners and handle our own - * - * @param {Object} evt - * @param {Function} handler - * @param capture - */ -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - - // If unsubcribing from an event that is handled by a plugin - if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { - if (PhoneGap.windowEventHandler[e](e, handler, false)) { - return; // Stop default behavior - } - } - - PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); -}; - -/** - * Method to fire document event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireDocumentEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - document.dispatchEvent(e); -}; - -/** - * Method to fire window event - * - * @param {String} type The event type to fire - * @param {Object} data Data to send with event - */ -PhoneGap.fireWindowEvent = function(type, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - window.dispatchEvent(e); -}; - -/** - * Method to fire event from native code - * Leaving this generic version to handle problems with iOS 3.x. Is currently used by orientation and battery events - * Remove when iOS 3.x no longer supported and call fireWindowEvent or fireDocumentEvent directly - */ -PhoneGap.fireEvent = function(type, target, data) { - var e = document.createEvent('Events'); - e.initEvent(type); - if (data) { - for (var i in data) { - e[i] = data[i]; - } - } - target = target || document; - if (target.dispatchEvent === undefined) { // ie window.dispatchEvent is undefined in iOS 3.x - target = document; - } - - target.dispatchEvent(e); -}; -/** - * Create a UUID - * - * @return - */ -PhoneGap.createUUID = function() { - return PhoneGap.UUIDcreatePart(4) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(2) + '-' + - PhoneGap.UUIDcreatePart(6); -}; - -PhoneGap.UUIDcreatePart = function(length) { - var uuidpart = ""; - for (var i=0; i -1) { - me._batteryListener.splice(pos, 1); - } - } else if (eventType === "batterylow") { - var pos = me._lowListener.indexOf(handler); - if (pos > -1) { - me._lowListener.splice(pos, 1); - } - } else if (eventType === "batterycritical") { - var pos = me._criticalListener.indexOf(handler); - if (pos > -1) { - me._criticalListener.splice(pos, 1); - } - } - - // If there are no more registered event listeners stop the battery listener on native side. - if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { - PhoneGap.exec(null, null, "com.phonegap.battery", "stop", []); - } - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = this; - if (me._level != info.level || me._isPlugged != info.isPlugged) { - // Fire batterystatus event - //PhoneGap.fireWindowEvent("batterystatus", info); - // use this workaround since iOS 3.x does have window.dispatchEvent - PhoneGap.fireEvent("batterystatus", window, info); - - // Fire low battery event - if (info.level == 20 || info.level == 5) { - if (info.level == 20) { - //PhoneGap.fireWindowEvent("batterylow", info); - // use this workaround since iOS 3.x does not have window.dispatchEvent - PhoneGap.fireEvent("batterylow", window, info); - } - else { - //PhoneGap.fireWindowEvent("batterycritical", info); - // use this workaround since iOS 3.x does not have window.dispatchEvent - PhoneGap.fireEvent("batterycritical", window, info); - } - } - } - me._level = info.level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -PhoneGap.addConstructor(function() { - if (typeof navigator.battery === "undefined") { - navigator.battery = new Battery(); - PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); - PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); - } -}); -}if (!PhoneGap.hasResource("camera")) { - PhoneGap.addResource("camera"); - - -/** - * This class provides access to the device camera. - * @constructor - */ -Camera = function() { - -} -/** - * Available Camera Options - * {boolean} allowEdit - true to allow editing image, default = false - * {number} quality 0-100 (low to high) default = 100 - * {Camera.DestinationType} destinationType default = DATA_URL - * {Camera.PictureSourceType} sourceType default = CAMERA - * {number} targetWidth - width in pixels to scale image default = 0 (no scaling) - * {number} targetHeight - height in pixels to scale image default = 0 (no scaling) - * {Camera.EncodingType} - encodingType default = JPEG - * {boolean} correctOrientation - Rotate the image to correct for the orientation of the device during capture (iOS only) - * {boolean} saveToPhotoAlbum - Save the image to the photo album on the device after capture (iOS only) - */ -/** - * Format of image that is returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.DestinationType = { - DATA_URL: 0, // Return base64 encoded string - FILE_URI: 1 // Return file uri -}; -Camera.prototype.DestinationType = Camera.DestinationType; - -/** - * Source to getPicture from. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) - */ -Camera.PictureSourceType = { - PHOTOLIBRARY : 0, // Choose image from picture library - CAMERA : 1, // Take picture from camera - SAVEDPHOTOALBUM : 2 // Choose image from picture library -}; -Camera.prototype.PictureSourceType = Camera.PictureSourceType; - -/** - * Encoding of image returned from getPicture. - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.CAMERA, - * encodingType: Camera.EncodingType.PNG}) - */ -Camera.EncodingType = { - JPEG: 0, // Return JPEG encoded image - PNG: 1 // Return PNG encoded image -}; -Camera.prototype.EncodingType = Camera.EncodingType; - -/** - * Type of pictures to select from. Only applicable when - * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM - * - * Example: navigator.camera.getPicture(success, fail, - * { quality: 80, - * destinationType: Camera.DestinationType.DATA_URL, - * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, - * mediaType: Camera.MediaType.PICTURE}) - */ -Camera.MediaType = { - PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType - VIDEO: 1, // allow selection of video only, ONLY RETURNS URL - ALLMEDIA : 2 // allow selection from all media types -}; -Camera.prototype.MediaType = Camera.MediaType; - -/** - * Gets a picture from source defined by "options.sourceType", and returns the - * image as defined by the "options.destinationType" option. - - * The defaults are sourceType=CAMERA and destinationType=DATA_URL. - * - * @param {Function} successCallback - * @param {Function} errorCallback - * @param {Object} options - */ -Camera.prototype.getPicture = function(successCallback, errorCallback, options) { - // successCallback required - if (typeof successCallback != "function") { - console.log("Camera Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback != "function")) { - console.log("Camera Error: errorCallback is not a function"); - return; - } - - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.camera","getPicture",[options]); -}; - - - -PhoneGap.addConstructor(function() { - if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); -}); -}; - -if (!PhoneGap.hasResource("device")) { - PhoneGap.addResource("device"); - -/** - * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the - * phone, etc. - * @constructor - */ -Device = function() -{ - this.platform = null; - this.version = null; - this.name = null; - this.phonegap = null; - this.uuid = null; - try - { - this.platform = DeviceInfo.platform; - this.version = DeviceInfo.version; - this.name = DeviceInfo.name; - this.phonegap = DeviceInfo.gap; - this.uuid = DeviceInfo.uuid; - - } - catch(e) - { - // TODO: - } - this.available = PhoneGap.available = this.uuid != null; -} - -PhoneGap.addConstructor(function() { - if (typeof navigator.device === "undefined") { - navigator.device = window.device = new Device(); - } -}); -}; -if (!PhoneGap.hasResource("capture")) { - PhoneGap.addResource("capture"); -/** - * The CaptureError interface encapsulates all errors in the Capture API. - */ -function CaptureError() { - this.code = null; -}; - -// Capture error codes -CaptureError.CAPTURE_INTERNAL_ERR = 0; -CaptureError.CAPTURE_APPLICATION_BUSY = 1; -CaptureError.CAPTURE_INVALID_ARGUMENT = 2; -CaptureError.CAPTURE_NO_MEDIA_FILES = 3; -CaptureError.CAPTURE_NOT_SUPPORTED = 20; - -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -function Capture() { - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -}; - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - * - * No audio recorder to launch for iOS - return CAPTURE_NOT_SUPPORTED - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options) { - /*if (errorCallback && typeof errorCallback === "function") { - errorCallback({ - "code": CaptureError.CAPTURE_NOT_SUPPORTED - }); - }*/ - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureAudio", [options]); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options) { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureImage", [options]); -}; - -/** - * Casts a PluginResult message property (array of objects) to an array of MediaFile objects - * (used in Objective-C) - * - * @param {PluginResult} pluginResult - */ -Capture.prototype._castMediaFile = function(pluginResult) { - var mediaFiles = []; - var i; - for (i=0; i} categories -* @param {ContactField[]} urls contact's web sites -*/ -var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; // JS Date - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; - this.urls = urls || null; // ContactField[] -}; - -/** -* Converts Dates to milliseconds before sending to iOS -*/ -Contact.prototype.convertDatesOut = function() -{ - var dates = new Array("birthday"); - for (var i=0; i][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - this.fileName = ""; - - if (typeof file.fullPath === "undefined") { - this.fileName = file; - } else { - this.fileName = file.fullPath; - } - - // LOADING state - this.readyState = FileReader.LOADING; - - // If loadstart callback - if (typeof this.onloadstart === "function") { - var evt = File._createEvent("loadstart", this); - this.onloadstart(evt); - } - - var me = this; - - // Read file - navigator.fileMgr.readAsDataURL(this.fileName, - - // Success callback - function(r) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save result - me.result = r; - - // If onload callback - if (typeof me.onload === "function") { - evt = File._createEvent("load", me); - me.onload(evt); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - evt = File._createEvent("loadend", me); - me.onloadend(evt); - } - }, - - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - evt = File._createEvent("loadend", me); - me.onloadend(evt); - } - } - ); -}; - -/** - * Read file and return data as a binary data. - * - * @param file The name of the file - */ -FileReader.prototype.readAsBinaryString = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -/** - * Read file and return data as a binary data. - * - * @param file The name of the file - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - // TODO - Can't return binary data to browser. - this.fileName = file; -}; - -//----------------------------------------------------------------------------- -// File Writer -//----------------------------------------------------------------------------- - -/** - * This class writes to the mobile device file system. - * - @param file {File} a File object representing a file on the file system -*/ -FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -} - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw FileError.INVALID_STATE_ERR; - } - - // set error - var error = new FileError(), evt; - error.code = error.ABORT_ERR; - this.error = error; - - // If error callback - if (typeof this.onerror === "function") { - evt = File._createEvent("error", this); - this.onerror(evt); - } - // If abort callback - if (typeof this.onabort === "function") { - evt = File._createEvent("abort", this); - this.onabort(evt); - } - - this.readyState = FileWriter.DONE; - - // If write end callback - if (typeof this.onwriteend == "function") { - evt = File._createEvent("writeend", this); - this.onwriteend(evt); - } -}; - -/** - * @Deprecated: use write instead - * - * @param file to write the data to - * @param text to be written - * @param bAppend if true write to end of file, otherwise overwrite the file - */ -FileWriter.prototype.writeAsText = function(file, text, bAppend) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - if (bAppend !== true) { - bAppend = false; // for null values - } - - this.fileName = file; - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - - // Write file - navigator.fileMgr.writeAsText(file, text, bAppend, - // Success callback - function(r) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save result - me.result = r; - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - // Write file - navigator.fileMgr.write(this.fileName, text, this.position, - - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - me.length = me.position; - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); - -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - - if (!offset) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger then file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw FileError.INVALID_STATE_ERR; - } - // what if no size specified? - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - var evt = File._createEvent("writestart", me); - me.onwritestart(evt); - } - - // Write file - navigator.fileMgr.truncate(this.fileName, size, - - // Success callback - function(r) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - evt = File._createEvent("write", me); - me.onwrite(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - }, - - // Error callback - function(e) { - var evt; - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // Save error - me.error = e; - - // If onerror callback - if (typeof me.onerror === "function") { - evt = File._createEvent("error", me); - me.onerror(evt); - } - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - evt = File._createEvent("writeend", me); - me.onwriteend(evt); - } - } - ); -}; - -LocalFileSystem = function() { -}; - -// File error codes -LocalFileSystem.TEMPORARY = 0; -LocalFileSystem.PERSISTENT = 1; -LocalFileSystem.RESOURCE = 2; -LocalFileSystem.APPLICATION = 3; - -/** - * Requests a filesystem in which to store application data. - * - * @param {int} type of file system being requested - * @param {Function} successCallback is called with the new FileSystem - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { - if (type < 0 || type > 3) { - if (typeof errorCallback == "function") { - errorCallback({ - "code": FileError.SYNTAX_ERR - }); - } - } - else { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "requestFileSystem", [type, size]); - } -}; - -/** - * - * @param {DOMString} uri referring to a local file in a filesystem - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { - PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "resolveLocalFileSystemURI", [uri]); -}; - -/** -* This function is required as we need to convert raw -* JSON objects into concrete File and Directory objects. -* -* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. -* @returns an entry -*/ -LocalFileSystem.prototype._castFS = function(pluginResult) { - var entry = null; - entry = new DirectoryEntry(); - entry.isDirectory = pluginResult.message.root.isDirectory; - entry.isFile = pluginResult.message.root.isFile; - entry.name = pluginResult.message.root.name; - entry.fullPath = pluginResult.message.root.fullPath; - pluginResult.message.root = entry; - return pluginResult; -} - -LocalFileSystem.prototype._castEntry = function(pluginResult) { - var entry = null; - if (pluginResult.message.isDirectory) { - entry = new DirectoryEntry(); - } - else if (pluginResult.message.isFile) { - entry = new FileEntry(); - } - entry.isDirectory = pluginResult.message.isDirectory; - entry.isFile = pluginResult.message.isFile; - entry.name = pluginResult.message.name; - entry.fullPath = pluginResult.message.fullPath; - pluginResult.message = entry; - return pluginResult; -} - -LocalFileSystem.prototype._castEntries = function(pluginResult) { - var entries = pluginResult.message; - var retVal = []; - for (i=0; i") -foreach(FILE ${HTML5UIFILES} ${LIBJSFILES} index.html scripts.js webodf.css) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc - "www/${FILE}\n") -endforeach(FILE ${HTML5UIFILES}) -file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc - "") -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui - ${CMAKE_CURRENT_BINARY_DIR}/www ${HTML5UIFILES}) -COPY_FILES(NATIVEDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/www scripts.js) -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui - ${CMAKE_CURRENT_BINARY_DIR}/www index.html) -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/webodf - ${CMAKE_CURRENT_BINARY_DIR}/www webodf.css) -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/webodf - ${CMAKE_CURRENT_BINARY_DIR}/www ${LIBJSFILES}) -QT4_ADD_RESOURCES(NATIVEQTCLIENT_RES - ${CMAKE_CURRENT_BINARY_DIR}/application.qrc) - -add_custom_target(nativeQtClientDepencencies ALL DEPENDS ${NATIVEDEPS}) - -add_executable(nativeQtClient - main.cpp - odfview.cpp - ../qtjsruntime/nativeio.cpp - odfpage.cpp ${NATIVEQTCLIENT_MOC} ${NATIVEQTCLIENT_UI} - ${NATIVEQTCLIENT_RES}) - -target_link_libraries(nativeQtClient ${QT_LIBRARIES}) -add_dependencies(nativeQtClient nativeQtClientDepencencies) diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README deleted file mode 100644 index 4860fa1b00..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README +++ /dev/null @@ -1 +0,0 @@ -This is a small app that can show ODF documents using mainly javascript. Some functions that are not fast in browers are provided in C++ and it gives the ability to open files on the file system. diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc deleted file mode 100644 index 5010cdb8a8..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - www/app/app.js - www/app/controller/Files.js - www/app/model/FileSystem.js - www/app/store/FileStore.js - www/app/views/FileDetail.js - www/app/views/FilesList.js - www/app/views/OdfView.js - www/app/views/Viewport.js - www/index.html - www/scripts.js - www/sencha-touch.css - www/sencha-touch.js - www/webodf.css - www/webodf.js - - diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp deleted file mode 100644 index 62e5fa18be..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "odfview.h" -#include -#include - -int main(int argc, char *argv[]) { - QApplication a(argc, argv); - OdfView view; - view.show(); - return a.exec(); -} diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp deleted file mode 100644 index 861014399e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include "odfview.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); - - createActions(); - createToolBars(); - - QCoreApplication::setOrganizationName("KO"); - //QCoreApplication::setOrganizationDomain("example.com"); - QCoreApplication::setApplicationName("Odf Viewer"); - - QSettings settings; - - setWindowTitle(tr("Odf Viewer")); - setUnifiedTitleAndToolBarOnMac(true); - - QStringList odfNameFilter; - odfNameFilter << "*.odt" << "*.ods" << "*.odp"; - dirmodel = new QFileSystemModel(this); - dirmodel->setNameFilters(odfNameFilter); - dirmodel->setFilter(QDir::AllDirs|QDir::AllEntries|QDir::NoDotAndDotDot); - dirview = new QTreeView(this); - dirview->setModel(dirmodel); - dirview->setHeaderHidden(true); - dirview->setAnimated(true); - for (int i = 1; i < dirmodel->columnCount(); i++) { - dirview->setColumnHidden(i, true); - } - QString rootpath = settings.value("rootpath", QDir::homePath()).toString(); - dirmodel->setRootPath(rootpath); - const QModelIndex rootindex = dirmodel->index(rootpath); - dirview->setRootIndex(rootindex); - QLineEdit *dirPath = new QLineEdit(rootpath, this); - dirdock = new QDockWidget(this); - QWidget *w = new QWidget(dirdock); - QVBoxLayout *layout = new QVBoxLayout(w); - dirdock->setWidget(w); - layout->addWidget(dirPath); - layout->addWidget(dirview); - addDockWidget(Qt::LeftDockWidgetArea, dirdock); - - connect(dirview, SIGNAL(clicked(QModelIndex)), this, SLOT(loadOdf(QModelIndex))); - connect(dirPath, SIGNAL(textChanged(QString)), this, SLOT(setPath(QString))); -} - -MainWindow::~MainWindow() -{ - delete ui; -} - -void -MainWindow::openFile(const QString& path) -{ - QMdiSubWindow* w = findMdiChild(path); - OdfView* v = (w) ?dynamic_cast(w->widget()) :0; - if (v == 0) { - w = ui->mdiArea->activeSubWindow(); - v = (w) ?dynamic_cast(w->widget()) :0; - } - if (v == 0) { - v = new OdfView(this); - v->showMaximized(); - w = ui->mdiArea->addSubWindow(v); - w->showMaximized(); - } - ui->mdiArea->setActiveSubWindow(w); - v->loadFile(path); -} - -void MainWindow::changeEvent(QEvent *e) -{ - QMainWindow::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} -void MainWindow::open() -{ - QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), - tr("Office Files (*.odt *.odp *.ods)")); - if (!fileName.isEmpty()) { - QMdiSubWindow *existing = findMdiChild(fileName); - if (existing) { - ui->mdiArea->setActiveSubWindow(existing); - return; - } - - OdfView *child = createOdfView(); - if (child->loadFile(fileName)) { - statusBar()->showMessage(tr("File loaded"), 2000); - child->showMaximized(); - } else { - child->close(); - } - } -} -void MainWindow::createActions() -{ - //openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); - openAct = new QAction(tr("&Open..."), this); - openAct->setShortcuts(QKeySequence::Open); - openAct->setStatusTip(tr("Open an existing file")); - connect(openAct, SIGNAL(triggered()), this, SLOT(open())); -} -void MainWindow::createToolBars() -{ - fileToolBar = addToolBar(tr("File")); - fileToolBar->addAction(openAct); -} -QMdiSubWindow *MainWindow::findMdiChild(const QString &fileName) -{ - QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath(); - - foreach (QMdiSubWindow *window, ui->mdiArea->subWindowList()) { - OdfView *odfView = qobject_cast(window->widget()); - if (odfView->currentFile() == canonicalFilePath) - return window; - } - return 0; -} - -OdfView *MainWindow::createOdfView() -{ - OdfView *view = new OdfView(this); - ui->mdiArea->addSubWindow(view); - return view; -} - -void -MainWindow::loadOdf(const QModelIndex& index) { - if (dirmodel->isDir(index)) { - if (dirview->isExpanded(index)) { - dirview->collapse(index); - } else { - dirview->expand(index); - } - return; - } - QString path = dirmodel->filePath(index); - path = QFileInfo(path).canonicalFilePath(); - openFile(path); -} - -void MainWindow::setPath(const QString &path) -{ - dirmodel->setRootPath(path); - const QModelIndex rootindex = dirmodel->index(path); - dirview->setRootIndex(rootindex); - QSettings settings; - settings.setValue("rootpath", path); -} - - - diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h deleted file mode 100644 index d0bc822d03..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include - -namespace Ui { - class MainWindow; -} - -class OdfView; -class QFileSystemModel; -class QTreeView; -class QDockWidget; -class QModelIndex; - -class MainWindow : public QMainWindow { - Q_OBJECT -public: - MainWindow(QWidget *parent = 0); - ~MainWindow(); - void openFile(const QString& path); - -private slots: - void open(); - OdfView *createOdfView(); - void loadOdf(const QModelIndex& index); - void setPath(const QString &path); - -private: - QMdiSubWindow *findMdiChild(const QString &fileName); - void createActions(); - void createToolBars(); - QToolBar *fileToolBar; - QAction *openAct; -protected: - void changeEvent(QEvent *e); - -private: - Ui::MainWindow *ui; - QFileSystemModel* dirmodel; - QTreeView* dirview; - QDockWidget* dirdock; -}; - -#endif // MAINWINDOW_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui deleted file mode 100644 index 38682c7010..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui +++ /dev/null @@ -1,46 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - - - - - - - 0 - 0 - 800 - 23 - - - - - - TopToolBarArea - - - false - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp deleted file mode 100644 index d87a8baa2b..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "odfpage.h" diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h deleted file mode 100644 index 487d169917..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef ODFPAGE_H -#define ODFPAGE_H - -#include -#include - -class OdfPage : public QWebPage { -public: - OdfPage(QObject* parent) :QWebPage(parent) {} - void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString & sourceID) { - qDebug() << sourceID << ":" << lineNumber << ":" << message; - } -}; - -#endif // ODFPAGE_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp deleted file mode 100644 index 97125a5537..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "odfview.h" - -#include "../qtjsruntime/nativeio.h" -#include "../qtjsruntime/nam.h" - -#include "odfpage.h" - -#include -#include -#include -#include -#include -#include -#include - -OdfView::OdfView(QWidget* parent) :QWebView(parent) -{ - QString prefix = "../android/assets/"; // set this to the right value when debugging - QString htmlfile = QDir(prefix).absoluteFilePath("www/index.html"); - if (!QFileInfo(htmlfile).exists()) { - prefix = "qrc:/"; - htmlfile = "qrc:/www/index.html"; - } - setPage(new OdfPage(this)); - nativeio = new NativeIO(this, QDir(prefix), QDir::current()); - connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); - page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); - - connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), - this, SLOT(slotInitWindowObjects())); - - // use our own networkaccessmanager that gives limited access to the local - // file system - networkaccessmanager = new NAM(this); - page()->setNetworkAccessManager(networkaccessmanager); - setUrl(QUrl(htmlfile)); - loaded = false; -} - -OdfView::~OdfView() { -} - -void -OdfView::slotInitWindowObjects() -{ - QWebFrame *frame = page()->mainFrame(); - frame->addToJavaScriptWindowObject("nativeio", nativeio); -} - -bool -OdfView::loadFile(const QString &fileName) { - curFile = fileName; - // odf->addFile(identifier, fileName); - // networkaccessmanager->setCurrentFile(odf->getOpenContainer(identifier)); - if (loaded) { - slotLoadFinished(true); - } - return true; -} -void -OdfView::slotLoadFinished(bool ok) { - if (!ok) return; - loaded = true; - QWebFrame *frame = page()->mainFrame(); - QString js = - "var originalReadFileSync = runtime.readFileSync;" - "runtime.readFileSync = function (path, encoding) {" - " if (path.substr(path.length - 3) === '.js') {" - " return originalReadFileSync.apply(runtime," - " [path, encoding]);" - " }" - " return nativeio.readFileSync(path, encoding);" - "};" - "runtime.read = function (path, offset, length, callback) {" - " var data = nativeio.read(path, offset, length);" - " data = runtime.byteArrayFromString(data, 'binary');" - " callback(nativeio.error()||null, data);" - "};" - "runtime.getFileSize = function (path, callback) {" - " callback(nativeio.getFileSize(path));" - "};"; - frame->evaluateJavaScript(js); -} diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h deleted file mode 100644 index f61ba3c926..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef ODFVIEW_H -#define ODFVIEW_H - -#include -#include -class NativeIO; - -class OdfView : public QWebView { -Q_OBJECT -public: - OdfView(QWidget* parent = 0); - ~OdfView(); - QString currentFile() { return curFile; } - -public slots: - bool loadFile(const QString &fileName); - -private slots: - void slotLoadFinished(bool ok); - void slotInitWindowObjects(); - -private: - bool loaded; - QString curFile; - QNetworkAccessManager* networkaccessmanager; - NativeIO* nativeio; -}; - -#endif // ODFVIEW_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js deleted file mode 100644 index ce2086bc7a..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js +++ /dev/null @@ -1,93 +0,0 @@ -/*global alert, app, window, runtime*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath); - try { - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsArrayBuffer = function (file) { - var path = file.fullPath.substr(7), - data = runtime.readFileSync(path, 'binary'); - data = runtime.byteArrayFromString(data, "binary"); - window.setTimeout(function () { - fr.onloadend({target: {result: data}}); - }, 1); - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = []; - entries[entries.length] = new FileEntry("welcome.odt", - "welcome.odt"); - entries[entries.length] = new FileEntry("Traktatenblad.odt", - "Traktatenblad.odt"); - try { - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name = (p === -1) ? path : path.substr(p + 1); - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder, path; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - path = ""; - onsuccess({ - name: "root", - root: new DirectoryEntry("root", path) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/playbook/CMakeLists.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat b/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat deleted file mode 100644 index 34e8deeab3..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat +++ /dev/null @@ -1,23 +0,0 @@ -@echo on -set WWSDK=M:\blackberrysdk\webworkssdk -set BBWP=%WWSDK%\bbwp\bbwp -set DEPLOY=%WWSDK%\bbwp\blackberry-tablet-sdk\bin\blackberry-deploy -set JAVA_HOME=%WWSDK%\jre -set PATH=%PATH%;%JAVA_HOME%\bin - -mkdir bin -mkdir signed - -zip -r webodf.zip config.xml index.html icon.png scripts.js app sencha-touch.js sencha-touch.css webodf.js webodf.css ZoomIn.png ZoomOut.png - -rem MAKE A DEBUG VERSION -del bin\webodf.bar -%BBWP% webodf.zip -d -o bin -if %errorlevel% neq 0 exit /b %errorlevel% - -%DEPLOY% -installApp -password ko -device 192.168.1.111 -package bin\webodf.bar -if %errorlevel% neq 0 exit /b %errorlevel% - -rem MAKE A SIGNED VERSION, (can be done only once for each buildId!) -rem %BBWP% webodf.zip -g U9gXpJXbGC -buildId 2 -o signed - diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/config.xml b/apps/files_odfviewer/src/webodf/programs/playbook/config.xml deleted file mode 100644 index cab7788317..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/config.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - KO GmbH - WebODF - - Viewer for OpenDocument files. - - - - - - - - - access_shared - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js deleted file mode 100644 index 8c4d91c46e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js +++ /dev/null @@ -1,17 +0,0 @@ -(function () { - var CUSTOM_FILEREADER_API_URL = "blackberry/custom/filereader"; - - var ARGS_PATH = "path"; - var ARGS_DATA = "data"; - - function CustomFileReader() { - }; - - CustomFileReader.prototype.readAsDataURL = function(path) { - var remoteCall = new blackberry.transport.RemoteFunctionCall(CUSTOM_FILEREADER_API_URL + "/readAsDataURL"); - remoteCall.addParam(ARGS_PATH, path); - return remoteCall.makeSyncCall(); - }; - - blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); -})(); diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js deleted file mode 100644 index 2ae1ede11e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js +++ /dev/null @@ -1,8 +0,0 @@ -(function () { - - function CustomFileReader(disp) { - this.constructor.prototype.readAsDataURL = function(path) { return disp.readAsDataURL(path); }; - }; - - blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); -})(); diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml deleted file mode 100644 index 1f3aa52d36..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - blackberry.custom.filereader.CustomFileReader - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as deleted file mode 100644 index 3261fbcf45..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as +++ /dev/null @@ -1,34 +0,0 @@ -package blackberry.custom.filereader { - import flash.filesystem.File; - import flash.filesystem.FileMode; - import flash.filesystem.FileStream; - import flash.utils.ByteArray; - import mx.utils.Base64Encoder; - import webworks.extension.DefaultExtension; - - public class CustomFileReader extends DefaultExtension { - - public function CustomFileReader() { - super(); - } - - override public function getFeatureList():Array { - return new Array ("blackberry.custom.filereader"); - } - - public function readAsDataURL(path:String):String { - var file:File = new File(path); - if (!file.exists) { - return ""; - } - var bytes:ByteArray = new ByteArray(); - var stream:FileStream = new FileStream(); - stream.open(file, FileMode.READ); - stream.readBytes(bytes); - var btoa:Base64Encoder = new Base64Encoder(); - btoa.encodeBytes(bytes); - stream.close(); - return "data:;base64," + btoa.toString(); - } - } -} \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/icon.png b/apps/files_odfviewer/src/webodf/programs/playbook/icon.png deleted file mode 100644 index b7ccb848e3..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/playbook/icon.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/index.html b/apps/files_odfviewer/src/webodf/programs/playbook/index.html deleted file mode 100644 index 77d331c12e..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - WebODF - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js b/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js deleted file mode 100644 index e7913527d6..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js +++ /dev/null @@ -1,146 +0,0 @@ -/*global blackberry, alert, document, window, app*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileWriter(fullPath) { - "use strict"; - this.write = function (data) { - var blob; - try { - blob = blackberry.utils.stringToBlob(data, "UTF-8"); - blackberry.io.file.saveFile(fullPath, blob); - } catch (e) { - } - }; -} -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath), - properties; - try { - properties = blackberry.io.file.getFileProperties(fullPath); - file.type = properties.mimeType; - file.size = properties.size; - file.lastModifiedDate = properties.dateModified; - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; - this.createWriter = function (onsuccess, onerror) { - onsuccess(new FileWriter(fullPath)); - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsDataURL = function (file) { - var path = file.fullPath.substr(7); - window.setTimeout(function () { - try { - var data = blackberry.custom.filereader.readAsDataURL(path); - fr.onloadend({target: {result: data}}); - } catch (e) { - alert("Error on reading file: " + e + " " + file.fullPath); - } - }, 1); - }; - this.readAsText = function (file) { - var path = file.fullPath.substr(7); - try { - blackberry.io.file.readFile(path, function (fullPath, blob) { - var str = blackberry.utils.blobToString(blob, "UTF-8"); - fr.onloadend({target: {result: str}}); - }, true); - } catch (e) { - fr.onloadend({target: {result: "[]"}}); - } - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = [], - dirs = blackberry.io.dir.listDirectories(fullPath), - files = blackberry.io.dir.listFiles(fullPath), - i; - try { - for (i = 0; i < dirs.length; i += 1) { - entries[entries.length] = new DirectoryEntry(dirs[i], - fullPath + "/" + dirs[i]); - } - for (i = 0; i < files.length; i += 1) { - entries[entries.length] = new FileEntry(files[i], - fullPath + "/" + files[i]); - } - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name; - if (p === -1) { - name = path; - path = blackberry.io.dir.appDirs.shared.documents.path + "/" + path; - } else { - name = path.substr(p + 1); - } - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - shared = blackberry.io.dir.appDirs.shared; - for (subfolder in shared) { - if (shared.hasOwnProperty(subfolder)) { - dirs[dirs.length] = subfolder; - } - } - onsuccess({ - name: "root", - root: new DirectoryEntry("root", shared.documents.path - //+ "/kofficetests/odf/odt" - ) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt deleted file mode 100644 index ec8026741c..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -include(${QT_USE_FILE}) -QT4_WRAP_CPP(QTJSRUNTIME_MOC nam.h pagerunner.h nativeio.h) -add_executable(qtjsruntime qtjsruntime.cpp pagerunner.cpp nativeio.cpp ${QTJSRUNTIME_MOC}) -target_link_libraries(qtjsruntime ${QT_LIBRARIES}) diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h deleted file mode 100644 index ebb62f261a..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef NAM_H -#define NAM_H - -#include -#include - -class NAM : public QNetworkAccessManager { -Q_OBJECT -private: - const QString host; - const int port; - int outstandingRequests; -public: - NAM(QObject* parent, const QString& host_ = QString(), int port_ = -1) - :QNetworkAccessManager(parent), host(host_), port(port_) { - outstandingRequests = 0; - connect(this, SIGNAL(finished(QNetworkReply*)), - this, SLOT(requestFinished())); - } - QNetworkReply* createRequest(QNetworkAccessManager::Operation o, - QNetworkRequest const& r, QIODevice* d) { - outstandingRequests += 1; - bool samehost = false; - if (port > 0) { - samehost = r.url().host() == host - || r.url().host().endsWith("." + host) - || host.endsWith("." + r.url().host()); - samehost &= r.url().port() != port; - } else { - // use host string as a prefix - samehost = r.url().toString().startsWith(host); - } - if (!samehost) { - // if not same host or domain and port, block - return QNetworkAccessManager::createRequest(o, QNetworkRequest(), - d); - } - return QNetworkAccessManager::createRequest(o, r, d); - } - bool hasOutstandingRequests() { - return outstandingRequests > 0; - } -public slots: - void requestFinished() { - outstandingRequests -= 1; - } -}; -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp deleted file mode 100644 index 0657a0c711..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "nativeio.h" -#include -#include -#include - -NativeIO::NativeIO(QObject* parent, const QDir& runtimedir_, - const QDir& cwd_, - const QMap& pathPermissions_) - :QObject(parent), runtimedir(runtimedir_), cwd(cwd_), - pathPermissions(pathPermissions_) { -} -QString -NativeIO::readFileSync(const QString& path, const QString& encoding) { - errstr = QString(); - QFile file(cwd.absoluteFilePath(path)); - QByteArray data; - if (file.open(QIODevice::ReadOnly)) { - data = file.readAll(); - } - QString out; - if (encoding != "binary") { - QTextCodec *codec = QTextCodec::codecForName(encoding.toAscii()); - if (codec) { - out = codec->toUnicode(data); - } - } - if (out.length() == 0 && data.length() > 0) { - out = QString(data.length(), 0); - for (int i = 0; i < data.length(); ++i) { - out[i] = data[i]; - } - } - return out; -} -QString -NativeIO::read(const QString& path, int offset, int length) { - errstr = QString(); - QFile file(cwd.absoluteFilePath(path)); - QByteArray data; - if (file.open(QIODevice::ReadOnly) && (offset == 0 || file.seek(offset))) { - int lastLength = 0; - do { - lastLength = data.length(); - data += file.read(length - data.length()); - } while (data.length() < length && data.length() != lastLength); - } - if (length != data.length()) { - errstr = "Not enough data: " + QString::number(length) + - " instead of " + QString::number(data.length()); - return QString(); - } - QString out(length, 0); - for (int i = 0; i < length; ++i) { - out[i] = data[i]; - } - return out; -} -void -NativeIO::writeFile(const QString& path, const QString& data) { - QFile file(cwd.absoluteFilePath(path)); - errstr = QString(); - if (!file.open(QIODevice::WriteOnly)) { - errstr = "Could not open file for writing."; - return; - } - int length = data.length(); - QByteArray out(length, 0); - for (int i = 0; i < length; ++i) { - out[i] = data[i].unicode(); - } - if (file.write(out) != out.length()) { - errstr = "Could not write to file."; - } - return; -} -void -NativeIO::unlink(const QString& path) { - errstr = QString(); - QFile file(cwd.absoluteFilePath(path)); - if (!file.remove()) { - errstr = "Could not delete file"; - } -} -int -NativeIO::getFileSize(const QString& path) { - errstr = QString(); - QFile file(cwd.absoluteFilePath(path)); - if (!file.exists()) { - errstr = "Could not determine file size."; - } - return file.size(); -} -void -NativeIO::exit(int exitcode) { - qApp->exit(exitcode); -} -QString -NativeIO::currentDirectory() const { - return QDir::currentPath(); -} -QStringList -NativeIO::libraryPaths() const { - QStringList paths; - paths << runtimedir.absolutePath() << cwd.absolutePath(); - return paths; -} diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h deleted file mode 100644 index b699744226..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef NATIVEIO_H -#define NATIVEIO_H - -#include -#include -#include - -class QWebPage; - -// class that exposes filesystem to web environment -class NativeIO : public QObject { -Q_OBJECT -private: - QWebPage* webpage; - QString errstr; - const QDir runtimedir; - const QDir cwd; - const QMap pathPermissions; -public: - typedef QMap PathMap; - PathMap v; - NativeIO(QObject* parent, const QDir& runtimedir, const QDir& cwd, - const PathMap& pathPermissions = PathMap()); -public slots: - /** - * Return the last error. - */ - QString error() { - return errstr; - } - QString readFileSync(const QString& path, const QString& encoding); - QString read(const QString& path, int offset, int length); - void writeFile(const QString& path, const QString& data); - void unlink(const QString& path); - int getFileSize(const QString& path); - void exit(int exitcode); - QString currentDirectory() const; - QStringList libraryPaths() const; -}; - -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp deleted file mode 100644 index a91794d9a2..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp +++ /dev/null @@ -1,191 +0,0 @@ -#include "pagerunner.h" - -#include "nam.h" -#include "nativeio.h" -#include -#include -#include -#include -#include -#include -#include -#include - -QByteArray getRuntimeBindings() { - return - "if (typeof(runtime) !== 'undefined') {" - " runtime.readFileSync = function (path, encoding) {" - " return nativeio.readFileSync(path, encoding);" - " };" - " runtime.read = function (path, offset, length, callback) {" - " var data = nativeio.read(path, offset, length);" - " data = runtime.byteArrayFromString(data, 'binary');" - " callback(nativeio.error()||null, data);" - " };" - " runtime.writeFile = function (path, data, callback) {" - " data = runtime.byteArrayToString(data, 'binary');" - " nativeio.writeFile(path, data);" - " callback(nativeio.error()||null);" - " };" - " runtime.deleteFile = function (path, callback) {" - " nativeio.unlink(path);" - " callback(nativeio.error()||null);" - " };" - " runtime.getFileSize = function (path, callback) {" - " callback(nativeio.getFileSize(path));" - " };" - " runtime.exit = function (exitCode) {" - " nativeio.exit(exitCode);" - " };" - " runtime.currentDirectory = function () {" - " return nativeio.currentDirectory();" - " };" - "}"; -} - -PageRunner::PageRunner(const QStringList& args) - : QWebPage(0), - out(stdout), - err(stderr), - view(new QWidget()) { - - QMap settings = parseArguments(args); - QStringList arguments = args.mid(settings.size() * 2); - exportpdf = settings.value("export-pdf"); - exportpng = settings.value("export-png"); - url = QUrl(arguments[0]); - nativeio = new NativeIO(this, QFileInfo(arguments[0]).dir(), - QDir::current()); - if (url.scheme() == "file" || url.isRelative()) { - QFileInfo info(url.toLocalFile()); - if (!info.isReadable() || !info.isFile()) { - QTextStream err(stderr); - err << "Cannot read file '" + url.toString() + "'.\n"; - qApp->exit(1); - } - } - nam = new NAM(this, QUrl(url).host(), QUrl(url).port()); - - setNetworkAccessManager(nam); - connect(this, SIGNAL(loadFinished(bool)), this, SLOT(finished(bool))); - connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), - this, SLOT(slotInitWindowObjects())); - sawJSError = false; - - setView(view); - scriptMode = arguments[0].endsWith(".js"); - if (scriptMode) { - QByteArray html = "'" + arguments[0].toUtf8().replace('\'', "\\'") - + "'"; - for (int i = 1; i < arguments.length(); ++i) { - html += ",'" + arguments[i].toUtf8().replace('\'', "\\'") + "'"; - } - html = "" - "" - "" - ""; - if (arguments[0].endsWith("runtime.js")) { - // add runtime modification - html += ""; - } - html += "\n"; - QTemporaryFile tmp("XXXXXX.html"); - tmp.setAutoRemove(true); - tmp.open(); - tmp.write(html); - tmp.close(); - mainFrame()->load(tmp.fileName()); - } else { - // Make the url absolute. If it is not done here, QWebFrame will do - // it, and it will lose the query and fragment part. - QUrl absurl; - if (url.isRelative()) { - absurl = QUrl::fromLocalFile(QFileInfo(url.toLocalFile()).absoluteFilePath()); - absurl.setQueryItems(url.queryItems()); - absurl.setFragment(url.fragment()); - } else { - absurl = url; - } - mainFrame()->load(absurl); - } -} -PageRunner::~PageRunner() { - delete view; -} -void PageRunner::finished(bool ok) { - // bind nativeio - if (!ok) { - qApp->exit(1); - } - if (!scriptMode) { - mainFrame()->evaluateJavaScript(getRuntimeBindings()); - } - - // connect signals - connect(this, SIGNAL(contentsChanged()), this, SLOT(noteChange())); - connect(this, SIGNAL(downloadRequested(QNetworkRequest)), - this, SLOT(noteChange())); - connect(this, SIGNAL(repaintRequested(QRect)), - this, SLOT(noteChange())); - connect(mainFrame(), SIGNAL(pageChanged()), this, SLOT(noteChange())); - connect(this, SIGNAL(geometryChangeRequested(QRect)), - this, SLOT(noteChange())); - QTimer::singleShot(150, this, SLOT(reallyFinished())); - changed = false; - time.start(); -} -void PageRunner::reallyFinished() { - int latency = time.restart(); - // err << latency << " " << changed << " " << nam->hasOutstandingRequests() << endl; - if (changed || latency >= 152 || nam->hasOutstandingRequests()) { - QTimer::singleShot(150, this, SLOT(reallyFinished())); - changed = false; - return; - } - if (!exportpdf.isEmpty() || !exportpng.isEmpty()) { - setViewportSize(mainFrame()->contentsSize()); - } - if (!exportpng.isEmpty()) { - renderToFile(exportpng); - } - if (!exportpdf.isEmpty()) { - printToFile(exportpdf); - } - qApp->exit(sawJSError); -} -QMap PageRunner::parseArguments(const QStringList& args) { - int i = 0; - QMap settings; - while (i + 2 < args.length()) { - if (args[i].startsWith("--")) { - settings[args[i].mid(2)] = args[i+1]; - } - i += 2; - } - return settings; -} -void PageRunner::slotInitWindowObjects() { - mainFrame()->addToJavaScriptWindowObject("nativeio", nativeio); -} -void PageRunner::renderToFile(const QString& filename) { - QImage pixmap(mainFrame()->contentsSize().boundedTo(QSize(10000,10000)), - QImage::Format_ARGB32_Premultiplied); - QPainter painter(&pixmap); - mainFrame()->render(&painter, QWebFrame::ContentsLayer); - painter.end(); - pixmap.save(filename); -} -void PageRunner::printToFile(const QString& filename) { - QPrinter printer(QPrinter::HighResolution); - printer.setFontEmbeddingEnabled(true); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOutputFileName(filename); - mainFrame()->print(&printer); -} diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h deleted file mode 100644 index 9c848acc10..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef PAGERUNNER_H -#define PAGERUNNER_H - -#include -#include -#include - -class NAM; -class NativeIO; - -class PageRunner : public QWebPage { -Q_OBJECT -private: - QUrl url; - NAM* nam; - QTextStream out; - QTextStream err; - bool changed; - QWidget* const view; - QTime time; - bool scriptMode; - NativeIO* nativeio; - QString exportpdf; - QString exportpng; - bool sawJSError; -public: - PageRunner(const QStringList& args); - ~PageRunner(); -private slots: - void finished(bool ok); - void noteChange() { - changed = true; - } - void reallyFinished(); - void slotInitWindowObjects(); - bool shouldInterruptJavaScript() { - changed = true; - return false; - } -private: - void javaScriptConsoleMessage(const QString& message, int lineNumber, - const QString& sourceID) { - changed = true; - if (scriptMode) { - err << message << endl; - } else { - err << sourceID << ":" << lineNumber << " " << message << endl; - } - sawJSError = true; - } - void javaScriptAlert(QWebFrame* /*frame*/, const QString& msg) { - changed = true; - err << "ALERT: " << msg << endl; - } - bool javaScriptPrompt(QWebFrame*, const QString&, const QString&, QString*){ - changed = true; - return false; - } - void renderToFile(const QString& filename); - void printToFile(const QString& filename); - // overload because default impl was causing a crash - QString userAgentForUrl(const QUrl&) const { - return QString(); - } - QMap parseArguments(const QStringList& args); -}; - -#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp deleted file mode 100644 index 35d04da146..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Small executable that loads a javascript or html page from local a URI. - * If the URI ends in .js it will be run in QtScript engine, otherwise, it will - * be assumed to be a webpage that will be opened in - */ -#include "pagerunner.h" -#include -int -main(int argc, char** argv) { - if (argc < 2) { - QTextStream err(stderr); - err << "Usage: " << argv[0] << " [--export-pdf pdffile] " - "[--export-png pngfile] html/javascripfile [arguments]\n"; - return 1; - } - QApplication app(argc, argv); - app.setApplicationName(argv[0]); - PageRunner p(QCoreApplication::arguments().mid(1)); - return app.exec(); -} diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt deleted file mode 100644 index 0a18076273..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} ${HTML5UIFILES}) -COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} index.html scripts.js welcome.odt) -COPY_FILES(TOUCHUIDEPS ${CMAKE_SOURCE_DIR}/webodf - ${CMAKE_CURRENT_BINARY_DIR} webodf.css ${LIBJSFILES}) -add_custom_target(touchuiDepencencies ALL DEPENDS ${TOUCHUIDEPS}) diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png deleted file mode 100644 index 6041c6ff93..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png deleted file mode 100644 index 733a4e1ada..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js deleted file mode 100644 index 60da480a5f..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js +++ /dev/null @@ -1,40 +0,0 @@ -/*global Ext, invokeString, document*/ -/** - * When the application has been initialized, this function is called, if - * it has been set. By default, it will start scanning the files in the - * files sytem. It can be overridden by e.g. PhoneGap to wait until the device - * is ready. - */ -var onApplicationLaunch = function (app) { - "use strict"; - app.startScanningDirectories(); -}; -Ext.application({ - name : 'WebODFApp', - models: ['FileSystem'], - views: ['Viewport', 'FilesList', 'FileDetail', 'OdfView'], - controllers: ['Files'], - stores: ['FileStore'], - launch: function () { - 'use strict'; - var app = this; - Ext.create('WebODFApp.view.Viewport'); - app.openUrl = function (url) { - var proxy = Ext.getStore("FileStore").getProxy(); - proxy.getRecord(url, function (record) { - var controller; - if (!record) { - alert("Cannot open " + url); - } else { - controller = app.getController('Files'); - controller.show(null, null, null, record); - } - }); - }; - this.startScanningDirectories = function () { - var proxy = Ext.getStore("FileStore").getProxy(); - proxy.startScanningDirectories(); - }; - onApplicationLaunch(this); - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js deleted file mode 100644 index 22e06f85b6..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js +++ /dev/null @@ -1,82 +0,0 @@ -/*global Ext, runtime*/ -Ext.define('WebODFApp.controller.Files', { - extend: 'Ext.app.Controller', - - config: { - refs: { - mainView: 'mainview', - filesList: 'fileslist list', - fileDetail: 'filedetail', - openButton: '#openButton', - odfView: 'odfview', - title: 'titlebar' - }, - control: { - mainView: { - pop: 'pop', - push: 'push', - back: 'back' - }, - filesList: { - itemtap: 'show' - }, - openButton: { - tap: 'open' - } - } - }, - back: function () { - "use strict"; - this.odfView.hideCanvas(); - }, - push: function (view, item) { - "use strict"; - if (item.xtype === "filedetail") { - this.getOpenButton().show(); - } else { - this.getOpenButton().hide(); - } - }, - pop: function (view, item) { - "use strict"; - if (item.xtype === "odfview") { // going to filedetail - this.getOpenButton().show(); - } else { - this.getOpenButton().hide(); - } - this.getFilesList().deselectAll(); - }, - show: function (list, index, target, record, e) { - "use strict"; - // set the record in the details view and the file view - // this way, document starts loading in the background - var c = this; - if (!this.fileDetail) { - this.fileDetail = Ext.create('WebODFApp.view.FileDetail'); - } - if (!this.odfView) { - this.odfView = Ext.create('WebODFApp.view.OdfView'); - this.odfView.addCanvasListener(this.fileDetail.canvasListener); - } - this.odfView.hideCanvas(); - this.fileDetail.odfView = this.odfView; - this.fileDetail.setRecord(record); - this.getMainView().push(this.fileDetail); - runtime.setTimeout(function () { - c.odfView.setRecord(record); - }, 300); - }, - open: function (options) { - "use strict"; - var c = this; - if (!this.odfView) { - this.odfView = Ext.create('WebODFApp.view.OdfView'); - } - this.odfView.hideCanvas(); - this.odfView.setRecord(this.fileDetail.getRecord()); - this.getMainView().push(this.odfView); - runtime.setTimeout(function () { - c.odfView.showCanvas(); - }, 300); - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js deleted file mode 100644 index 3346008f1a..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js +++ /dev/null @@ -1,265 +0,0 @@ -/*global Ext, console, app, window, LocalFileSystem, JSON, FileReader, runtime*/ -Ext.define("WebODFApp.model.FileSystemProxy", (function () { - "use strict"; - var self = this, - scanner; - function Scanner(proxy) { - var todo = [], - done = false, - fileSystems, - files, - cachedList = [], - dirs = {}, - lastUpdate = 0, - lastUpdateTime = new Date(); - - function getFileId(fullPath) { - var i; - if (!files) { - return -1; - } - for (i = 0; i < files.length; i += 1) { - if (files[i].get('fullPath') === fullPath) { - return i; - } - } - return -1; - } - this.getFileId = getFileId; - function addFileEntry(entry, callback) { - function fail() { - callback(-1); - } - var id = getFileId(entry.fullPath); - if (id !== -1) { - return callback(id); - } - entry.file(function (file) { - var id = files.length; - files.push(Ext.create('WebODFApp.model.FileSystem', { - id: id, - fileName: entry.name, - fullPath: entry.fullPath, - size: file.size - })); - callback(id); - }, fail); - } - function parseCachedFileList(pos, callback) { - if (pos === cachedList.length) { - return callback(); - } - window.resolveLocalFileSystemURI(cachedList[pos], function (entry) { - addFileEntry(entry, function () { - parseCachedFileList(pos + 1, callback); - }); - }, function () { - parseCachedFileList(pos + 1, callback); - }); - } - function readCachedFileList(callback) { - window.resolveLocalFileSystemURI("cachedODFList.json", - function (fileentry) { - var reader = new FileReader(); - reader.onloadend = function (evt) { - cachedList = []; - try { - cachedList = JSON.parse(evt.target.result); - } catch (e) { - alert(e); - } - parseCachedFileList(0, callback); - }; - reader.readAsText(fileentry); - }, function () { - callback(); - }); - } - function writeCachedFileList() { - var i, - l = files.length; - cachedList.length = files.length; - for (i = 0; i < l; i += 1) { - cachedList[i] = files[i].get('fullPath'); - } - window.resolveLocalFileSystemURI("cachedODFList.json", - function (fileentry) { - fileentry.createWriter(function (writer) { - writer.write(JSON.stringify(cachedList)); - }, function (e) { - runtime.log(JSON.stringify(e)); - }); - }, function (e) { - runtime.log(JSON.stringify(e)); - }); - } - function filter(name) { - var suffix = name.substr(name.length - 4); - return suffix === ".odt" || suffix === ".odp" || suffix === ".ods"; - } - function errorCallback(err) { - console.log("FILE READ ERROR " + err + " " + todo.length); - done = true; - } - function load(entry, callback) { - function fail() { - callback(-1); - } - if (entry.isDirectory) { - entry.createReader().readEntries(function (entries) { - var i = 0; - for (i = 0; i < entries.length; i += 1) { - entry = entries[i]; - if (entry.isDirectory - && !dirs.hasOwnProperty(entry.fullPath)) { - todo.push(entry); - dirs[entry.fullPath] = entry; - } else if (filter(entry.name)) { - todo.push(entry); - } - } - callback(-1); - }, fail); - } else if (entry.isFile) { - addFileEntry(entry, callback); - } else { - fail(); - } - } - function addFileSystem(fileSystem) { - var dir = fileSystems[fileSystem.name] = {}; - todo.push(fileSystem.root); - function callback() { - var now = new Date(), - // a limit is needed, otherwise the # of files too large to - // be handled by sencha touch - done = todo.length === 0 || files.length > 2000, - store = Ext.getStore('FileStore'); - if (done || lastUpdate === 0 || (files.length - lastUpdate > 0 - && now - lastUpdateTime > files.length * 100)) { - store.load(); - lastUpdate = files.length; - lastUpdateTime = now; - } - if (done) { - writeCachedFileList(); - } else { - load(todo.shift(), callback); - } - } - load(todo.shift(), callback); - } - function addFileSystems() { - window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, - addFileSystem, errorCallback); - window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, - addFileSystem, function () {}); - } - this.scan = function () { - if (fileSystems !== undefined) { - return; - } - fileSystems = {}; - readCachedFileList(function () { - addFileSystems(); - }); - }; - this.load = load; - this.files = files = []; - } - function finishOperation(proxy, operation, callback, scope) { - if (operation) { - var i = 0, - recs = operation.getRecords(), - len = recs.length; - - for (i; i < len; i += 1) { - recs[i].commit(); - } - operation.setSuccessful(); - - Ext.callback(callback, scope || proxy, [operation]); - } - } - return { - extend: "Ext.data.proxy.Proxy", - xtype: 'filesystemproxy', - constructor: function (config) { - this.initConfig(config); - scanner = new Scanner(this); - this.startScanningDirectories = function () { - scanner.scan(); - }; - this.getRecord = function (url, callback) { - var id = scanner.getFileId(url); - if (id !== -1) { - return callback(scanner.files[id]); - } - window.resolveLocalFileSystemURI(url, - function (fileentry) { - scanner.load(fileentry, function (id) { - Ext.getStore('FileStore').load(); - callback(scanner.files[id]); - }); - }, - function (evt) { - callback(null); - }); - }; - }, - - create: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - }, - - read: function (operation, callback, scope) { - var me = this, - records = scanner.files; - if (!records) { - return; - } - // return model instances in a resultset - operation.setResultSet(new Ext.data.ResultSet({ - //total: records.length, - count: records.length, - records: records, - success: true - })); - - // announce success - operation.setSuccessful(); - operation.setCompleted(); - - // finish with callback - Ext.callback(callback, scope || me, [operation]); - }, - - update: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - }, - - destroy: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - } - }; -}())); - -Ext.define("WebODFApp.model.FileSystem", { - extend: 'Ext.data.Model', - config: { - idProperty: 'id', - fields: [ { - name: "id", - type: "auto" - }, { - name: "fullPath", - type: "string" - }, { - name: "fileName", - type: "string" - }, { - name: "size", - type: "int" - } ] - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js deleted file mode 100644 index d2932c8989..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js +++ /dev/null @@ -1,30 +0,0 @@ -/*global Ext*/ -Ext.define('WebODFApp.store.FileStore', { - extend: 'Ext.data.Store', - config: { - storeId: 'FileStore', - model: 'WebODFApp.model.FileSystem', - autoLoad: true, - grouper: { - groupFn: function (record) { - "use strict"; - return record.get('fileName')[0].toUpperCase(); - } - }, - proxy: { - xtype: 'filesystemproxy' - }, - sorters: function (a, b) { - "use strict"; - a = a.get('fileName').toUpperCase(); - b = b.get('fileName').toUpperCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js deleted file mode 100644 index b79876c6de..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js +++ /dev/null @@ -1,122 +0,0 @@ -/*global Ext, app, runtime, xmldom, odf*/ -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); -Ext.define('WebODFApp.view.FileDetail', (function () { - "use strict"; - var panel, - style2CSS = new odf.Style2CSS(), - xpath = new xmldom.XPath(), - fileDetail, - title, - image, - list, - emptyImageUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAAXNSR0IArs4c6QAAAAtJREFUCB1jYGAAAAADAAFPSAqvAAAAAElFTkSuQmCC"; - function getTitle(body) { - var ps, - title; - ps = xpath.getODFElementsWithXPath(body, - ".//text:h", style2CSS.namespaceResolver); - title = ""; - if (ps && ps.length) { - title = ps[0].nodeValue; - } else { - ps = xpath.getODFElementsWithXPath(body, - ".//text:p", style2CSS.namespaceResolver); - if (ps && ps.length) { - title = ps[0].nodeValue; - } - } - return title; - } - function metaToJSON(body, meta) { - var json = [], - title = body && getTitle(body), - e = meta && meta.firstChild, - name; - if (title) { - json.push({name: "title", value: title}); - } - while (e) { - if (e.nodeType === 1 && e.textContent) { - if (e.localName === "user-defined") { - name = e.getAttributeNS( - "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", - "name" - ); - } else { - name = e.localName; - } - json.push({ - name: name, - value: e.textContent - }); - } - e = e.nextSibling; - } - return json; - } - return { - extend: 'Ext.Panel', - xtype: 'filedetail', - config: { - title: 'File details', - layout: 'vbox', - items: [{ - id: "title", - dock: 'top', - xtype: 'toolbar' - }, { - id: 'details', - xtype: 'container', - layout: 'hbox', - flex: 1, - items: [{ - id: 'thumbnail', - xtype: 'image', - width: 256, - maxWidth: "50%" - }, { - id: 'metalist', - xtype: 'list', - store: { - fields: ["name", "value"], - data: [] - }, - itemTpl: "{name}: {value}", - flex: 1 - }] - }], - listeners: { - initialize: function () { - fileDetail = this.query("#details")[0]; - title = this.query("#title")[0]; - image = fileDetail.query('#thumbnail')[0]; - list = fileDetail.query('#metalist')[0]; - } - } - }, - updateRecord: function (record) { - if (record) { - fileDetail.setMasked({ - xtype: 'loadmask', - message: 'Loading...' - }); - title.setTitle(record.get('fileName')); - } - }, - canvasListener: function (odfcanvas) { - var view = this, - odfcontainer = odfcanvas.odfContainer(), - part = odfcontainer.getPart("Thumbnails/thumbnail.png"), - metajson = []; - metajson = metaToJSON(odfcontainer.rootElement.body, - odfcontainer.rootElement.meta); - part.onstatereadychange = function (part) { - image.setSrc(part.url || emptyImageUrl); - }; - part.load(); - list.getStore().setData(metajson); - fileDetail.unmask(); - } - }; -}())); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js deleted file mode 100644 index 1a82a2e8b6..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js +++ /dev/null @@ -1,47 +0,0 @@ -/*global Ext, app, filestore */ -Ext.define("WebODFApp.view.FilesList", { - extend: "Ext.Panel", - xtype: 'fileslist', - config: { - layout: 'fit', - items: [{ - xtype: 'list', - store: 'FileStore', -/* - store: { - fields: ['fileName', 'fullPath'], - grouper: { - groupFn: function (record) { - "use strict"; - return record.get('fileName')[0].toUpperCase(); - } - }, - data: [ - {fileName: 'Cowper', fullPath: '-'}, - {fileName: 'Everett', fullPath: '-'}, - {fileName: 'University', fullPath: '-'}, - {fileName: 'Forest', fullPath: '-'} - ] - }, -*/ -/* - listeners: { - 'itemtap': function (view, number, item) { - "use strict"; - var record = view.getStore().getAt(number); - if (record) { - Ext.app.dispatch({ - controller: 'Files', //app.controllers.files, - action: 'show', - id: record.getId() - }); - } - } - }, -*/ - itemTpl: '{fileName}
    {fullPath}', - grouped: true, - indexBar: true - }] - } -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js deleted file mode 100644 index 2098304d32..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js +++ /dev/null @@ -1,170 +0,0 @@ -/*global Ext, runtime, core, odf, window, FileReader, PhoneGap, gui*/ -runtime.loadClass('odf.OdfCanvas'); - -Ext.define('WebODFApp.view.OdfView', (function () { - "use strict"; - var currentPath, - overridePath, - overridePathPrefix = "odf:", - data, - globalreadfunction, - globalfilesizefunction, - odfcanvas, - zoom = 1, - dom, - canvasListeners = [], - view; - function signalCanvasChange() { - var i; - for (i = 0; i < canvasListeners.length; i += 1) { - canvasListeners[i](odfcanvas); - } - } - function initCanvas() { - var cmp; - if (globalreadfunction === undefined) { - // overload the global read function with one that only reads - // the data from this canvas - globalreadfunction = runtime.read; - globalfilesizefunction = runtime.getFileSize; - runtime.read = function (path, offset, length, callback) { - if (path !== overridePath) { - globalreadfunction.apply(runtime, - [path, offset, length, callback]); - } else { - callback(null, data.slice(offset, offset + length)); - } - }; - runtime.getFileSize = function (path, callback) { - if (path !== overridePath) { - globalfilesizefunction.apply(runtime, [path, callback]); - } else { - callback(data.length); - } - }; - dom = Ext.getCmp('webodf').element.dom; - odfcanvas = new odf.OdfCanvas(dom); - odfcanvas.addListener("statereadychange", signalCanvasChange); - } - } - function load(path) { - if (path === currentPath) { - return; - } - currentPath = path; - overridePath = overridePathPrefix + path; - data = null; - window.resolveLocalFileSystemURI("file://" + path, function (file) { - var reader = new FileReader(); - // so far phonegap is very limited, ideally it would implement - // readAsArrayBuffer and slice() on the File object - // right now, it has a dummy function, hence breaking simple - // detection of which features are implemented - if (reader.readAsArrayBuffer - && (typeof PhoneGap === "undefined")) { - reader.onloadend = function (evt) { - data = evt.target.result; - odfcanvas.load(overridePath); - }; - reader.readAsArrayBuffer(file); - } else { - reader.onloadend = function (evt) { - var b = new core.Base64(); - data = evt.target.result; - data = data.substr(data.indexOf(",") + 1); - data = b.convertBase64ToUTF8Array(data); - odfcanvas.load(overridePath); - }; - reader.readAsDataURL(file); - } - }, function () { - runtime.log("COULD NOT RESOLVE " + path); - }); - } - function tapHandler(button) { - var id = button.getId(), - dom = Ext.getCmp('odfcontainer').element.dom, - width = dom.offsetWidth, - height = dom.offsetHeight; - if (id === 'zoomin') { - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 1.25); - } else if (id === 'zoomout') { - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 0.8); - } else if (id === 'fit-best') { - odfcanvas.fitToContainingElement(width, height); - } else if (id === 'fit-width') { - odfcanvas.fitToWidth(width); - } else if (id === 'fit-height') { - odfcanvas.fitToHeight(height); - } else if (id === 'next') { - odfcanvas.showNextPage(); - } else if (id === 'previous') { - odfcanvas.showPreviousPage(); - } - } - return { - extend: 'Ext.Container', - xtype: 'odfview', - id: 'odfcontainer', - config: { - scrollable: 'both', - items: [{ - id: 'webodf' - }, { - xtype : 'toolbar', - docked: 'bottom', - scrollable: false, - defaults: { - iconMask: false, - ui : 'plain', - handler: tapHandler - }, - items: [ - { id: 'previous', icon: 'go-previous.png'}, - { id: 'next', icon: 'go-next.png' }, - { id: 'zoomin', icon: 'ZoomIn.png'}, - { id: 'zoomout', icon: 'ZoomOut.png' }, - { id: 'fit-best', icon: 'zoom-fit-best.png' }, - { id: 'fit-height', icon: 'zoom-fit-height.png' }, - { id: 'fit-width', icon: 'zoom-fit-width.png' } - ], - layout: { - pack : 'center', - align: 'center' - } - }], - listeners: { - painted: function () { - // make sure the viewport is the right size - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); - } - } - }, - updateRecord: function (record) { - view = this; - initCanvas(); - load(record.get('fullPath')); - }, - addCanvasListener: function (listener) { - canvasListeners.push(listener); - }, - hideCanvas: function () { - if (dom) { - dom.style.display = "none"; - } - if (view) { - view.setMasked({ - xtype: 'loadmask', - message: 'Loading...' - }); - } - }, - showCanvas: function () { - if (view) { - view.unmask(); - } - dom.style.display = "inline-block"; - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); - } - }; -}())); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js deleted file mode 100644 index 3023ddc017..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js +++ /dev/null @@ -1,54 +0,0 @@ -/*global Ext, app*/ -Ext.define("WebODFApp.view.Viewport", { - extend: "Ext.navigation.View", - xtype: "mainview", - requires: [ - "WebODFApp.view.FilesList", - "WebODFApp.view.FileDetail" - ], - config: { - fullscreen: true, - autoDestroy: false, - navigationBar: { - items: [{ - xtype: 'button', - id: 'openButton', - text: 'Open', - align: 'right', - hidden: true - }] - }, - items: [ - { title: 'Files', xtype: 'fileslist' } - ] - } -/* - initComponent: function () { - - //put instances of cards into app.views namespace - Ext.apply(app.views, { - filesList: new app.views.FilesList(), - fileDetail: new app.views.FileDetail(), - odfView: new app.views.OdfView() - }); - //put instances of cards into viewport - Ext.apply(this, { - items: [ - app.views.filesList, - app.views.fileDetail, - app.views.odfView - ] - }); - app.views.Viewport.superclass.initComponent.apply(this, arguments); - }, - listeners: { - afterlayout: function () { - if (app.stores.filesystem.initialUrl) { - app.openUrl(app.stores.filesystem.initialUrl); - app.stores.filesystem.initialUrl = undefined; - } - } - } - }; -*/ -}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png b/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png deleted file mode 100644 index c4da8a9a3d..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png b/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png deleted file mode 100644 index 68ed8a13eb..0000000000 Binary files a/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/index.html b/apps/files_odfviewer/src/webodf/programs/touchui/index.html deleted file mode 100644 index 49b8a31f44..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - WebODF - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js b/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js deleted file mode 100644 index 2683bc83b4..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js +++ /dev/null @@ -1,130 +0,0 @@ -/*global alert, app, window, runtime*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileWriter(fullPath) { - "use strict"; - this.write = function (data) { - data = runtime.byteArrayFromString(data, "utf8"); - runtime.writeFile(fullPath, data, function () {}); - }; -} -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath); - try { - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; - this.createWriter = function (onsuccess, onerror) { - onsuccess(new FileWriter(fullPath)); - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsArrayBuffer = function (file) { - var path = file.fullPath; - if (path.substr(0, 7) === "file://") { - path = path.substr(7); - } - runtime.readFile(path, 'binary', function (error, data) { - fr.onloadend({target: {result: data}}); - }); - }; - this.readAsText = function (file) { - var path = file.fullPath; - if (path.substr(0, 7) === "file://") { - path = path.substr(7); - } - runtime.readFile(path, 'utf8', function (error, data) { - fr.onloadend({target: {result: data}}); - }); - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = []; - entries[entries.length] = new FileEntry("welcome.odt", - "welcome.odt"); - entries[entries.length] = new FileEntry("Traktatenblad.odt", - "Traktatenblad.odt"); - entries[entries.length] = new FileEntry("DanskTest01.odt", - "DanskTest01.odt"); - entries[entries.length] = new FileEntry("plugfest-gouda.odp", - "plugfest-gouda.odp"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2.odt", - "OpenDocument-v1.2.odt"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2-part1.odt", - "OpenDocument-v1.2-part1.odt"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2-part2.odt", - "OpenDocument-v1.2-part2.odt"); - try { - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name = (p === -1) ? path : path.substr(p + 1); - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder, path; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - path = ""; - onsuccess({ - name: "root", - root: new DirectoryEntry("root", path) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; -/* - * override launch function to quickly open a file for testing -onApplicationLaunch = function (app) { - "use strict"; - app.openUrl("plugfest-gouda.odp"); -}; -*/ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css deleted file mode 100644 index 7227e268be..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css +++ /dev/null @@ -1 +0,0 @@ -body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;position:relative;-webkit-text-size-adjust:none}body.x-desktop{overflow:hidden}*,*:after,*:before{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);-webkit-user-select:none;-webkit-touch-callout:none;-webkit-user-drag:none}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-ios{-webkit-backface-visibility:hidden}body.x-android.x-phone{font-size:116%}body.x-android.x-phone.x-silk{font-size:130%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}input,textarea{-webkit-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-fullscreen{position:absolute !important}.x-desktop .x-body-stretcher{margin-bottom:0px}.x-mask{position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;background:rgba(0, 0, 0, 0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0, 0, 0, 0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{background:rgba(0, 0, 0, 0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold;-webkit-border-radius:0.5em;border-radius:0.5em}.x-mask .x-loading-spinner-outer{display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;width:100%;min-width:8.5em;height:8.5em}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask .x-mask-message{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-flex:0 !important;max-width:13em;min-width:8.5em}.x-draggable{z-index:1}.x-dragging{opacity:0.7}.x-panel-list{background-color:#bacfe8}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#333333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{display:inline;float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{display:inline;float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#0066cc}.x-html a:visited{color:#004c99}.x-html a:focus{color:#0099ff}.x-html a:hover{color:#0099ff}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono", "lucida console", monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eeeeee}.x-html .quiet{color:#666666}.x-html .loud{color:#111111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}.x-video{background-color:#000}.x-sortable .x-dragging{opacity:1;z-index:5}.x-layout-card-item{background:#eeeeee}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-img{background-repeat:no-repeat}.x-video{height:100%;width:100%}.x-video > *{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:black url() center center no-repeat}audio{width:100%}.x-panel,.x-msgbox,.x-panel-body{position:relative}.x-panel.x-floating,.x-msgbox.x-floating,.x-form.x-floating{padding:6px;-webkit-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0, 0, 0, 0.8) 0 0.2em 0.6em;background-color:black;background-image:none}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating.x-floating-light,.x-form.x-floating.x-floating-light{background-color:#354f6e;background-image:none}.x-panel.x-floating > .x-panel-inner,.x-panel.x-floating .x-scroll-view,.x-panel.x-floating .x-body,.x-msgbox.x-floating > .x-panel-inner,.x-msgbox.x-floating .x-scroll-view,.x-msgbox.x-floating .x-body,.x-form.x-floating > .x-panel-inner,.x-form.x-floating .x-scroll-view,.x-form.x-floating .x-body{background-color:#fff;-webkit-border-radius:0.3em;border-radius:0.3em}.x-anchor{width:1.631em;height:0.7em;position:absolute;left:0;top:0;z-index:1;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;overflow:hidden;background-color:black;-webkit-transform-origin:0% 0%}.x-anchor.x-anchor-top{margin-left:-0.816em;margin-top:-0.7em}.x-anchor.x-anchor-bottom{-webkit-transform:rotate(180deg);margin-left:0.816em;margin-top:0.6em}.x-anchor.x-anchor-left{-webkit-transform:rotate(270deg);margin-left:-0.7em;margin-top:-0.1em}.x-anchor.x-anchor-right{-webkit-transform:rotate(90deg);margin-left:0.7em;margin-top:0}.x-floating.x-panel-light:after{background-color:#354f6e}.x-button{-webkit-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.4em;border-radius:0.4em;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;min-height:1.8em !important;padding:.3em .6em;position:relative;overflow:hidden;-webkit-user-select:none}.x-button,.x-toolbar .x-button{border:1px solid #999999;border-top-color:#a6a6a6;color:black}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-color:#ccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #dedede), color-stop(100%, #bababa));background-image:-webkit-linear-gradient(#ffffff,#dedede 2%,#bababa);background-image:linear-gradient(#ffffff,#dedede 2%,#bababa)}.x-button .x-button-icon.x-icon-mask,.x-toolbar .x-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-color:#c4c4c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ababab), color-stop(10%, #b8b8b8), color-stop(65%, #c4c4c4), color-stop(100%, #c6c6c6));background-image:-webkit-linear-gradient(#ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:linear-gradient(#ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:2.1em;height:2.1em;background-repeat:no-repeat;background-position:center;display:block}.x-button .x-button-icon.x-icon-mask{width:1.3em;height:1.3em;-webkit-mask-size:1.3em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-hasbadge .x-badge,.x-hasbadge .x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round,.x-button.x-button-action-round,.x-button.x-button-confirm-round,.x-button.x-button-decline-round{-webkit-border-radius:0.9em;border-radius:0.9em;padding:0.1em 0.9em}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;box-orient:horizontal}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;box-direction:reverse}.x-iconalign-center{-webkit-box-pack:center;box-pack:center}.x-iconalign-left .x-button-label,.x-iconalign-left .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-left .x-badge{margin-left:0.3em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-right .x-badge{margin-right:0.3em}.x-iconalign-top .x-button-label,.x-iconalign-top .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-top .x-badge{margin-top:0.3em}.x-iconalign-bottom .x-button-label,.x-iconalign-bottom .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-bottom .x-badge{margin-bottom:0.3em}.x-button-label,.x-hasbadge .x-badge{-webkit-box-flex:1;box-flex:1;-webkit-box-align:center;box-align:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;font-weight:bold;line-height:1.2em;display:block;overflow:hidden}.x-toolbar .x-button{margin:0 .2em;padding:.3em .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge{font-size:.7em}.x-button-small,.x-button.x-button-action-small,.x-button.x-button-confirm-small,.x-button.x-button-decline-small,.x-toolbar .x-button-small,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-decline-small{-webkit-border-radius:0.3em;border-radius:0.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button.x-button-action-small .x-button-label,.x-button.x-button-confirm-small .x-button-label,.x-button.x-button-decline-small .x-button-label,.x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-button-small .x-badge,.x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button.x-button-action-small .x-button-label,.x-toolbar .x-button.x-button-confirm-small .x-button-label,.x-toolbar .x-button.x-button-decline-small .x-button-label,.x-toolbar .x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-decline-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-button.x-button-action-small .x-button-icon,.x-button.x-button-confirm-small .x-button-icon,.x-button.x-button-decline-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon,.x-toolbar .x-button.x-button-action-small .x-button-icon,.x-toolbar .x-button.x-button-confirm-small .x-button-icon,.x-toolbar .x-button.x-button-decline-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.8em;z-index:1}.x-button-forward:before,.x-button-forward:after,.x-button-back:before,.x-button-back:after{content:"";position:absolute;width:0.773em;height:1.8em;top:-0.1em;left:auto;z-index:2;-webkit-mask:0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:0.773em 1.8em;overflow:hidden}.x-button-back,.x-toolbar .x-button-back{margin-left:0.828em;padding-left:.4em}.x-button-back:before,.x-toolbar .x-button-back:before{left:-0.693em}.x-button-back:after,.x-toolbar .x-button-back:after{left:-0.628em}.x-button-forward,.x-toolbar .x-button-forward{margin-right:0.828em;padding-right:.4em}.x-button-forward:before,.x-button-forward:after,.x-toolbar .x-button-forward:before,.x-toolbar .x-button-forward:after{-webkit-mask:-0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat}.x-button-forward:before,.x-toolbar .x-button-forward:before{right:-0.693em}.x-button-forward:after,.x-toolbar .x-button-forward:after{right:-0.628em}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;-webkit-border-radius:none;border-radius:none;min-height:0;text-shadow:none;line-height:auto;height:auto;padding:0.5em}.x-button.x-button-plain > *,.x-toolbar .x-button.x-button-plain > *{overflow:visible}.x-button.x-button-plain .x-button-icon,.x-toolbar .x-button.x-button-plain .x-button-icon{-webkit-mask-size:1.4em;width:1.4em;height:1.4em}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(119,178,248,0.7)), color-stop(100%, rgba(119,178,248,0)));background-image:-webkit-radial-gradient(rgba(119,178,248,0.7),rgba(119,178,248,0) 24px);background-image:radial-gradient(rgba(119,178,248,0.7),rgba(119,178,248,0) 24px)}.x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask{background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e6e6e6), color-stop(10%, #f2f2f2), color-stop(65%, #ffffff), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(#e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-segmentedbutton .x-button{margin:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-segmentedbutton .x-button.x-last{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-segmentedbutton .x-button:not(:first-child){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{-webkit-border-radius:1em;border-radius:1em;-webkit-background-clip:padding;background-clip:padding-box;padding:.15em .25em;z-index:2;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-shadow:#000 0 .1em .2em;overflow:hidden;color:#fff;border:2px solid #fff;position:absolute;width:auto;min-width:2em;height:2em;line-height:1.2em;font-size:.6em;top:-0.15em;right:0px;max-width:100%;background-color:#990000;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e60000), color-stop(50%, #b30000), color-stop(51%, #990000), color-stop(100%, #800000));background-image:-webkit-linear-gradient(#e60000,#b30000 50%,#990000 51%,#800000);background-image:linear-gradient(#e60000,#b30000 50%,#990000 51%,#800000);display:inline-block}.x-tab .x-button-icon.action,.x-button .x-button-icon.x-icon-mask.action{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2YW4hVVRjHZ0yzq6lFEaMlE0PShYRAJIl6iEqKHnqI6WJB0IvdICkfEk0aIyo0KFCph8giCitI7CkoohQL7SoZDaQmXSgKo4uWNf1+zt7DOXvOOXuvvc85bc+cD36ssy/r+77/Xmt9e+3TOzIy0jORbNJEEqvWruBOH/HuCHdHuMOeQOmmdO+ozaA5oxXPunSC2Re4MbgCNiB6vvqbKbx0giNxp9BeBU/BIJqnRecLN2UVrLDj4GIYgscRfSltYSuzYMUdA/0wCI8ieglM5XduK7vgWJhTegGshucRfQHkyj1XpziLNrfmOh2ug1dhMaJn0gbZZDpNpsexQb2y3azfKXCAwns4W5dMd7m2B2ANLCT/x/A/nKknN5mUhWFp1g4Z7vM14jrbBZvgEwi1tAdkDEf3ZrgI0S/RrkP4IdqGpuA+cJo0yw7iyNfJmzAcMrokfjp93HC4XrPYCdzkgPXDPPqvJN7eRh0VrBWqfKMuev6k3Qzr4SP4HWqOFIkZ73iYA/NhLpwPZ4LLS+FZzUp+GtwAA/heS/sGwv+irWnXc9bdTRF20/8eOBWmEKwnCectOrPhSlgF2+Bb+Bl+AxP8B/6FvLn8Td8fYQXMSubgsVZU8Cv4mAeNhC7k+jLYCopzrRURlvZA9P8WLIJJlcI5zi1Ypw+Dr4oqp3EAzlsbLCjfg1PeEUxLtlnXXU4/wQboq8gpl2BHx2l5UuyosuW8I6rQb8Bp1iwRefy4VN6FReaopU3pX7jnhwSO7MmVIiNnJ3L+DtgHCm3ltA0RH4/26rhKk1tdu4kr7yeuHkKgU3rMqI5ncfAQDIKbg14oi1nJv4OvTShthC9LjmTyGB8XwhZw+oQ8+Xbc68C8AOboK6+YYPpfDV+B06YdAkJiuMtzhvrOP1JYafMLpu/Z8CmEJNGOe60fz0J/cjZmWcP0G2+sWZ/aUnCqhFosOq7gyf6uOT888th+Ot0HmxF7MOkgt2AcXQNLkg5rHPv+dffjVvPX6PdeWtf7MJhUssD578ZtEGL6sY4MIfTjeh1zCWZ0Z+DwQXAkapkjtzviPdoPYB+JuJVMNfy7QQkR7MbGPfRaYhi7ruUSjLcbwe1k0tw2vgivwy6C70/ekPE4JK+N+HySWDuz+A5xXOnvlsqD6Lf/QjwBnxNc4a02YwzBeuIdyBosWDDT7RKcn1MRYA+/V8ImAv9Rcb5VP53ufoQ8AB8S0+PMFiwYz5fDzCjCF7SLCbojOm514zZ3HViYLIZVxmD4h8B0rtWtFXkEn4tTv22thPe2SawVeDs8TTz/NqoyhLqDGoC7wervt3lNCxKMY/fIc+BLuJXgn9G20pyuVuA1sJF4vt7GjHx8nZnT7XAXzIXnoK4FCcbLVHAqLW+DWF8v78Aq2EY8v7zGDK2+EmfBI3AtTAPNTU1dCxXs/a6ht+t6bM4FNykvw/0IdYSrDLHu8iyeQ7Cg6mLKQahgd0pbSOJwit/cl6Np6p+BrxGn6hNUp1z3m/tOWAH+DrIgwSTQcBcTFLnOzcRwSjZ6j/vdvQyCxRrSanu0mWvZqp3LjkbBuYTGnSac4CxreCQqJPFD+r/bhq+dtOSyCO7DyWzIcm9avKLXXb+FcskiYjlBfB0lP9KLJp+nv6N7ZL+cp7N9sgg+L6/zMvabcEWrK7iM07CZOXVHuJlPs4y+rNJ74JkyJpczp62N+vWOfpw0uqWzrnXXcGeN53g13REe/0w660x3hDtrPMer+Q9LNCcV91c+jgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.add,.x-button .x-button-icon.x-icon-mask.add{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAABqUlEQVRoBe2awWnDUBBE843B4NxcQSAFOC4lJeTkoxtJDykgvRhcgCFNJCFgIs+ChEHSJX93YT6ZD4ssmR3NztNFH5Wu6+6iVynlEZpbp+4J3s5OjWm7DRxZuMMCdUB9oyzNmrJe01hEejMtM5exIh6bCI3JbFkDT27EckEDs5DI8iHCWcmy6IowC4ksHyKclSyLrgizkMjyIcJZybLoijALiSwfIpyVLItuOGFso/xiuEvAgJdeK0DqJrHEhtsTTh9ul9y/ChR2KE+Y1ruDt2ccI7d6PszcK+oFFblWELt3Cn6i/8epMW5/W+LKGrUZ/0NwboF5QxuPsfY8dmOxJs41cBOYHCZF2BFeE60i3AQmh0kRdoTXRKsIN4HJYVKEHeE10frvCNvr4RH1HojH3rGHr3hqA7VdkxPKvuKJ3AA4hn7BM3xxA5N71Fdv1gz/tax3P+hFHmsJwM/8wraMadqOh5GuXda76rVqNWb7wgeevQvRRQ1MBCPFiginxEokKsJEMFKsiHBKrESiIkwEI8WKCKfESiQqwkQwUqyIcEqsRKIiTAQjxcoVrP83/9czD9EAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_down,.x-button .x-button-icon.x-icon-mask.arrow_down{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_left,.x-button .x-button-icon.x-icon-mask.arrow_left{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFBREFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFBQ0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FXGmxAAAAghJREFUeNrsm09ERFEUxt+rxBAxqyFm1SqiRYpMSpFapUVaRGpTRIpIbWLaFJEoRZtilChRWiRKsyklilYRERERERGZvsN57Wfmvnnnznkfv+WM+bn3e/ePN24mk3E0pcRRllC42FOWy4dc1w30R+fz3LFthEs1TelZ0KlBuAIcgmRgHS5gqlm2RsNTmqbvrUlZycLT4BhUiliWfEwEbII+UeuwT4nzqNZq2Gm1gTu/ZaUIj4NTEBW7tTTY1zUwKH4vbaive6BBw2kpAa6DkA1CeBicgZhVx8McUg5WWNi+83CWiXFfE9ZeAGQR6ukBqJKyu/Gzw7TcXEiS9UuYbiWWeU8ckXYqMT2lozyFW6SeOU0K1/FhPS75RsHUlKbj3KV0WRPC1Nd5sCuxr6anNPV12zFwk2jLCCdtk81XeAIsahL+BVOgH3xrEPayA5rAixZhyj2oB2ktwpR30A5WtQh7vR4DQ+BHg7CXLdAMXrUIU26411dahClvoBVsaBF2uMsjYFRCrwt5a7kOOnjUVQg7vE43cr9VCDu8I6Nep7QIO7z3HgCTvHYXvbCXJe71hxZhyjmv1w9ahCnP/DDb1yLs9boXzGgR9rIAusCnFmHKCff6UYsw5Ymlj7QIU75AN5gz9YVuLu8eB/S+dA+v1+l83pe2Sfg/BRe2OeGfPELhUDgUtip/AgwAw4tbozZtKFwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_right,.x-button .x-button-icon.x-icon-mask.arrow_right{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFCMUFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFCMEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+xvZexwAAAhhJREFUeNrsm8FHRFEUxu9rxhARsxqiVauYXWoTpTYtUkRqlWkz0WaiTW2iNi3atGhTm4k2E5GYSJRaZcZQtIqIISIiYhgyfZdv/oF59913X+cdfst5733u+c495743XqvVUpKiSwmLWPB/j2QnP/I8L9SH9lN3/KxwQlpKT4FtaR7eAhegR1LRmgEVMCCpSg+CGtNczLbUC8pgQ9I+rCv3LiiBbkmNxwJ93S+p08qCRzAhqbVMg2tQkNRLa1/vg6ILvrY5POTAXdi+tj0tDbOYjUoaDzPgBuQlzcMpcEhSkg4A8lztjBTBin6u0d8iBOvoYwXPSRGsuEcXuWcnJAhuR4G+TksRrGOMfXhWimDFjqzCyUuE4LavS5yxExIEt0OfopRN+DpKbx6MHAtHSfAeWPN7kWQEhDbAMjg1cTHXBdfBLHiSUKXvwZBJsS4LPgCT4NP0hV1L6SZYAcdB3cAlwe9gDlQlTEsP9Gs16Bu5IPgIjIOP/34AoP26Ss82bd00LA/r1Vzk1mM1whCsfTrPpsJ62E7pE/q1HpaPbAn+Betgib1xaGEjpb+Ywrcu7H9BC35m8//mSncTZEqfgRGXxAYpeJNp3FCOhemU/ub+euXqzGlS8AuYBq8unyiYSulLNv9OizUleIcr+6MiEF4n3x7ze2n9OkSfE5/bfmg/30v7ERxaWBcc5Yj/5BELjgXHgiMVfwIMAGPkXbHq6ClAAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_up,.x-button .x-button-icon.x-icon-mask.arrow_up{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQUZBQUM3NEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQUZBQUM3M0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ar3jxgAAAbFJREFUeNrs2j9ExGEcx/H71YmmpoiIaIq4KSKi6dabbo1oiqamm1qboimiNZpuuikiIqLppiPipqYjIuLp+/D95vy6X/frfr/n730e3sst53XP9x7u+V2ilKpM05qpTNkCGGCAAQYYYIABBhhggAEGeNSqpl9IkiQKWNbvfBc7PDdNIz1PPVK7Trd+OMPrRr8l9Uat2nT9+CyCW4yVnnnHowTXqa8UWHcdI3iNGozASscxgReo7h9YxTtfjwXcHoOVBjwJQYNPcmKlLk9EkODGP7FSO0TwOvU+IVjxZAQD1iPZK4CVGiGAZ6lOCVjFE7LhO/i0JKzUK3KImQY3S8ZKHZ4cr8A16sMQWPHkeANepF4MYqWmD2A9arcWsIonqOYafGYJK73yRDkB71nGSnd5r4jKBG9Sn47AunOb4CWq7xAr7dsA61G69wCreMK2TIMvPMFKfZ44I+ADz7DSQ9YhVgS87fiQGtdlmeBlvkNWnndYBljfGT8FgJVDbKco+CoQrBp6mrEyKfgoMOyvpxlZ4CT9vcXj0shWNe8nE8vCfzwABhhggAEGGGCATa1vAQYAZekAmr8OukgAAAAASUVORK5CYII=')}.x-tab .x-button-icon.compose,.x-button .x-button-icon.x-icon-mask.compose{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAF/0lEQVRoBe2aW4hVVRjH54xa6nSzm92sHiZNorJowMpxrDEoyECiUUpztIkeeumpoCB6rAwi6FHwIXqKXkqiEE0no0QNLWwyspmGsruWlVqp0+9/2t9hz3Lty+mcfTnpB/9Za397Xf7//a219lr7TGVsbKztZLL2k0mstJ4S/H+P+ESfwEqlMhn/VNAJpoOjoGibAIFfwDbWnT/DZOCrex34D4b9vvw4wVScRKEu0AcWgQtBmYb9DvgsA6OganCWhgFwL/lHEf35v3ci/mqVFrAO8AT4FugJHge6URZsg0s3aDfOAe+H8f0INAo3gavD9928iT2bgqvBYVAWgWEeG+E1G0wwAeQ18hTZ/cDKSvROECnaBD9Iod9DFa2BMqSDEgAqjtiH8H3v4XwM32ZwlZUPp/jbLgHDoAziXA7r4aXIhsVqgZLYA8Atb9eK9BbQGRarvOwxEDdfdU9D/UiOUH9bwTixAWGJ/QmYuKhUojU6xomu4HgL3AV89ipO3ZdYlc3LJOJTsAeR1bAEr56V+J4H00Aa0/D+BNxPM0NW4Wcyvqe0G7+Gu5b9IhAexnrYq8A+4OMa55PoDaA6p0kjG1jHvVqnetBFQBxAP9CrJ27qxYm2OX25IhdlxxGoRgqzYFOxHAIvgHMbIKKF7iIwVe+yMtsA5F4CjYiVPu2+lhG/z3QRNRTeKGIIB4NKgXgEHIrhF8Xb9WuxmmVayhphLVDPgimgEdtL5VWI3RNuxH0idp17hCGlAOg924zISmyXRdbSskVYYjVnmxFZvXt14DjBLKJummuEYXU3iNsuuvyirnXam2cRddNSRJjXj1bjteAc0Ih9QeU+RG6JayTqSeUSYYhpu/griOKR1j9MGze7EXWvKRPZUaaC6VebAYltxrFUYue64nzXRQ7pfki+CDpAI6bVWJuKD9M0Ere1TFO/7jLMV+2NbTXWh8JGTDuoxYjVySqVFRFhfV15DjQqdoQ2BuoRS/mqRS0KTZ3D9KTISuxvIKrPtP5R2rjFnaP4Ek93lInsvGmC6eM00A+asRp/RTu3esRej3+G63evKZOL4HvoJ/x1MW0k3XI/0E6PR0Q3/o/AHPeee53XHO6DzDRgw5ls3fYlNZYgYHO4JmvgfVy/DjqBPhDEWuaCIXQpDOYELNaQPg4SiQXlLfmazErEvmsOpbQ9j+RlcAH4G6Qyd9jYdVPmMAx6wDEgkXOBHrK+lIqg9RWXSmy3OzTxzQcjwOrq29x1bjn3mjK1ClbR0oYF07Z2U08FfewiPV8EMK3YOu8midYCNd9DWpHVSm1clZZC8HkQ2R4Qe4Z0kpEnr5Vb36oU+TBxy2uB6rXyluK7AehAb+UsTSU46zl8BcRuBBrSg5CuzTPyf+HTfPbNaUVvKWU2kLq2BMdM15n2OmvBd0BEw3cHGPaQ0r1XwNuhe/r2vAKxG0O+cNbWg7AvdT6zvTQrqH5rXhowWYeAqmD8Z+DTqroA9IKFYDqQSewDlN2kiywsM8GQnR3gCOkQQmeRanhL4J1Av2qY6SP7XvBklmLVWZaCV9D+6eAQ0DxVVK8EZiNkPgDvAS1sQ4jV2ThTy0Qw0ZwM69sD5joVdQV5iV8P9DOOxO5DpL5j5WaZCIb9AqAV+ij4A+hw/maA/XlEkr68lpXga+ltKxgE2sDs9vZegDMrwWsQuboAPYldtieW+A8F8p6X9VDMRHA9BPIuGyd4LG8yKfuL46WdW6xJcFQDU3i96LRTGoOPBGmnligsirQWre/AxZ4C1+DrpY/3PfeKcl1Gxz3AJ1inrsR3uiquBf3AZ9/g1FFMjZXBZkBCW1Sf7WSx1NEx0bSv1QZBQ7tVoYA8jeDEf7yhXNuZ4B2gSq0qeBjuM1MJViGsB6hSK4rW598BMO6/bKPE14YAFXQ2HQWtMrwVnINAYmufjqKEmr8mOIj0bVTWSUYb/qQPbBoaRUABOQz03znLwUQTkyat/hZDpZrxGjqLi4VgMbgJ6L1XFlNUPwYKymvgACL10FPbCYJT12zRgnFbyxaVFE/7lOD459P6d/8Bhs9x6sTqrJgAAAAASUVORK5CYII=')}.x-tab .x-button-icon.delete,.x-button .x-button-icon.x-icon-mask.delete{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGcElEQVRoBdWbzYscRRjGexY1EPK9u9mVoJH4cVBPCYR8mB0IbkISyB/gOYIeFSUQQaIX8eBBDKuCsBFFxJuieFCMEb9RiZrcxKOgB7+i0RjN+vwm9Q41Nd0z1d3Vk9mGh6rufut93l93dc9katNaWlrKymytVmuD4mek7zX2YpmxqWJVwwrl2iL9qBp+LpN3okywjNYo/qh0Sjqi/ZVlxqeIdZ5HXA1HXU3xqbnDMVJGYJ+UzktMi1+le6VrY8aniMHLeeJNDdRCTWti88fCTirpSemChJHpT/Uflq6LNawah4fzwtP8aanppDQZk3sosBJNS4tSCGumf+jcMWlFjGGVGHI7D7zM12+pjRqnh+UfCKwE66SXpL8k3yDsc/4+KfmdJqfLHVMDta4bBF0IrIFrpaeloqsaQvM83S8lgyaXy2nvjdAz3KdWal5bBJ0LrAGz0rPS31KYdNA+8Y9Jtac3OVyuKjVQ+2wedB+wAqekE9Iv0iC4onNMvUelytCMdTmGTeOiGqgdhqkQugdYAdzZBakqrBXAXXlCWhkaDttnjBtb9s6at7UwwNJzp7vAOsE3KKaCfcbZwKrtP8r1oBR9p4l1Yxhb1dcfBwtMG+xCd4A5IHFHfpL8AXX7fFw8YGbDWmIlxtT19cfDBFsHWm22UVqUfpP8wFR97tbxCNjjikt1Z8PaYYMR1uwRidd5GJRyn39k8PaeCME55s4Rk9IzzAUjrNmcdEb6VwqDUu5fUv6npGsMmr47xrmUXmEu2GCcs2d4v3Y+kZqaUlbAf/J4SOKuIvocs/NNtDDBtp8L7b+lt+vgaWkU0M/IB40CFqbt3VllnQ59lu3Tyc+kpqfYZXmgJu6o5YQBln09jD07WdZSwF6JKdA0tBXWREvtMMDS6mH0d6yvoLb0sdT0lGsClpqpvW08ftt9hv2D9LVxdb6Vmn57p4SmVmreG/LYfiGwg96hwd8sE2hgqXWHweW1A4Ed9AElOTfm0MBS44E8SP/YUGAHzfQ+O6bQwFJb4TQuDexBj9v0tmkcBdvh8OmH9XUVt0nvSE1/7415kVEDtWwbVrd/PmpK9wzIsq0y+VLi6sYU1kQM3tSw1a8tpl8amKTa2s7wakAbbDsGMIypBOygdwr6C6npr4j+DMELz50hSOx+ZWAHvVvmX0mj+EaGB167Y+Hy4iaUoM7GW/sHiSvf9IYHXnhW3/KuQswxOa6SFqSqP6X6UzW2jxeeq2JqzIupNKVlyEri81K4sBVbeJ04PPGOXjH0wUsDy2i19IJ0QapTeJ2xeFPDah8mpl8KWAbc2cel36U6BacYSw3UUupORwMr8aS0KF3NOxteKGqhpqi1YWZAFLASrpdelMYJ1uCpidrWJ5nSSjQtvSyNI6wPTY1JFsRJNMqPHoMo21IjtVZeEJ9xCZYDrF0cg54pmt65z7BAp6QT0nKC9aGpvW9tOPel5WAX1KZaNrVCRtlSOwx90D13WAEsiD8nLWdYu7AwwDJwQZypUHf13wwHtWfkgwbFpDhnf/rQtyC+SeZ8Px3FnX1LPpud6KcAG5QDJtg2dZ5hdTZKi1JTC+J+MZ/K5yZ7g9KXOObHNNHvWRA/JsPzIzB9Xx53GKy1HJM41wSonxNGWLN56Wupyd+nTiv/rQYZtpyTiPELTNmHDcb5zltanTnplHRRSmlErjek60PIcJ8YF5vaHybY5vDsfizpwB4p9TLp68p5SwhXtE+sxJhU0JeUC6Y95tkF7tBn2SGd/FxK8VcAHyjPzVLP+qwZ57XEujGMrQsNAyyHfK8eYAfNM82bsw40KwJ3Sn1/teOb5/UZ48aSoyo0tcMwH3r0ATvogwrmzwWq/Pz6nsbdLpWGteIY63KQqyw0NVP7Qcvnt7nADpq1YZYzeA5iTV9T7I1S9DT2i/H75HC5yBnrT63UXLhGXAjsoNsafFaKudOvKG6zVBvWwMnlcpJ7GDQ1Umvbxue1A4EZoO2wSzToc/ptxdwgJYO1YsnpcuNRBE1twB62cUXtUGAHzTN9TsqDflPHb5OSw1rR5HYeeIXQ1ERtuc+s5bA2CthB80yHn9P8pDIrNQbbLfQKNF54GjTPLDUVPrM23tpoYAe9S8k/kjB6VdoiNQ7bLfYKNJ54UwO17LLzMW2nWA2K3vQ/we5S8N0SL5LvZHI5enCCQPnzkcU3snukd+X/YZm0/wPdHqnTTpY+CgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.organize,.x-button .x-button-icon.x-icon-mask.organize{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEdUlEQVRoBe2aS2xMURjHjbbqUaLoI7RChQUiGo9YaEqkoolIkCASSki68dixsLIVYmHbkJA03UgkFRI2QgRBKl4RgtJFK0jUI+o5fv/p68ztmUlHzpzO9PZLfjP3fOfcO9//fOeee+69E4lGo6PCZKPDJFZaQyc4N1mGI5FIMfUVkAfZMPaVwE54yqn6i+8BllQwravgAEyEv5DppsQ8gYPw3hqsJi0bNJ4El0GZzSa6iHcbjLbpsp7DDGX5V8ByyDbLJ+CdUGQLPNGQnkzj3TDFspN68BNkwhDPIY5poG/T1lBYR+LOkuW4uSeR4KXssN48grF9h20NdeukYLRL96Y6vAD2wCwwbQyFvXARPpoVA85fKnXiN4HtvP2Gf0tPG3XWUKNYT4E6PxjvD3x1EDHPZZvgxTTSDBc8gMrKbql5gKHeJh7NM6/AFu91/EVmjHGTFmN+HA3qYSoE7SuO8+zcEawY4vJdfr8Z/ljiqMS3AV2RvjpTPc7V0A623rqJv8RsnynbxDUXXieJuy/LfRmmEzSd7wKtroL2Hcc5BL4LVmRCmbheEIfmHduVQ1muQV/3BN2bJZyqaANbdm/jL+xtm4nfxKcsP08Q/zX8MxV3TDXqx+PYBGUQNHVAI9AsYrsuB9sPVflDT5xH+O7OZn8kK9msJf6G3ooFOOr66+O2NOVL6A7oP/njmmREQcN5LGhy1cLJtBwK++FSLqrVSGvPcrCZGu8DZTqTBSs+zUkarTZTUrerYh50gHYY7rSpRxZCCYTByvouS2FQK42hE9w7S/tKsOaIt/AGfoMWO3OgFLyYb8FaGByHl6C1r27jlsAh8HaN14LD1+x8jN/KNVdqlAvhgq8YfJ/DLYjVUDatk8J905HObd+Cf1rEaHTp5sSL+RacaKWWyO+8E3wLdi4g1QOOCE61x7Kt/UiGsy1jqcY7kuFUeyzF9ok6WA8ZvJjLtbQWEI/hXpLIW4N1rLyiPHV5hP9MsM4or2V7hlH+702XghWE3gAcTRKN3mjY7AZOdZbNCnAug4wTrNXSItCrmmYSZ3tGTNVAo+1nvCLOyLyeT9WC7WlqXNtUCq7vlpTlGkQMeG+Vio9j6NbxMOjtn8u7udjzaJcH1H3uLViVikCzLftqEtsKbeAyNh3LuWAdVM+yr8JsU8hgt9mvGh6ATousEKwgdcvXCMWDFap2mOYBTWK6b3YtNvYDrs9hM0i9BTgB+YMRTbvp0AS6bzaP43I7LUPaDFBvHPVmIy+ZaOp1+TkJX8Dc3/V22gUrYF1jN4L1r0T4NSPXg+sZ2dZZXgRr5m6BymCW8en6rc54BrYAXfu8CFbQmoQ0c1eYoilXw0NQp7gWZzueN8H68S44DbG/IPA9H66AL7FR12tpYk9qetOwGfSaVjcMNVAFie6iqHJv6bws2YaUfLpctYP+S5WoTVr8vjOMvphN4FN4N69Dybs6yw+OCLZ0yrByhS7DmrRaoQE0Kw5707JOf/UvH/ZKewTG/kscFrHSGbpzOHSC/wHSRhVOrpN3ggAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.refresh,.x-button .x-button-icon.x-icon-mask.refresh{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAG1ElEQVRoBc2aa6hVRRiGO17yrmloWpqhllH2wyKSEIsIo8QorLSbqVRgJd3DyFAQIyIiKQz61cUgpB+B0EWii4VkGFRUJpWKphZaaVZeutjz6FmwOnuvNbPWXvvs88HD2nvNzDfzrpn55tvrnLYjR44c1wpra2vrRr8jYC9j+KOzxmCnrTL7ng2LEN+rswbRSsH/ItL+Fwqij+8M0a0UrD5Fa0vg2c4Q3WrBik3sVj480WzRXUlwG4Lnw9OI7p08haqvXUmw2tzH8+AhRPf1RtXW1QSrz4i9CJYjepA3qrSuKFh9PeEWcE9XOtMtE0yyYYROojQfa0zRc8GZ7l9TWvJGj5LtCjdj0AYll6uD90HLQMizZKZ70vzOKjKypgpmkONQMxpGwWlwAvg9STLG8jlkip4FO/H3GKJ/DzXIK2/DQV554TIGdQaNpsNkmAAjoYpj5i/8rIIFjPlXruVMwY1Czy7X8+Al+B4OgU+yag7i0wjereyYqxDrDD4Ku6FqgfX87aGfR6BPGdENCabTqfAh/A31Btesez/T32LoXVR0KcF0NByeBPdSs0SF/Nr33VBIdOEoTVDyKFkCN0OlSQH+Ys2HsReMF66ueCuyJPDqzD4HvqEIzUCzyk1WtsAcKBy8opc0zgfBU+A52CwxIb+K3Qw3FJmodN0owXTgseNxsA9Cg2pm+S76vyktoOjn2D3sfjVAhFJBqmSax8km+BZ2gBnUlXAmhMyH+B3cj8DVocq55aEnROOJsB7MdIrOnnt9DVwD48G3lAPAB21evRRCPl3G22FaaKwx5blLmk4c2DNQdN+aaa2DKdAvayCULYQ8wYnYhpZxuv+QYGf3a/gnMLD0oH+h7mIYnO6o42fK/bX0MKTbpj8nYmd1bNvI98w9zHnbh8FcDSPBwcWYe/ReWMOgfEhlTbH6ugs/75Z1Urdd1tOi8qnwGcTO7j7qXgU9snym71Mva4bt70uYmq5f1ee6M8zsOphJoOiY2XVGlsEbDKxY5kOjlLmkt4Iz+z7Xyi1LjD/QJ4PLOsbWUmklGMkbsc00fqBZYh1Y3RnmvjnyWeDREbL9VHgVdjNQZ6is/URDxb5e1kFMuyzBij0ZzLBC5n5bzUAbmV2Titvx8V6os0bLs5b0aBz3j3CuyA/A36dlzK2zFTpFrAPMmuFRlPWzQsDMpN6BMoGqO+2+h9tiZ7Y9mBpXQivPIHoYvzXjyhKsUwcUsoNU2IRjj5JCRhtXx8rYRohV5Bh4EExP8+KFK24VfAT/syzBLmeT+5Ap9LdQpYrKFTwMrgcF55k/Tj6FGsFZe/gUKhupu5q5VGOCo7Nv3RrLEryLmgdqarf2hjPsyssac9ToshobjGKepO1jzuqowQQqGVNOj+zvMPVMdWssS/Cf1IwJRAa3CcSTmABX03nBG451DMTEFleniUyNZQneQk0zqJC5xHw3HTOIkK9QuYHqQsgKtOn2Ct6ZvpF8zhK8jQou65DZ+UXQ1ADHCrKfyTAWQubK/AH8XV5jWYI3UtOzLMZMQ2cyqGbOshnZDPBYCpn79xuouyWzBLskPodDEDJf394IXiu39vgwEccXQyjDsn/H/gkovMayBCt0Hdg4xi6g0rVNmuUT8b0AzA1C5vnryjT7q3sOZ77TopH7ZQOYj+oohH89NAuKeuPBgDL7Tsrw5SmwHEJ9J+W+bLR+/8RHx2tmpzRy3yyCfZA4DF23UfcK6Nmxo6Lf8WFUfhzM10P9JuUeRZfl9ZUp2EaYeycJAInT0NU/ct0HQ/M6ziqjnft0PLwCsavLMbkNV8OQLN9HNeUWHjtfn8eJiUhIaLrcCPkaTIHo2aau+3UmbIS0v5jPnrtz8vQEBR+tcOxVz3qcmWrGdJyu42y/BXfAJKjZW9w7CaaBy/djKDKrSV/mDCsg+HCj/qmF6DsPZ8tgOJQxV8geMBnwszPobCp2IAyFYVDGXE1fwAwmaEvQQWgJtM+ySYWC90PyVLvC1aPHQHl5jI6jWqIrHpuFl3F+oAuJ/pGxzIXoP4znRumODwPHI+BFcFm2eoZ907IEBnQcZ973QoJ1hLnnXoBWiXYZ74D50CtPXL2ywoLbRRtwloKBqDNnWrEGvOugVEZXSnC76O506o8GX8QbKZst3KPnTTi33szF3istOOmAAZgVrYBm/SeeD/MruAf6Jv2WvUadw3QUNM5q30ZcCrNhDMT8lKNapil0LayCtxG4JbNmgYLKBNsnortxccbPh+lgBuUvnlhzW3iumpaaofkzbzvXyqxSwelRIb4f3w1u58AlMA6GwNkwGEwhN4PZl0vWWLABDEr7EVr3BzxlDdl/zhnCj3tOo0oAAAAASUVORK5CYII=')}.x-tab .x-button-icon.reply,.x-button .x-button-icon.x-icon-mask.reply{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAES0lEQVRoBe2ZSWgUQRSGM24YTdSo4AYRTcxBEZJDJCoigrtGg6CIgihqogfRgEERguhB40UP6kHw4kEET4J4E9wPAdeg4ALigjuKcSMuMX7/mAmdSU/SXdM9PTPpBx/T3al67/31urq6K5G2trac3mR9epNYaQ0FZ3vFwwqHFc6yEQhv6SwraBc5YYW7DEmWXUhZhSORSC7UwKIgxzAlghE5CZFHoAEKgxTcz8/gCI3gfzHsh6l+xnLq2zfBaC0miXpYDvmgu+kXBGqeC0aohK2D7TAF+kPamKeCETseZdugGgZDSp4RxHFsnghGqKo4H/aB5uoASEtLWjBiZ6KsFlaAHlJpbUkJRmwl6rTcFKW1SktyRoIROhofdbARhlr8OTkMdBPNlWCE6iG0AA5AqRN1Nm1cxbTpn9Qlx8ERO4pIG0Br6yDDqH3pV4kvPdRewCd4C+/ZPdWx7xZxsk1LgqvIZDeUeZzRT/xJ8Dt4BQ/gGjSSVzO/3psEJ4JoY+A4fATNvVTwhjh34RSshMGJ8jO5biuWIJqrc6AJ/kIqhNrF+EFs3fqHYRoMMxFp7dNFME5Hwi5QMLskgrqmgb8M+hgZYRXh5riTYBxpFM9CUKKcxlWOSyHPjVi1jQqmYy7shQ/gNGjQ7f6Q6yWY7UY07XNK4CK0QtAiTOK/J29tLOQ7EU67nIGgtfU1mARMhz6a3zegtCfRHXOYxhXtndJBgGkOT9FQ1Z3oDsFqhBXAFngJpkGD7veN3NclEt1JcKwRHaaD3niCTt40vh6+q2N6rL+2gtUA03p8FL6AaeAg++ntsNwqNqor/kL8OZ2WgF71vEpeq8FvC36uDveJM8qqyenHwzg67oE1MAxMTeLOQyNod0SDqO2hCaDVIma6u3R9OAxq/9WxW9PT+wRsQ7RiE7Gbj4f4v9F8Fujxb1ptfR2tj/cbf04bfbbqZWgsFEM5LITNcBLc3HF6iM2IxXAlWJ0wJXEQfoFb4RJcEwtu8kv/PCiEGdAAevFQJbvL5Rh/j351uRbcLloVmA83ewgUn0TSgq2DRGzloVt9E9yDFoiPqfOvUBHN3erA7TFOtG6fBqdfVp4KtuZLDqr8DrgDdqIPcb2/UYXjAmmu1cLDBIGswX0THMuJHIrgDGglsMZu4nxI0oItgcbjUHP7MyRaanwXrHywvlAFj8E6v+dqZ8MTI9BzHO2DtaC9KY1wIEYurXCO4JrbjyA6CvzO80wwznS3tMAFDpfBKdArnkY4ECOXqwTWUqZvA1mJp4L/+4wKf8ZxDeyE26AlLBBD9HUC14GWr8mezWEc2/oiiNZM/TumGbRLkdQ6nChOT9eJWw3ffakwjjuMRF5wUg9b4QnE5hOHKTVNsSuO3qW9SosN/Yn4KmAQbnnl040f4pelVLCb5Pxq6/st7Vfipn5DwaYjlyn9wgpnSqVM8wwrbDpymdIvrHCmVMo0z15X4X9rh8wHLEjawQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.search,.x-button .x-button-icon.x-icon-mask.search{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGdElEQVRoBdWaa4ycUxjHd9rpbm2bqKhiUavbVZdo0LCyLl3iHhGEkkZsKBYJX4RISHwQIYIPNJoQlUjTuCakUZ9oVGRF0GywslvqbgkpDarqsn7/6XsmM5n38pzzvtudeZL/nplznvM8z//cz5ktTU5OtuWRUqk0i/qdoAN0gcXgP+CkzIcx8APYBXbi82/SaZFSKGGILiTibnA+GADHgbkgSXZT8CF4GwyDEXxvI92r4k0Yoj1EeAG4CvSDEggRkX8VbID4lhADQXXUwxZgfAF4CGwFmgdFYQJb68HJljjy6mSSJZAZ4CLwESiKZJydb7A/CGblJZVWP5UwzueBB8AfIC7IovO0mK0B89KCzlOWSBinWoBeAkWTstiT3948xJLqxhLG2Xzw4jSRdQ0yiv/upMBD8xsI40Rzdu00k3WknyeO+aHk4urFEb4TJ/80CWEdYB4BhS1kdfswe+zpGNf80RYUIr9QSdgOdNCYCfaLcABpqFxBbymu3FIlDFkdD18B5wRYHaHOJvAeGCU4fa8IdnXUPAaoMZeDk4CvfEKFM7CrhswnbpxjZQX4C7j5Y0m1d64EXc5OWoqeFsPLwTvAYt/p/Iv+6jTb1rLKHMbYgWCjZxCb0T/e6qhWj3o6hz8HRMSRykp17l5WayfksyN8oafzTegfHOLQ1aG+blc6ZGQRdeVawB4GlWno7Pim1G9rB08AZzgrfRfdw3wdxelHvl/38K01Itc2Rf22Q8BPIIuoynXQL/SQj71DwcfA4n8nev1xjWfN0yGjD2gxsYh6432LolWHQL9F91Gj/j7oacUPFhE+11hbLxbrCFBzqWh5A4PDRqN90RZqVK9XE+ET67MSv41D9s3E0nwFX1Ndu4RFjkZpjkUxTkeEdTDIEvXqW1lKoeU0pOavXj10OsuSI1CYnaWUVC7COvpliR7f9CQzlaK5/LPBQRc6mstBIsIW0WXiO4tiDh35mIr1oS4kK2ENOctwqzPu+SX0MdDLjZWw9Pb1suyv7EPYR7cuEithLRLL6moW/0VriaVRtT1qTQkSER411Cyjc4pBL4/KEirPNRj4FZ3gXy5EWM+vWaIhtJQNf2GWYkg5dtWzui9bhuqn6OkVNUhE+ANjTZG91Kjrq6bDxHnGStqvcxHWsU5bQpZ0orCK3rDs21m2quXY6+DLTWBBNTP9wxbOKZZ4E63omLYZWG4r0nkQtOtwVASwdYeH723o9uTxS/3Ks+ytHk5/R3cI5LqIK2hEDw86XVkb+wV0Z+YiHDnWCjnu4Vj3Ug3DzhDn1NPacTX4HljJ6gFPr5e5RpZ74tFz6l0ezhWk5tFTYJFPEOjrLKxhrEazktWR8zVQ9vEVp1ttLYyplyeANQinN0ydIXBUnAOXR7nsrwAbgatrTbX3nu1s5Ul1oKgIRsZYMR/jy72gY0+u6a8OJMJX1P+C9MsaqDcPAseCHtANQkRTwHIoybZd21qR0Q2k1pZP0tNJSIubLhxJOr75egO/sjbekM/VIe0qY1RDb6p//PYl6/QniO0sF2tI2kBYRpBTgVrUOWqm9DPiGgghW+GWVBGj/UCvEM1E1sWinr4sKfa0/NgedhUwqsVITzvOUTOl6gxv0qmERRw5HOi/bHz2zb3VMHp28hremYQj0rq23QhGwFSQ0ZVPu8NvAfa3Use8kJkI1wzxxRhfDcYDAotrKF0GngYnRA17D599f7KVXcVzmoszLfUi7AxhfBG4GKwFPudhBacnmpfBStDwnzrkrQIhpDW8L3ExJqXV/wBA2Vs4WelquT9Qzy8FvdHnDlKR01RQ8OrJMaAp8TnYQUA7SBsEm6pzPXgcyI6PaCG7Hdu6VcVLUkuE5ONBR8ByDGb42sPGteBPEDcV0vK0ZZ2Z5C9oSCcZKzqfwO8OJK2FbCAunqYmrICRQaA3rLRejSvTWtGwTzc94Yj0DQS/O4C05nQd6VYhrIVMpEN6Wqv3crBngY4b582aR9DXgJCFTPt05T+AtKq2jNARzxLs/UBbnY/0onwLO97sXPuwj8cidQn8OuytAe0edjUyuluqh2vIPcNnPS1rIbOKfkRf0pKEGdqSJyFwM/AZ3j+2JGHXpZDWWf4+sMvlpaTal7e3xLYEsdQ4ITIIsras29AppxrKctRM5ZDRLUvv13GnLl1p5yjellylCb5BolvWkRQMgT6g6apXmnVgPWQrc/1/boJCaHVWyukAAAAASUVORK5CYII=')}.x-tab .x-button-icon.settings,.x-button .x-button-icon.x-icon-mask.settings{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIkklEQVRoBdWZd6yeUxjAe2lLUbVKrFaLUhUVo1pbQtqqESOECGLGH2IkCP8YQewYtUoTKmkJ/2hVEDFixN5FadXWBjFaq0b9fl/vuc5973nf9xtvez9P8rtnPeec5zn7/W7HsmXL+vzfpKOjYxVs3hR2hlXhT/gcX94iLBYd/r+BR2vB+eBsyVJ4FPqX+eJItbUwm8rmMEZDTRAMhG1Nd4p+bABbmUZlAGwLI0D9Lmlrh7HV5boHOHuPkL6LcCisDztCEJ1aBxwYwyvgMbgfToD/pGwJ9FY5FjoZ42AuhKX7N/HX4Er4Psq33PQ0eBz+APP+gbfhAOjQl7bdvxjYH86F4Gwc/pWT74DEesYXwWWwtg6385L25J0FH0JWXOopyfrjDC+AmTj7sxWyCua1hWCgs6Ox58GPTRr1FfVmwBuhfts6rIH47NJ9Eu6BWBwM9+xU8HqaDA5OLL+ReAmm044zXZPlGzmk2iDklHUSvF4mwU4wHEbCuqDo7OdwKXgK/w4DwEfIdVC7vgjVcxnPg/fhHZjVdocWRmn8faDBKRaTf4srPoa81eFocABS9cy7ra2XNAam5BcyvZqy4vL/Er7OFsTpdnW4yK5+OBCWd+yLjw9neY04Mxsvajiru7LS3qXut2/Aq8mZ6zp0iPuOnsBeH0wYi1thL8jmW99l7ux/1G0fxHui2TiNOojdaLQt6vcF38tbwyHg0zLel57AD8Io2Ay2h+sh3r++tl6AI2AbWBv62XAlwogPoyFPVhvuJpRpyCwc/7hbQU4CPWdlMfWWEFrX2YvFpXskTIRFsD4Mgqy4Qr6gPZ+ny6XR0c/Tp7Up4GdaPBNx/KG8unn5tOV+vLOgzbj9VNwD7gHYMPRRyR5mJpyBIVDU3lD0/ISrS9B19U2A4+uqkFZywMbCYbTnqig00PJ6xYNCPCnzZD0KRuQVJvJty089PyJicdY+hfggs7y2fAl/MBGJk+DJ7grgb+YCz6ZRceY8OHaEftly08ho+AQ0IrW0zPsWjkrV72zDg+VwGB50iHse3AbhpJ5P/AzYBz6E0Jf9egqfDieBZ4Vl38E1MKirzRBJhSh6ED0D7k0bvAA2gVVifdITwQd+MCAVOgMXx/WMIx42J8M88Ep6E7YJesSd5SthBuwOzvxweBhCPw6IV5nL1y+pPWEqXAJd+7fWX2g4G6K4HTwHGhoaNnwZDoLVQh3iZ4NXRayXinuV1N7vtc779NmN9NOZejr9FowL7WdDyjyVb4TQhzY+A7Vv3qBPuquvrrwQiUMUR8JMyDobOlhI2dXgIbQaXAvhV4agkwqfQs+DxH11PrhqUnou0TkwNrYrxMn3ADoMXgUnwIm5Ano4GOqEsMceppJ76REomzGX0bNwCrgMnZmU8XGeA3UizIK8wQz6Ou0+HROMjUPyXboOngyArhUX62XjKYcvp7IHTOi4N0MH5eGs0a2kXVpZ8fBYnM3spbSrxqVdnWRHi5Y9Ne+Gn6E3Z1dnn4fBWRtbSfdY0jaGjAYf3u6j3nLabbVfK86l6qaWNP3UllGYZdMrWzzxJ8OLVXdcO8ZTjfL29CP7VvD4r71DU3qJvPnkfQ1hZWxGfMuEXl7WXxQ8AacwQ9/kKTWdn5r2kEejO8DbUM+V8yR6x8II8CM9XBdbEffJ6FVXtkUsXwC7BhuqDpN7OHRCx951flgvgTBj2XApZX7CDYHci5+ywXAOFD1QbGsq9A02VB32pXH/26Zj/cEL3JkZCs6MT7+DwfyU6PwUuBDDCq8yyr+ln5vQ3RB8ZaXOD+2xv2XovkK4AD4CB9yB+o12XG1Niw/xLeBA2Alcji5jr6Z6xJfWQRihQXULzsxG2T7rER8fbqu54J08m/7eIWxarqJm0TLLLuGQ1pCjYFUMKNwa2XLq7Au/Q2ir3tDZfQoa7jPY4LLym9Pl3Kg42q/TUDNLzDv+tUY7RF973RJNS2of1duYDv9Sr3JGz9P4jUxePUlXgnWbllYcdmY1oFnxvl3p0orDrdTV0VbrNzVYrXS6NT3mXVdlxng7bF+mlCi3Xkuiw57QzRw8Xl9DuGKaGbSNqbsrNCpuIX+YaFq86KfDuuA97AnorPl2Lju51TkTXoe6Dy8GyFm6CLwdysSJ0EH5CfwFZEqTNwNVO5+CtcjymRpKfDsY1UlI+6NZaiZ19CyYhhHey6WCv0egdDf4a2RKfiDzPVgI78OczvAD+mjphKYdjtmSRwMqPh1/VTWHz8g/AZK/Wcfto7MfzIO8thy0B+M6VccLHaZzD6aXQEPyjDTfc8CtcQD0eAWRtwdMBWevqB1n0FkdVbWjob2i7+GBdHwpnAZrQj3yPUoLQKMXwXowEhy4wVCPOLjT4AKMtL1qJXieDellEvgzS9GMrKgyz4ZTszZVkU4uaTobBrPB19CKcqqoXZf2fBhdhZNxGz0cphOvm5uhbL8VGVxFmYP9BAyMDW41nrpqDqGT8ZB3bVC0UsQfJfYGr73KJOXwLrS+QQM9NHo3NqLvw2hcA7aUqqYcdu/6ovG0LJM5KNwBX4LLuEz8Geh28OebMrE9T/p7yhQbKk/tCRrw55eXwaddaj/6a8VMGAP+93AyeBendOO85zr1hxNOA5+McXmIuwr8ifaklH2t5PU4tEJjdDYWfCdnHx1zyTsG1lAX6YAzIc/44ITh/epHffhQ8feqWEdnXWGTgl6VYa7Dnc7sQ8fvgiems3ov+M7u9poifSh4d8aGp+JXZ42nzibgP7eXgM5+CuOzelWlCx3udNqZvgGOg+QVQb467mMNTjlqnl87J6cMJ9+zZH+4BfZN6VSVV+pwPR1hpA+VNyFvz+vwJ7B3Pe2tSJ3UKY1dDctX1PBzTsfyxGeq26NXpRKHmZGleOEV4pLOk4Xo+XrrVfFir0r8bh4EG0E8057i3r8eTL0u/wJCZSL2DoplLgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.star,.x-button .x-button-icon.x-icon-mask.star{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.trash,.x-button .x-button-icon.x-icon-mask.trash{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFBElEQVRoBe2aS4gdRRRA8+L/m0QIJkYNLlQUNOAvigpRcCEIcSsiCLoLLoILcaM7QVBX4koRshDxt9CFKCoiuvGDCP5QkxCiJhInRo2Ovzie80gPNWX1dL3uesM09IUz3V1169a9daur+031aG5ubkUpGY1GK7G1Dq4Cz9vKiIY74Sv8+72tkWQ7Ay4Bxo+Hu2E3/AuOZBf+ov2TsL6Ef5WNUsGazXvgEHQJMm77N/aeg3Mrh7seOweMM2bWYH+B2OES1/9g9w0oEnSngHHCYO+FGSgRXJ0NM/0idA565BRpKyxSt9J2B5xWY+Mw5Udq6uqKT6XimESlmX4d7sTnA4n6rKJjs7QSSgTrSno7nJyodtFyGr4AP4G6TeLIHweb4A44C0LR1xtgCzwP7aTtIkBvLlSfQjwNZyl7FNa0sU077V4DX0Js25X7cRjPzDb2Nd5FnK7xPbGXskdwxsxOLLRzdnwIj8GvkQFnypqobKLLrgGnOjMzP6cqJijzfn0NXPljmXRNWNC+dcBHM7HA2NELp10nwbaz5iC4OsdidTyrYp3a68ZFi7XJFfNsOBGcUmFnPpbiBWkVZefT7g+OXcTF0EUsFPtaje0Lw0LOzfoM49B4Gy36WMKwK+WDcC2cAmGwXK7YAAYdym9c+NiIdUOdnHODc6DjpPioix9LBvwtPE3QOzjWi7MjBS0M8CGY1huUA1ISg/4cNqXiqcqSwVqJ3AQ/QEmnpm3LR+IzsLYKMD4mA6bBOfAKuFpO28nS9v0Bcxckn9V1Ad9Pg2m/H5cONLT3Mf5fFGfX63hBQG8s7/LXxcdV0nvjMtgKp0MojuaroM60xYB8Z78ZTog6c515B1ylXey+ARe3/0tqFNCy0RjrkdvgOwhH0TeiB2A1uMBNGx9Ta+FZiP34mrIrQR39cECSUzqZYYIcR0mjJtmFwmHUvdenLjwmnUl7Eh05+LP40fjvoGTACYN1Rc6CecGhM7lw2lt+AA7Fg4fOespXgYO0j3pvnXmh3rY+/52+vrXtRSd841rQJ/WV1JVX9eNj14DnjeHnJVw8DBeAnX8A2ynfXwXN+cWUPQUOjNl6i7Jt1I9nCOe+1V0NT4AB/wkvw31QRIoFjDfnwRXgfVbJGZzsry44boTNUGVjlvOToPpV5FvbjXApKE7VLZ6UkpWlDGHH+96pV93/4TSsujGA8MeF51Xw6njuO3soKTth/UTnJQOeqONFlKsBW0SlfdVyDLh9NBkth4AzBqnXKkOGe52+DOeHDGcMUq9Vhgz3On0Zzg8ZzhikXqsMGe51+jKcHzKcMUi9Vhky3Ov0ZTg/ZDhjkHqtMmS41+nLcH7IcMYg9VplOWY4/Md88cEtHbDOVg5Xx9jpsM9Yx52JeAcw1ontTXRdcm9pFz3vBveHdNJN6YPVRhrnivtMlruZ5g7DFxBuXLut8j7sA/d43Yr5CIpJsYAJ7DN2/27Bsw1gwAb3I8wLOp+g4w6+nw/6HddOyszqWDg/Qv2bXFwH4+1SyhyUYtI1YLc85wXn/ORAagWdPVRKUqh3AJwtdTLeWq2rbCoP76cm3bjeLG6ELjZim03XJujyJqXF6rtmeDvGNzMN/ajEAZi2rKOD67t00jVgN7+3dnFgqdsu5XRc6tiS/eUGvBTTNengBIVZPuYG7LcYPjdluYk++bTw++pGyQ34bSy9B35Vs5zEYGfgJfg+x7H/ADoy2VfnrtXoAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.maps,.x-button .x-button-icon.x-icon-mask.maps{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADl0lEQVRoBe2b24tNURzHjfutXEPycDAltwhJbuMSJUqSB/HiES/+AK9ePc6T8uCFkImQW5KGkdwSxYyMGkZu45bbDOPzyZyTrJnjnDkGrVm/+szas2bv397f33ftPS+/Vdba2toj5igj0NcfRkG/3qWIJdcIrs/AO6gDq7cKPkOjUNAmxr8ePJsix8NUWAvLoapowSQawIUzYCZUwAqohF3QAjtgGTyCy5x/nfEu1MNDCmAxuiS4Vy8ST4DZMB9WwiTIRUGC26q1gKtWwyyYBsPB5aLIL5CNTxzotDeWTeA5DUKuO4xXoQbxHpcUbSIzJFkDi0EzdLYnBNGuYJJ4ch+YAhvB5TAORsKvib4x97vwPpk2FjJuhibu85zxAlyCangBLRQib06u68t5vk4uVYVqgO+oqy9v5ASTRLd0LQNLYB24bAfBnw5zikX0HtuhGW5ANY9ylvEBvIY3FOArcz7rWHCpboBFMAxyGjguKIZy1jzYCqfAD5BLslB8J3dCP/AdOgo+fKHXd3Sebh+EctCMieBK6Oj8QuYrXZ7roQr88PiSD4b/IVyyfhB9jQy/uppTUijYhANLytJ1F/sxzL7POpg97vQdFfwVTNYtQsHdKpLg2O1ODieHI6tAWtKRGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbCI5HJmhgZzkcFCSyCaSw5EZGshJDgcliWwiORyZoYGc5HBQksgmksORGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbKLbOVx0r3E7httIbttwNvzddt//JWxIfQynYX8pgu2TbgBbjw9Ds53sNHJv49gOehu5bUe2DfjXojDVpWG/9iu4CEegBp7xfO+LFfyGC5+AiQ7BFXj/c8s+xw+Z24PwvYwKnQxLoQLccGEB7Hsu9t5ckjcU2QjuozgA5+Apz9PCmItCbvqWs2vhJpwBl8ZrEuVtOebPtiWLbf2ymyL0ZVT8XJgDbgHIgFsPOhPmr4d7oAnHue9txg6jI8EfueIaHIOrcAuafieSc/IG19vw7TYD6UEBbE4vhwxMB7cizIYhYPT6MeR+WjBFPoCToEgF1hb6bD8LNpHLwT0L56EOGkhUchc6edoNcruvQWoQ7/6GMTAa3E2zACxGNjRhH9wHV4zP9oGxqCjj7C0wA06Ay/YliRT/T4MCuGnEfQ4feJ5mfvdfaG+OXSWdju+VpAoIK3D9tAAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.locate,.x-button .x-button-icon.x-icon-mask.locate{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIDklEQVRoBe2aaaxeQxiA3eqCltpLkWotLUUtsUuJrbUFtSSaiIjljz8kQhOJiAQRQYREYvmFSPrDFiSExFpL49JSS6u0Re1bLUVRz3N7ph1z53zfud8956sf3uS5s7/zvjNzZuac7/asXr16g25IT0/PKPrZAfaFXWAMvAEL4GNYgS1/EjYqPU07jKNb4sGZcBocB0MhlYVkPAgPYM+itLDWtA43BYY6m7PBZVSFXuqd2ZQ96m3S2ZkY/0lFR+PBcFlf3ZTTjTiMwQfCR4WzfxO+D8/BTxA7Vxb/nXqzmnC6docxdDg8WTj2F+EtMBrMPxiqzvqn1N2nbqebcHg6hoaZfJn4sNho0hdB2cym+bOoOzRuP9j4EBTWJuzII1F2OngEuZQfwcBVhLG8FifaxM+jfHybOgMqrtVhet4OfH6VHsjpn9xXWu3PRKrtXK1qtVo5g6q1zNfyzJ1UFOnwCcz6ZqEq8bHErwzpCqE6JtHOsBap2+FNsGrjyLIjid+PvYfBDOJPwJSovEp0wyqVqtbJ3Xqqts3Vy83EKVSUTiWns1Nd2WesY2U0XAHfDkZBpu3vbHzu3rVI3Uv6G6z6oBbL1il5b1108LG6Hf4ak+YO3qy1Gl4ltnhtqoZIrQ6z8lZi06PwWw22qUJdn9Wkq09NrQ4Xhs0hfLgGI99Fx30MotfT+sT9oG6wbhzMAzebTviRdufUbZf6anc2GInBh8A7HTj8A23Ogw2DrjrDxhzuG80118KHMP7XCo57934Ljq/TwVRX4594cGADblmXEEyDqeCrYiy+XPhC8RzcioHfETYmXXE4WI/jXi1PDOkiXE44CUd9pWxcmtilWxnt0k5lVbecteNuO+xsplLrOZsqT9PddviL1ADSn2fyGsvqtsO5N59c3v8O1zUC3Z7hDzHcm1cs5nVNuu2wr4+pNHrupp3V/cUj1d+X5vwdTsS+RmYqjKDcT0N/cjz9kSmvNav2iwfGj8HCfcDflXaGbcGPezpsuBfEsoTEMvAnFmf7K1gCXjPnMwhfEtYmg3YYB30s9oeT4TDYCbYocGY7EWf6+wJ/qZgDj0MvA+Cdu2PpyOFiifrJ9SS4AHYDv1bW+oURfUF8J/bjgj+l3gteUZd38ggMyGEc1aHJcDb4k4nLtZW4RMMy/YW4LwonQHz29hZ1NiV0yW9VhASl4rK/G2bDAhyv/JGgssM4668K58OFMB5io0muFZ+518CPb34EWAga9VuxMvxlMIhH1FGUvUCZb1G7wu4wBfaAg8E9ISe2/RjugbvQUe1rKRXbvhOj8Ax4AxxJO0pxw3kEnHk3pezLO/mbgV81Q3v17ZmzgXxXk7rU+TSENmlo3y/C9JyeNK+lsyix08vAWUs7Mq3BL8GxMDpVnqapMwqc/aDL9lum9dI0ddwETwX7ctMK7UNonndybc0OdtBZ6jANh8GV4DMYFMfhj+TfCBsFZe1C6urwXAh6Kjkc9NLO5/wW+DXSEXQZausVUPoTa9ZhGvh8OqI+F7HCEP+I/JnBkKohbXS4N9HZdoZT/bR3JssmwpmelrYJ6aEU5mRPMp09l1JOlpI5lo1mFmHYvDyPXfqzUb6CMCc+b4thv6LQgTMvK8VGdhaFblwu2yD2uQRy9m1L/s20XYYd7xH/twTPQ0ipl4XrwY/pYUbT0DKPmBgNnwc7BV1pSJm674Sg73Xio9J6IW0Z+MyrO+7Li0nZsla39unD8KArhLkZ9iw8F0ZAmbQq+6asEfnO0nx4rIgvIiydYYz8mZnSATfPVNxjysSB9X/DboWv40o5h4+igod/Tj4j02XoaOdkHkauzBWYR5nOOcNSVeZQ0UtLTrR/AuyYFLrkvQn66HikrZMw1SGk5BooW84ukxGh7voOsWUjuBnCIxKHDvylqY1uNKnEm0Na5kiOTjPXR5ql7ixuD3uU9G/55mlZzuGfqeRI5cQb11T6yj0KufpN5vlcHwRHl3TixH2YluUMf5NKXghysgmZHuzzcXoRy6VsYHJt/QXCAZ4A6gkyoMu/jQo9vm9fBWUbqD4shH9LusYp9WxbBo5Q/EzE8Qcom5i2bZemjTelBYnerdq1S8tpvzf4Y3lsUxzXdk+ALfq17ZexZiO4g8q+1cRK0vjblM9I27dKawD8EOl1FgZ006L+TNCZ1J44re03Qb8Ntt/Vkko+7FOh7OoWK/bMdefeoZWjoYx6nvFx+8oO2wdcB98nOmJ9Ie6V+PDQbxz2c9hCZGNwhNrNspU1+hO4FiZDq5uTDls/GGZ869igOK4uUKe67SNuG3SkoUeq9fvdsvp8izuI4zTYBeZClU5Cp559D8GFcCCMh82DXuJukrE+nzV/OewbeOuCbQ4FdahLnUF/u9CLzfMwLuhMw5ZfPNgNp9H4NtgdXOoDkRVUfh/cKX3mloM76u0QdOmA1793wSW7G0yEKTAcBiIOnndzLxvev/OSjkCappVL6hlw9NqN8PoqX4Vt3s/Hp/an6ewz3K/SmhvNDSj86T/otDZp25jU7ly6ksM2RIbADHgFBvJcNTXrOvpCYdOQnHO5vMoOh8Z0sA1cDi9Cq3fSphy1z2fhYsjuxMHWXNhy00JhqbCheWtyJ54Ox8D+0KT0ovwp0NmXcMYjc8DSscOhJxwfRnxHGAfHwQFwBIyEwcgvNNY5HyHxHF6Kox5rHcugHY57xnnPWS8t4lHmIHjEeNyMBXf67WACeJNbDH+Ag+ax5fE1D5YWcd/cVuKkR04t8g94XuILUVeybgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.home,.x-button .x-button-icon.x-icon-mask.home{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEK0lEQVRoBe2Zy28NURzHe/vwqEepYkFIQzxWaCOC2HhELEgQImhXIrqyIEXikVQi+gdIwx9AItg1NiJELMSGhKQbobY2VY9Srfp8m5lmTO/cOXN7Zu656f0ln8zMnTNnft/z+505j5sbGxurmk5WPZ3ESuu0E1xbigjncrka3jsbftClIvsU5RZ65aLK5Lj/C75SzSjHWCuJYLxqhPXwBgYhylq4sRaixChDP8EzGIJ4UwNnCR6tgFswANegKer93LsLim4herm/JKqO8O+ZRdhL42acOwunYAacg2Hu3ePYj3Ph1A1fU2ySmZSZeCiTjxaC1LAboRs6QGJl8+AKXIU1kLqlHmHEqlFboQv2gD40QdPHqx3qKdtJkD8Hb9o+TzXCXmT1cboB+cT6evTVPgIXeWYl6DoVSy3COF2Hx0rjTthp4L0a/4xXrofn33OeqH8avKMqFcE4O4uXb4ULsNfEEa+M0v00LIIuCKc/P03NrAtGrD5Iiuh10Dia1JTOR0EZsjjpw3HlrQpGbD0v3AzFig36e4CLkeAPNs6tCUbsHBxS+mpsLSayYT2KtLBqVgQjdgFe7QP1u9VWPbRc2ZQFe2LV5zSBWG7ZP+vVTUkwYhvx6DicB+fFqvWKFuyJ1QxJ00It48rCNNgnNi+N23hQaVw2YiU0cYQRq9Q9CJdBKV1q02zMeEaWSDBil1L5JTgBDeCCzcUJ8cXImfACOeqayjbBffgDfqu6cPyJP3dgVZTvwd9jdzuoSFmgicRDGAYXRIZ9+I5fPbA6KC7feUHBVKD5rJZ1EutaZMOiv+HjbWjJJ9T/LVIwDyqyh+ApuC7WFy/RCk4r5HyRwWNewRSW2N3wGv6CX2E5HBWcB9AaFOqfTxJMQa1lNewosqNQDiLDPmqv+hFsgzpfrI7/CeamVjwnQZEtV7G+eEX6MeyHGl/0hGB+1MJdYt+B/1C5H9UdX8J2qJ6IMBfz4Ri8hXIXGfZfmdoLWr5W1zJ7ktg2aId18BuiTHNvDVUumQSNxDikLSdtBzdok0yCD8MyiLNmCqhxXBL9An+egNI3yqRT9z+O92FO/O2UuOMuymoqF06bUl53489MQw21Gm8lWmkRa6R/oVaMfT6lAmrsUVMNRa2HU3I8k2orgjNp5hK+ZLwPp/x+fR+0ONfMp9BfJ+qLmulpyze1zMtC8AACbkI/xAneQZkO0JiZimUheAjPn0MfxAnWVo3RiEG5oiwLwXJsmGFDK5iCxrCnGZNSOzVLra+EPDZ9T6EMCFVZ3KWpI8XV7uBTFcEOBsWqS5UIW21OByurRNjBoFh1qRJhq83pYGWVCDsYFKsuVSJstTkdrGz8L0VTv1i+NVF2CyTJDC0LX7E8HIx7D/Vrb3wDaLvY1D5QsI/6jXZUEwk29cDlckki5bIOY9+mneB/GfbU3e4Ey5kAAAAASUVORK5CYII=')}.x-button.x-button-action,.x-toolbar .x-button.x-button-action,.x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round,.x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small{border:1px solid #010509;border-top-color:#021022;color:white}.x-button.x-button-action.x-button-back:before,.x-button.x-button-action.x-button-forward:before,.x-toolbar .x-button.x-button-action.x-button-back:before,.x-toolbar .x-button.x-button-action.x-button-forward:before,.x-button.x-button-action-round.x-button-back:before,.x-button.x-button-action-round.x-button-forward:before,.x-toolbar .x-button.x-button-action-round.x-button-back:before,.x-toolbar .x-button.x-button-action-round.x-button-forward:before,.x-button.x-button-action-small.x-button-back:before,.x-button.x-button-action-small.x-button-forward:before,.x-toolbar .x-button.x-button-action-small.x-button-back:before,.x-toolbar .x-button.x-button-action-small.x-button-forward:before{background:#010509}.x-button.x-button-action,.x-button.x-button-action.x-button-back:after,.x-button.x-button-action.x-button-forward:after,.x-toolbar .x-button.x-button-action,.x-toolbar .x-button.x-button-action.x-button-back:after,.x-toolbar .x-button.x-button-action.x-button-forward:after,.x-button.x-button-action-round,.x-button.x-button-action-round.x-button-back:after,.x-button.x-button-action-round.x-button-forward:after,.x-toolbar .x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round.x-button-back:after,.x-toolbar .x-button.x-button-action-round.x-button-forward:after,.x-button.x-button-action-small,.x-button.x-button-action-small.x-button-back:after,.x-button.x-button-action-small.x-button-forward:after,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small.x-button-back:after,.x-toolbar .x-button.x-button-action-small.x-button-forward:after{background-color:#06346a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #167bf3), color-stop(2%, #07448c), color-stop(100%, #042348));background-image:-webkit-linear-gradient(#167bf3,#07448c 2%,#042348);background-image:linear-gradient(#167bf3,#07448c 2%,#042348)}.x-button.x-button-action .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action .x-button-icon.x-icon-mask,.x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-button.x-button-action-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #ddecfd));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#ddecfd);background-image:linear-gradient(#ffffff,#ffffff 2%,#ddecfd)}.x-button.x-button-action.x-button-pressing,.x-button.x-button-action.x-button-pressing:after,.x-button.x-button-action.x-button-pressed,.x-button.x-button-action.x-button-pressed:after,.x-button.x-button-action.x-button-active,.x-button.x-button-action.x-button-active:after,.x-toolbar .x-button.x-button-action.x-button-pressing,.x-toolbar .x-button.x-button-action.x-button-pressing:after,.x-toolbar .x-button.x-button-action.x-button-pressed,.x-toolbar .x-button.x-button-action.x-button-pressed:after,.x-toolbar .x-button.x-button-action.x-button-active,.x-toolbar .x-button.x-button-action.x-button-active:after,.x-button.x-button-action-round.x-button-pressing,.x-button.x-button-action-round.x-button-pressing:after,.x-button.x-button-action-round.x-button-pressed,.x-button.x-button-action-round.x-button-pressed:after,.x-button.x-button-action-round.x-button-active,.x-button.x-button-action-round.x-button-active:after,.x-toolbar .x-button.x-button-action-round.x-button-pressing,.x-toolbar .x-button.x-button-action-round.x-button-pressing:after,.x-toolbar .x-button.x-button-action-round.x-button-pressed,.x-toolbar .x-button.x-button-action-round.x-button-pressed:after,.x-toolbar .x-button.x-button-action-round.x-button-active,.x-toolbar .x-button.x-button-action-round.x-button-active:after,.x-button.x-button-action-small.x-button-pressing,.x-button.x-button-action-small.x-button-pressing:after,.x-button.x-button-action-small.x-button-pressed,.x-button.x-button-action-small.x-button-pressed:after,.x-button.x-button-action-small.x-button-active,.x-button.x-button-action-small.x-button-active:after,.x-toolbar .x-button.x-button-action-small.x-button-pressing,.x-toolbar .x-button.x-button-action-small.x-button-pressing:after,.x-toolbar .x-button.x-button-action-small.x-button-pressed,.x-toolbar .x-button.x-button-action-small.x-button-pressed:after,.x-toolbar .x-button.x-button-action-small.x-button-active,.x-toolbar .x-button.x-button-action-small.x-button-active:after{background-color:#052d5c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #02152b), color-stop(10%, #042144), color-stop(65%, #052d5c), color-stop(100%, #052e5e));background-image:-webkit-linear-gradient(#02152b,#042144 10%,#052d5c 65%,#052e5e);background-image:linear-gradient(#02152b,#042144 10%,#052d5c 65%,#052e5e)}.x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm,.x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round,.x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small{border:1px solid #263501;border-top-color:#374e02;color:white}.x-button.x-button-confirm.x-button-back:before,.x-button.x-button-confirm.x-button-forward:before,.x-toolbar .x-button.x-button-confirm.x-button-back:before,.x-toolbar .x-button.x-button-confirm.x-button-forward:before,.x-button.x-button-confirm-round.x-button-back:before,.x-button.x-button-confirm-round.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-round.x-button-back:before,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:before,.x-button.x-button-confirm-small.x-button-back:before,.x-button.x-button-confirm-small.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-small.x-button-back:before,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:before{background:#263501}.x-button.x-button-confirm,.x-button.x-button-confirm.x-button-back:after,.x-button.x-button-confirm.x-button-forward:after,.x-toolbar .x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm.x-button-back:after,.x-toolbar .x-button.x-button-confirm.x-button-forward:after,.x-button.x-button-confirm-round,.x-button.x-button-confirm-round.x-button-back:after,.x-button.x-button-confirm-round.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round.x-button-back:after,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:after,.x-button.x-button-confirm-small,.x-button.x-button-confirm-small.x-button-back:after,.x-button.x-button-confirm-small.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small.x-button-back:after,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:after{background-color:#6c9804;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c2fa3b), color-stop(2%, #85bb05), color-stop(100%, #547503));background-image:-webkit-linear-gradient(#c2fa3b,#85bb05 2%,#547503);background-image:linear-gradient(#c2fa3b,#85bb05 2%,#547503)}.x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-button.x-button-confirm-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #f4fedc));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#f4fedc);background-image:linear-gradient(#ffffff,#ffffff 2%,#f4fedc)}.x-button.x-button-confirm.x-button-pressing,.x-button.x-button-confirm.x-button-pressing:after,.x-button.x-button-confirm.x-button-pressed,.x-button.x-button-confirm.x-button-pressed:after,.x-button.x-button-confirm.x-button-active,.x-button.x-button-confirm.x-button-active:after,.x-toolbar .x-button.x-button-confirm.x-button-pressing,.x-toolbar .x-button.x-button-confirm.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm.x-button-pressed,.x-toolbar .x-button.x-button-confirm.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm.x-button-active,.x-toolbar .x-button.x-button-confirm.x-button-active:after,.x-button.x-button-confirm-round.x-button-pressing,.x-button.x-button-confirm-round.x-button-pressing:after,.x-button.x-button-confirm-round.x-button-pressed,.x-button.x-button-confirm-round.x-button-pressed:after,.x-button.x-button-confirm-round.x-button-active,.x-button.x-button-confirm-round.x-button-active:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-round.x-button-active,.x-toolbar .x-button.x-button-confirm-round.x-button-active:after,.x-button.x-button-confirm-small.x-button-pressing,.x-button.x-button-confirm-small.x-button-pressing:after,.x-button.x-button-confirm-small.x-button-pressed,.x-button.x-button-confirm-small.x-button-pressed:after,.x-button.x-button-confirm-small.x-button-active,.x-button.x-button-confirm-small.x-button-active:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-small.x-button-active,.x-toolbar .x-button.x-button-confirm-small.x-button-active:after{background-color:#628904;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3e5702), color-stop(10%, #507003), color-stop(65%, #628904), color-stop(100%, #648c04));background-image:-webkit-linear-gradient(#3e5702,#507003 10%,#628904 65%,#648c04);background-image:linear-gradient(#3e5702,#507003 10%,#628904 65%,#648c04)}.x-button.x-button-decline,.x-toolbar .x-button.x-button-decline,.x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round,.x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small{border:1px solid #630303;border-top-color:#7c0303;color:white}.x-button.x-button-decline.x-button-back:before,.x-button.x-button-decline.x-button-forward:before,.x-toolbar .x-button.x-button-decline.x-button-back:before,.x-toolbar .x-button.x-button-decline.x-button-forward:before,.x-button.x-button-decline-round.x-button-back:before,.x-button.x-button-decline-round.x-button-forward:before,.x-toolbar .x-button.x-button-decline-round.x-button-back:before,.x-toolbar .x-button.x-button-decline-round.x-button-forward:before,.x-button.x-button-decline-small.x-button-back:before,.x-button.x-button-decline-small.x-button-forward:before,.x-toolbar .x-button.x-button-decline-small.x-button-back:before,.x-toolbar .x-button.x-button-decline-small.x-button-forward:before{background:#630303}.x-button.x-button-decline,.x-button.x-button-decline.x-button-back:after,.x-button.x-button-decline.x-button-forward:after,.x-toolbar .x-button.x-button-decline,.x-toolbar .x-button.x-button-decline.x-button-back:after,.x-toolbar .x-button.x-button-decline.x-button-forward:after,.x-button.x-button-decline-round,.x-button.x-button-decline-round.x-button-back:after,.x-button.x-button-decline-round.x-button-forward:after,.x-toolbar .x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round.x-button-back:after,.x-toolbar .x-button.x-button-decline-round.x-button-forward:after,.x-button.x-button-decline-small,.x-button.x-button-decline-small.x-button-back:after,.x-button.x-button-decline-small.x-button-forward:after,.x-toolbar .x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small.x-button-back:after,.x-toolbar .x-button.x-button-decline-small.x-button-forward:after{background-color:#c70505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fb6a6a), color-stop(2%, #ea0606), color-stop(100%, #a40404));background-image:-webkit-linear-gradient(#fb6a6a,#ea0606 2%,#a40404);background-image:linear-gradient(#fb6a6a,#ea0606 2%,#a40404)}.x-button.x-button-decline .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline .x-button-icon.x-icon-mask,.x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-button.x-button-decline-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #fedcdc));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#fedcdc);background-image:linear-gradient(#ffffff,#ffffff 2%,#fedcdc)}.x-button.x-button-decline.x-button-pressing,.x-button.x-button-decline.x-button-pressing:after,.x-button.x-button-decline.x-button-pressed,.x-button.x-button-decline.x-button-pressed:after,.x-button.x-button-decline.x-button-active,.x-button.x-button-decline.x-button-active:after,.x-toolbar .x-button.x-button-decline.x-button-pressing,.x-toolbar .x-button.x-button-decline.x-button-pressing:after,.x-toolbar .x-button.x-button-decline.x-button-pressed,.x-toolbar .x-button.x-button-decline.x-button-pressed:after,.x-toolbar .x-button.x-button-decline.x-button-active,.x-toolbar .x-button.x-button-decline.x-button-active:after,.x-button.x-button-decline-round.x-button-pressing,.x-button.x-button-decline-round.x-button-pressing:after,.x-button.x-button-decline-round.x-button-pressed,.x-button.x-button-decline-round.x-button-pressed:after,.x-button.x-button-decline-round.x-button-active,.x-button.x-button-decline-round.x-button-active:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressing,.x-toolbar .x-button.x-button-decline-round.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressed,.x-toolbar .x-button.x-button-decline-round.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-round.x-button-active,.x-toolbar .x-button.x-button-decline-round.x-button-active:after,.x-button.x-button-decline-small.x-button-pressing,.x-button.x-button-decline-small.x-button-pressing:after,.x-button.x-button-decline-small.x-button-pressed,.x-button.x-button-decline-small.x-button-pressed:after,.x-button.x-button-decline-small.x-button-active,.x-button.x-button-decline-small.x-button-active:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressing,.x-toolbar .x-button.x-button-decline-small.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressed,.x-toolbar .x-button.x-button-decline-small.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-small.x-button-active,.x-toolbar .x-button.x-button-decline-small.x-button-active:after{background-color:#b80505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #860303), color-stop(10%, #9f0404), color-stop(65%, #b80505), color-stop(100%, #ba0505));background-image:-webkit-linear-gradient(#860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:linear-gradient(#860303,#9f0404 10%,#b80505 65%,#ba0505)}.x-sheet,.x-sheet-action{padding:0.7em;border-top:1px solid #030507;height:auto;background-color:rgba(0, 0, 0, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(50,74,103,0.9)), color-stop(2%, rgba(12,17,24,0.9)), color-stop(100%, rgba(0,0,0,0.9)));background-image:-webkit-linear-gradient(rgba(50,74,103,0.9),rgba(12,17,24,0.9) 2%,rgba(0,0,0,0.9));background-image:linear-gradient(rgba(50,74,103,0.9),rgba(12,17,24,0.9) 2%,rgba(0,0,0,0.9));-webkit-border-radius:0;border-radius:0}.x-sheet-inner > .x-button,.x-sheet-action-inner > .x-button{margin-bottom:0.5em}.x-sheet-inner > .x-button:last-child,.x-sheet-action-inner > .x-button:last-child{margin-bottom:0}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{position:relative;background-color:#fff;-webkit-border-radius:0.4em;border-radius:0.4em;-webkit-background-clip:padding;background-clip:padding-box;overflow:hidden;margin:0.7em}.x-sheet.x-picker .x-sheet-inner:before,.x-sheet.x-picker .x-sheet-inner:after{z-index:1;content:"";position:absolute;width:100%;height:30%;top:0;left:0}.x-sheet.x-picker .x-sheet-inner:before{top:auto;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;bottom:0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #bbbbbb));background-image:-webkit-linear-gradient(#ffffff,#bbbbbb);background-image:linear-gradient(#ffffff,#bbbbbb)}.x-sheet.x-picker .x-sheet-inner:after{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bbbbbb), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#bbbbbb,#ffffff);background-image:linear-gradient(#bbbbbb,#ffffff)}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot:first-child .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot:last-child .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative;-webkit-box-shadow:rgba(0, 0, 0, 0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-webkit-box-shadow:none}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:-webkit-box;display:box;-webkit-box-align:stretch;box-align:stretch;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;box-pack:center;pointer-events:none}.x-picker-bar{border-top:0.12em solid #06346a;border-bottom:0.12em solid #06346a;height:2.5em;background-color:rgba(13, 117, 242, 0.3);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(158,200,250,0.3)), color-stop(2%, rgba(47,137,244,0.3)), color-stop(100%, rgba(11,101,208,0.3)));background-image:-webkit-linear-gradient(rgba(158,200,250,0.3),rgba(47,137,244,0.3) 2%,rgba(11,101,208,0.3));background-image:linear-gradient(rgba(158,200,250,0.3),rgba(47,137,244,0.3) 2%,rgba(11,101,208,0.3));-webkit-box-shadow:rgba(0, 0, 0, 0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;position:relative;z-index:2;background-color:#345b89;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #85a7d1), color-stop(2%, #3e6ca3), color-stop(100%, #2a496f));background-image:-webkit-linear-gradient(#85a7d1,#3e6ca3 2%,#2a496f);background-image:linear-gradient(#85a7d1,#3e6ca3 2%,#2a496f);border-top:1px solid #345b89;border-bottom:1px solid #182a3f;-webkit-box-shadow:0px 0.1em 0.3em rgba(0, 0, 0, 0.3);padding:0.2em 1.02em}.x-picker-slot-title > div{font-weight:bold;font-size:0.8em;color:#0d1116;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-picker-slot .x-dataview-inner{width:100%}.x-picker-slot .x-dataview-item{vertical-align:middle;height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-tabbar.x-docked-top{border-bottom:.1em solid;height:2.6em;padding:0 .8em}.x-tabbar.x-docked-top .x-tab{padding:0.4em 0.8em;height:1.8em;-webkit-border-radius:0.9em;border-radius:0.9em}.x-tabbar.x-docked-top .x-button-label,.x-tabbar.x-docked-top .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-badge{font-size:.8em;line-height:1.2em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar.x-docked-bottom{border-top:.1em solid;height:3em;padding:0}.x-tabbar.x-docked-bottom .x-tab{-webkit-border-radius:0.25em;border-radius:0.25em;min-width:3.3em;position:relative;padding-top:.2em}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{-webkit-mask-size:1.65em;width:1.65em;height:1.65em;display:block;margin:0 auto;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-label,.x-tabbar.x-docked-bottom .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-bottom .x-tab .x-badge{margin:0;padding:.1em 0 .2em 0;font-size:9px;line-height:12px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tab .x-button-icon.bookmarks,.x-button .x-button-icon.x-icon-mask.bookmarks{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAHC0lEQVRoBe2aW4hVVRiAx8t4qXFMvGZGeLcblUVWdJEoiTIhI9KoHiIyKyh6SOvBh166vPTQQ2IXkKyIktIyLQzLUoMkSbKoVEwtK2+VZWrl9H3bs4Y1e/a5eDxzDsycHz7X2muv9f/r//+11p6zt91aWloaupJ070rO6mvd4c6e8XqGO3uGe5biYDck188y1LOGeuS3Hvs8AVrrWZ0LtUU27VbIbrCRlMVsluQwBptgHEyHS+BcGAxBDlLZCOvhY/gQ/oD/oFxxuw2Fy2AKTIIJ0AuUf2EbrIF18A7shcOQX0xCPhh1KsyEVWAES+U7+j4Co/PpLtTOOB2bA7uhVJu/0fdZmFRQd9ZNBvWB6+AjKNVgVr+vGX8fNEO3LFuhzftgRu+HrZClr5S2fYydC8Ohe9AfynbZpdPJ8CTsgSwDLiWXjcs4cIj6P3AUssYsoH0kZDptO4yHFZA13rYjoJ1g8+9cWz6bn3D/UmjjdDIBGhPhoOhL5WmYBY1J47F/gkGNfAEb4Ptjt5J9ehp19/XF4N7uDToRxL28Gu4m0mavVXKH02ganoGprTeOVXTG4Bp8HdgEv4L7WxsT4WoYlLvuQRmLc50Nn2NXHwhnbg9T9QDTWTMYR9nM7YTH4WzoDy55HQp4kPQDHX8AvgEzEuuxvhD6BZu5OZxO23JIZ8rxHkj3wDBoApMQbOq0q3E43AKr4U9I61lP25hgM3GYBpVMASMZT/IvrpdCwYMgKAsl/UfAc+CKiPUZPAPXI+esWZqf6mP//eD4gUFnsZK+JuEx2AGxTesvQHNiM2fYCfooiTsaYU+9IcWMZd1nnBl4Anw8xXpdkpPB+zMgvaJ09mHI3O9ZtuI2xt0EuyC2adZd2tpM9oKHVNzBTLwKJ8XKyqmjw1PXgybWv5LrK+CrVPsBrm8rx048Bh3T4KeUbgM9CZI9kI7Il7SPjZWUW0ePS+098OAKTptF92ccCIP8FPQs11YYhw4zOQ888IJNy9eh4cZUo0tsdhhciRJ90+GXlJ14ItYN8qhK2FMH0gye7LGdI0aiF8RipN+IGypQfxcdnxXQo81lTHRrgT7HdQtdnh2LUoMadTgJR3TDa5daxQTjHoBvgqd+lvjYW5Z14wTb2vmRnFoZSn1MVVqWoNBHRloMsEtvXfpGBa7b+ZHP4QrYaqsit8QWt21Nrn7n35e576Ojw6VqDuc8WUuZdsy95oldFam2w+7ltBwlu/5FVhWptsPt9lRVvIyMVNvhyHRtqnWHaxP36lmtZ7h6sa6NpXqGaxP36lmtZ7h6sa6NpXqGaxP36lntchn25XtJkvtC0JfOvhLyxVz8Q8Af8f4SksP8+vGVTUUk9zVEm841/TrKn5q+qNNmSb+4ijqMwQEoHA5nwjlwBoyHeHX4RnI7+PbzW8b4iWMHk/iZ8riF8QZUm+PgPBgDg8EvELEc4sL3YNsYs4FyC+zCrm9FMyWfw4dQ0MSIa+F6uAb6gxH2c0c60jQl35XMrFl2Ip+iYznlKibgpIoK/Z3PRXADTIFRoPPa9F4PiMWV5Qcz7WrTd2YfoOctSl8ZOZd24itUBwZcGnfB27AbVOLSCfdLLZ3APlgLD0JvmAzx+2l1bSEgFMmHsYWUm8G3IOkvEqXadb6+dPcD+SuQHpe8M44bde5HcMJxe1y3T0AHCgXE6DsBjT8EaUd20nYnuA0MdiFd3tNeMZvO1b3tx7V43i0ePGY4/XLNTvGhxGWDX9j3ghnbAlvBfhofASPB5egydN93h1gMoJkbEjdSNwDqHQTpJWsAfMm3AQyIifDaubmtxsBYuBAc3wwFxX2RJbGzLmv3w4uwHpy4WZMg6hH323i4AybDaAjiPUmL44amGn2fvBH8ILAEDJQZMzhmWXGOjTk8b66EaXA5DIO8YobbpD26XkHdyRu9Xu61YtBPB8ywE1gE+yGf/qz2TfR/FAxWUzF74T59DeZAmAFrIEu3be32sI1Ocg64RMr6uMU4l7TP7anwA+SbQGg3c/NhApQU3OBsXDLWgJvhueAqDPpD2c5h9+pM6BMrKreOHidwFbgHg9F0qbMvgSuprO/C6fmhx6fCLNgDsb02Duvs7dCYVnAi1+jzMDofXK6x8VB/nvZTTsRG1lh0erDNBvd/sNXqsI33QkWdDRNBr0vc88KgBuOWK2Fw6FfpEt06vQB8mmiv4eZc5X3KAZU2GOtDv8t7HriENe7z+YK4T0fUsXEW+GhLHL6VymaY2BHG0jqx0w9eA4273Nr8P6p0/0pcawOmwEEj7jNvPoo9VDpcsHOAv3VdYp7gS7k22x0qORv+jb3Yh/co2E+jj6KqCIZ93PnM3I5d91ZVBLtjdVj8gyJZ39WwjOHEZi3stvmvh9VwttY23MxdSuoOd/Z01zPc2TP8PxKYOEKWmL1pAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.download,.x-button .x-button-icon.x-icon-mask.download{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGb0lEQVRoBd2aX4gVVRzH3V1dU5JMk9Q2wVxCo0QNTYRYS4l6CBFBomA1qjcjSOgPPUgR0VNBFBT0Bx96qAiSXipCH4rKIhGNUqE2SK3MqKwsLbXPZ7rnMo73jnPnzF6v9wefPefMnPP7/b7z58yZudtz6tSpMaNlPT09E/DdDxPhMpgNJyBtfTRG4AAchePk9BflqFhP1YIRqbCZsACWwjWwGIrYZ3TaDZ/ATjhIfh6IyqwywQhdRlaLYBVcB5Mgxn5n8HbYAjsQ/lGMs/pYz3AMOFLgG/AzeH+MBvo2xqqYXB1bSiyBe2EJvAaH4SSMhtC0T2MYy5jG7i0jvmXBBJoMj4D3VjuEpkVbN6axzWFyq6JbEkyAhfAqOJtmE2l32xzMZWErogsLxvE62As+Vtotrlk8czGndUVFFxKMw41wEM7FJdxMbNhuTua2sYjoXME4cVHwEDhZhACdWpqjufblCW8qmIHOxHfCT9CpIrN5mas5N53B8wS7kPgKOumezQrMts3VnJc1O8sNV1qsmq5k0LNwI3hZx9ovONgEPk4amcvRR+HiRjtb3KborbAB0fvOGJs9EnRwwf88HIHsESzbVuisbKzQdh/Yp6z/7DhzV8OEECOU3qd148z20FgDK+DC+o74in59Y2pm7rNPVWbualhT01T3e5pgts6D9eARrzIB3LXVzF0N60FNdasL5kj0sXUtzIf+eo/zt6IGtaytaUuU1AXTugKuhyomjsR5B/xRi5rUllgimCMwltYQzAHr3WJqUdNQTWOyuFDcpbASptnoMlOT2tQ4phfl3uBzwes9byZl93lpalLbXLV6SXtzr4BuPLvISkxtauxX8DjwW5Qv9t1qalPjOAX7vJoB3TRZIec0U5saZyl4ELr57CIvMTUOKngAqlxGJt478I8aBxQ8Hbpxds4eczVOV/BUuCC7twvbapyq4Ha8JPQVOIBF+hRwk9slWVLm9miy8xjbj0PRA/YHfU828eVm99mnyFziu6/9XT+Mh5as7KPIoE/BB/BPgYgeoP05/dx3OxQR4LrBF4IHoWUrK9j7wZeNzXxJGGk5amYAPvyovj2zuWGT1eEcdjwOpeYdL8mytpyBr5BAW5akroOxy4n5MiyFUqZg78W8+yvPsZfWEyQy3WzyOsbsq/n2Q9+TYMwypsbjCj4EXlJlzPHDcD/48W+0TN8PgF9kyh5YNR4y4e/AGbKsOVveC8OcCSeUSg2fir0H7oayc445qVGtY5bBHnDmjeFXxt8GY8Mn0dhSX+Ds/RvE5OZYNao1eQ/+kNJrPNapoocg9/edIgdCH3AL6DM2L7WpcZqXtKd6L/wJsXYRDl6ABVyK+i5ltbGLGfw06DPW1KbG5NY1MS+bbyD2SIbxO/G1HFo+046BG+ALCP5iS7WpsTf5MY3KPPgYTkCs8zD+XXzNLHL5hj70dwb2WbsNgp/YUk1qm2ecINh/MXoMfoTYAGG8gV6ES4Kgs5X2hZegivkk5KEmtU2qC04q/082u9gROlZRmvgmSH6lzBNMHx9pJlZF3LQPNQ2F2PXfh9noEvF18AGdHhBb/xd/d4SAzUr63AX2jY2XHq8WNU0LceuC3YCtBiecqgP7HF0XgmZL9m2AI5BONrauBrWsTsfLCnbV9AxU8ezLJnwAv2vSwa27DX6AbP/YthrU0p+OeZrgWgLO2FvB99zYoNnx+/B5dUiA+kL4FrL9YtvmroZkZg7xEn3pRqjTcRhGIDZwo/E+rpyNZ4D1Rn1it43gdzjoSZdnnGF3Yq5h74Oq76sg5D18b4PQrrI0Z3NvuKZvKLgmegqDNkPVs3aV4rK+zNWcp6TParreVHBN9ACDt8DfkHXeaW1zNNeBtMBsPVdwTfQgTt6CThZtbuY4mBWYbZ9VcEr0mx0qWrHmdlaxiZbsEWjWxuFkeBhcm7pkPNeXtDmYizkV/r/pQmc4HAQc+934ZtgBVa/GWjmAxjYHcxkf8itStiQ4OCTIbHgO9kM7z7axjGns2SGfVspSgkMAgq4EZ0b/i3U0hevbGMZaGeKXKRv+cylOCxufY/xCcS3cCl5ii6AXqjCFeum+A2/D54j0Pbu0RQsOkRHu+6zP7avgJvDsz4VWxStyD7wPrsi+hP0ILfIbFl3zrTLB6TCId3KbCK6X58MSmAOuocW69jUcrmH9U9gF38NRRB6jrNT+AwkLDdxcvfCRAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.favorites,.x-button .x-button-icon.x-icon-mask.favorites{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.info,.x-button .x-button-icon.x-icon-mask.info{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAHOElEQVRoBdWbXYgVZRjHXdf8ysjUQl011lbRIFEjM6Uu0iyiEDG86EItKoIuuhDJCgoioouugqKbgi4CKwulILG0mxLTUtMyTWQNPzLTPszU1cx+v+OZw9nZM3POmZl3zQd+zMz7zvs8z//MvF+z2nLhwoU+oaylpWUQvvvDYGiDdjgP1dbKRSccglNwlpxOcwxiLUULRqTCRsNUmAk3wS3QiG3hpp2wCbbDYfLzhyjMChOM0FlkNR3mw61wFeSxv2j8FayBrQjfmMdZpa1POA84UuD7cBzsHyHQtzHm58nVtpnEErgvzIB34Rj8CyGEVvs0hrGMaey+WcQ3LZhAQ+FZsG/1htBq0Z4b09jmMLRZ0U0JJsA0eAccTeOJ9Pa1OZjLtGZENywYx0tgDzit9La4pHjmYk5LGhXdkGAcLoPDcCle4SSxUbk5mduyRkSnCsaJi4IV4GARBSj6eALfR8sxunLEMUdzbU0TniiYho7ED8GvULRI/UV9cDbnrsauheXQCVnjmas5J47gaYJdSPwAIfqsPlfEnwRl/eBBOAlZROvXnGfFfUfXNQXTYCKsg38gS+B6bT6MEogfiTcKNuaIa87mPjHu2+segrnRBf8bYN+ql3jW+ntrJVNK6OJGw+VkVt+2M3c1DIrHsZ9WjPVwCxcLYQ4MqVQUf/Jjikt3VnnX4eauhoVlTZVw3QRTOhmWwjhQfCi7ppZjkjOf62FCrfomysxdDUtBTRWrCCZYK6WLYAo4aoa0JxKcu2x9CsYk1DdTrAa1LCpru9g2ese58lddD+cgT/9ppK2j8ONR7HLf9Um8B0XOCmpR04QoVmnQosDp4BHYD40kXMQ9zsPfgSI/hyNQhN+4j/34VVu/0g9b/nXbKFgJf0O8weV+rSa1tam1b3kUm0SB77sj5KUw18OhTE1qm6RWBy07t0O4S7veto8J6FLwbng+YHC1qbE0GDtnrYXeGKzsHj7NT2AejKgMJn36DODaASZEF1KbGof4hJ2vXM45cIW2nwjwKDyA0HXgDicyl4RpC5LovixHtalxnCcd4PwX0hTjcvEFRO5ICBRyoWNINXYo2Ek+5DJyP/6fgZWI9XVNs3r1aW3r1alxjIJHQqjR+Vt8L0fnpxzrmU+45pKzXsMG69U4UsHDYWCDjRq9zYFpCzwGLi5K5qyA+KQpSMHt5VtDHNQ4XMEh+s5R/L4CuxSIUKeDO8BX1pG4lrlDmlqrosCy0jxcoL+KK5PvgFbEOka8CKsgbRd0u/dDUPMJh7ArcXon/A4PwwxwyvkKkuwuKi5bwYqaDbdBNAP8wvn3kGQ+4RDdq1u8UE/YINUjv313L/35bLfo5Qte+xs5va5WXdFlrrRMImnkLCreaRxtSnE2i7q8n3VS3Jeq1HhWwY6o7k1Dmn/r3ZgSYCZ1g1Lqi6hS41EFHwC/QIQ0P5D7vbiH8Tq7DnD7Frr/qvGAgvfBnxDSNqcsOJx7Xe2FNjXuU/BeOAah1rHn8f0FJJkDlk85pKlNjXsV7KPeA34KCWUuM5OsN760qE2NJxXcBevBfhbCOnFqsB5G/72aQj8vVVuIN01tauyKFvPbuHBhEGJ6+hK/SSLaqBsPmrFfhZe9KND0q7ZtjiM+Ye0guIXzPS/atuPQflzLxlI4Go6AOys/wq+Gn6EoU5Pa1Fj6G7Dfpp0nfeT+EkXaOZx9jf+kJ+xqbAPcxy1vwhnOd8MuKMrUtB7fauz2HcsgBuuAQVCEHcLJ8RRHrr42kExpWqRPu3mYDTektGmmyhVe9x+QYJU/mVK5AHwF/QblU8nLWnyMrY6Rds69T4Kvd964tleDWhZUx6yItRBzo+7A8QcUEXQVfkZVB6x1zj3GfQ587YqIqw81qKV/dcxugsuiJ3OT/cr+lzf4S/gYXB0wfk69HwX8YRxN88aL2pu7Gib3iBcv8BpbDJ0QOch6fB0fNf+1HOVXwD2wE7L6T2rXic/FNbXVLLw4mNmfTuRMZi/tx8djUDYHPgAHlaSks5abs7mX/lrYI3a8ILqmwTB4G9xWZQ1uu7egHQbC/aBQR+88PpPamqs5D4t0xI89+nD1DTT0A9waOANJQeqVu+j4Ddx3u26vd3/WenM01zHVGuLnqYK9GXNeXg15RGcV0Wg7czPHjrjA+HVdwVWifRX/j6LNydzqii1pif8CSdc4HApPg0u1IqeQRp9i/D5zMBdzqjkT1NLS0BOOGuLYv+E6lWyFolZjcSGNXBvbHMxlQJRfI8emBEcOCeKo+xq4A+nNp20sYxq7PcqnmWMmwVEAgs4FR0Y32CGF69sYxpobxc9yzP3feMo7nJtJxDnWV2w6RPtsTnOZQn1118JH8A0ik/bWVNe33IKjEAh3qei87Ue5eeDTnwTNilfkbvgM1oHb1oMIdX2c2woTXJ0J4h3c3NyPgikwA9zjjigT7Xf3ce0XCfF8M+wAv3icQmQXx0LtP/qKurS9uZqyAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.more,.x-button .x-button-icon.x-icon-mask.more{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADJ0lEQVRoBe2YS2sUQRSFp5MgvmLU+CAMiBJFDBHcCeoPEFciuHMjroMK4lZBcONG0JW60U1UEgRx59IXuNMoKEElKL7GRwyIqNHxO0N66FT3UNU9IHRNFXz0VNW5t+vW6RcT1ev1Sie1rk4qVrWGgn13PDgcHPZsB8Il7ZmhqXKCw6kt8WwgOOyZoalygsOpLfFsIDjsmaGpcoLDqS3xbCA47JmhqXKCw6kt8Wyg6XAURV2wEy7BM5iFtzAKu2BB0dqJ7YEtcBYmQblfwzjshUVt5O4mfhjOwwQodw3GYA8snpd77n9pFXMYvoP+qDaZZewcVKXPAzE64Qn4CmZe9f/AFSiSu4e4IzANrXJfZ24gXjO/KxEcg9+QFZQcU/CSONh2RKsraMQhr85xE/psOeN5tCr2APyA5Bqzfl9D06tYtX3wC7KE5pg2ZX98UtsR7XZo5ayZW/1DENnyzi18CO1nyMqTNXYcrTapcitHkBLJiZW2RaGRuxcg6+Stxu6i73fI3Y3uZM7cU+hXQeVvzsBP6Dc5LupxztzaiEGH3AvR3S+Qe4dc0D2cp/Uj1oPI1pR7g030n+erWlTe9pMA3cu2Jre+2ERtzBdZe01BL3Ke9Al6vQZsTbfKQ5vImH9PXxtqa3qVPbWJjHk94J6r4DPGhK17A8EHm4j7UAWP2nTG/GX6NWMs1SW3rrCroLeLaxtDqDdG4368zbHVkzM5Polus+2hEs+j7YNxx9zv0FkfhoncvegvOuZ+iW6rYhtfTXTWgV7OyeLM3w+Y3xaf0PVIzAqwFf0IzW7XnLGOmLUg58y1JvsTzA83Y5o/eLcyMQISJAN0z56G9bE275HYNXAU7kAy9xv6p2Bj3pyxntjVcBDuQTL3FH19Dg/FWh0bXzUMNhsf23JkOQzCK9B1P4NY39OFG3kjgpeB8g/AR/gG0+3mJkeF9Lp9lkIVZkDfC1r3vPs8VTAir1uRd1mpNyQUXGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLOs7hf5j4Vg3iLoGkAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.time,.x-button .x-button-icon.x-icon-mask.time{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIPElEQVRoBdWae4gVVRzH97qr66vyhWbmurY+MA111dRMkLIXRuhG/pMVSUKGBGYPMTLDR0iaJBFUlIp/FJJlpWJS6vrAlCwTe1iaippSZipmPjL7fC/3XGbnzjkzc3fudTvwYWbO73d+jzlnzjkz96YuX75cUqiSSqWaYVs0hvZQBY3AW/7gYg/8A+fgPDFd5FiQkko6YZJUYj2hNwyDAXADlIOrHEO4A3bDVvgZ9hLfBY6JlUQSJkn14CAYAiNgFPh7kqpY5SDay2EjbCfxo7Fa25TVw/UBuw/BWvgT9HwUgl3YnQXX1ydWtc0rWRyr9zRcV8FpKESSfpuX8LMXnoDm+SYeO2GcXQfz4Cz4gyrGtSa3TaDHp1HcxGMljIN+sAGKkViYj+PEMRkax0k6csIYfgoOQVggxZa/R0ydoiYdaZZmFp6C0ZmgNTVu0YSzBQ6A1tuTYEqKk5ugA/SFkdAU4pbVNHiYpLWmu4vrztBSy83TcAai9pyeba2lz0E1tIFysD5vyMrgKugIY0GToW5MVJ/SWwltXPlIZh3SNNbdV9B/QRTH59GrhQehSZhjl5z2pucXc/4rRPEvHfV0B6dtm5CGI+B3iOLse/SehVgTiM23tx6bGuafwb8QJRY909ZlK7CHadATtOZFcfAmel28QSZ9jn0914/AYQiLScvW45Cen/yx5CSMYhNYA2GGtdGfDS38Rm3X6GpO0PNsKLPpBtXTbij8BGGxaWQODrThr0RxEuguuYzqeZ0Opf72tmt09TKxHU57+JLz7rY2QfXo3wpRkt6MXs7QrtPDKHSDfeBKVpPYjKBgXHW0mQVBz+HzrnZBMuwo6b3gilNb0Yn+9v6E30UpKCiv4WnoBD4ffuPea9q8YrE91asX9Rxb2loeBG9s/nO9YlZ6bWZf4dhc9EB4B2hJsBXtYd/AgAzHLfm0cfnYhvBlUE/aSlcE473CdMIkqyTvhU5eoe9cE8E8cvXulHwqxbvM3PRFeFzn8FqKbDTpdTQ6pof1BlQDtt5V7yzDySemYUM4Eo8mz4WgFwlb0RJbbYQm4e5U6JmwFe125tiEV7KepLWlFJp7goqW2WH0spbEkkacqOJ+UPfbylIMK+mGWl4lsLOO4DR69Tynv1y04DhSF5aiDcY7FllDqdbLSq0jmB7IKiXXkNYDrXFuK+sRHLMJG0I9o09zzEeOWDQ3DWI0lyphPbuqsJU1CFzDxdau2PVfhMSpiaupEh7uiEyJfsUNtE0IjqZFF2mmdi1R+j6eTriLI7T9yLT+/h/KBYLUHttWtPSWqYevtWlQfxjOOORJiJIaPRcJ5pAjIC1LnZVwL4fSEWSFTvhqh//IoszEtSekQYUSdpUTCLUsFbI8wOw5HvRNq75Fb3LOEpawa/Z2Gg4Q2mxpjdQ6v4KkBwa0i1Nl85G1EZZwVjGBE/Mx0GbqNgQfkvQECA3cZiSkPqWEtQG3lQoEiTxj2FkCW8E1SXVG/josJecqjnGLNlGuck4Jf+PQaIcsn4/vOSaZVLTE3Q0LwLVz095en3rXknQNlHMeWtBTLl1DFHdIri2ZtmZBaFnqo51bkmBT79660UE+vXV6DOZCVZh/dJrDUvC2956fRtYeSmaAV+A/vy/MWT5yfGr4PQNa9vw+/df6VDMRrB8NkWk0/gL+tuZ6G7JroOQeh5KU50Csz6lRbwB2NQyHwhYI+1Kqbe770D7IPvXaOmp+MAn6j5pDmkH6hywZ8yuY653I2gY5SaoO+y1hKujHMOPXdnwJnZwOoG52SNsJildFzlaCzYHqRyWVnMsOfsaAetsVyzTkdX674lrP7z5HO80F/U3CGlb6G4HLSS3ynLvqCj5fGX5ag37o/g38MX1HXc6Qzui7HolPTbv07MtFPzgKfgfm+m9kY/JNIp92+BsCmmhMDJrcJvltUaeXn689ekbfe3wSefrnWpOw9rHa3nmV/OebkLf2OyzkNf606XkNDsLbkPPrJHUa4hfAH6+51kipNnFm11cqtTa6Gko20zRsCEfiuREOgEku6LgKeXY58yasRTlsaGgjkr1bVzJp4tDHx8UQlKSp0+ozzhtnNmFVUh6DsI3At+hUeo0U+xz/KVgIJjHbcTU6dR4Df8Lat34cwdAGdDoWO9FMp5Tiezq4Hj/dAHVceinyxlkn4YxB7ViibADWo1fUnsafOmQW6KOErVdN/Yvo5PzKmZNwJmmtg6ah66gXgAHeO1ioc/y0g7kR49qIXqugWGwJl9EgyjOim6GJbCaE/mUoKIAoddgeDdvBdfONTDuuXja7gQlLmdIKwrZ5xol2ObqrYyC7BNicRq3HVm9YBPpUbHy5jifQe9Rl35pwJunBGNgV0ZkC0Z5V29BR0AHKXc79MvS1zdVmoy/Mg+PgStAr0yQ1BZw3PP1Qo2QtfEnQJLYY+liVggVHqF4O60DDXjsezax6ETf7Xo0iTUQ6toZb4Ha4E+IUbX1f4AbOD2sUmrAMkLR6egHo3TWfcopGO0G9oG2ieR2t4lw92g0qIZ+iz0XzSVYjIrz4h5XtGkvqgagTmXeoFfJcb0+B/8ey5mETBNVjvClMhjjPViES1s8qy6AiKE5XnXPSCmqIE23rBsIK0PNYiIRcNn/E53jI6/08dsLem4DTcbADdMddQSYh0we6t6BeW9pIkxZOrIUJrS3Cm6EG7gJ9TE+qaFbXLP8BbOZm76mv4XonbAIg8ZacV0B/GAvDQRNdPkVfOvQe+znsJ1HXh/tY9hNL2OuV5PWu2hyqQZsIra/6FCO6gClapn6AU7AbtDfXxuUknCHRSxwTLf8Bgi31NJnvpzwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.user,.x-button .x-button-icon.x-icon-mask.user{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEWElEQVRoBe2aS0gVYRiGO1lmF8nQQlETutGFokAiqEV0ISKwgmrdMtzUpnW7drWKbFGbQAKpJIhuUGIUFUkW0T1Jq4V2U4ui7GLPexpDD+ecuX1jHqcPHseZ+f9vvnf++e8n0d/fPyZONjZOYqU1doLHRV3CiURCz5gMxTANJsJg+8XJJ+iBt9BHNdO1SCwRZR1GbAFRl8F8WAFLoRwGLME/ffAM7kETvIYPxPWDo7lFIhiheURaCVtgBywHXXOzbhJcggZoRvR7twy+76uELSEAtQsqySPwGdQN+KWDPHuh2DI2+TIVm3T455M9G0Bk6ktRvd4NBZaiTQUT3AQnSNW/VAFBzl/iZw0kq56FcOtuaQHB7QIv9ZVkrqZ2YA9Mck3pMYGZYKeh2sBz1SJb2mqcmfk0E0xQ6l9rwNoKcWjm11JwEYFVW6t1/K218mspeB5B5VsFluKnIuU88Kml4PGBo3DPqBGZiVkKNgvKRFkGJ5aCv2Z4xoi6bCm4DWUaXERhZhMJS8FfolDq+DSbRFgKjrIOa8poYpaCTQKK2sl/wSHfcFSNlll1sSzhn7ys3pAvLFP275lu+L1uKVhBPfYbgMf0zz2mc01mKfgbT7vi+kT/CeT3sv9s6XNYCtbg4CJ0pX9U4Kv3yXk3cO6UjGaCWX5Rg/UArqY8I8yp1qdPQ08YJ4Pzmgl2nCqwc2DVyKjunuddqkE0MVPBBKYSuQ7tJtEhFj9apDczU8FOVB0ctZiuHYUw9obMjbxErW2bmblgApTQengVIkq1B83QEsJH2qzmgp2n3ObYCEGndZ3krbcuXcUWiWACldCjoA0yv6a8J6HJb0Yv6SMRrAcj+gmHA+B3aneDPHXk/8jR3LR3a2rOfnAlTmfDVPDb6Khrq8bPDI5PoRPxZpMSk+1SgtOKpTa8l8BC0JaLmAkloA1xr/aOhJqEtINGWeqW7jjHXrQHbRdw4WxSJf8L8Aeh2m1QaWoBfiUsA61PTwGtUYeZ1qlP1zhan3YraBSnz/0mdAUVHqiEESoxKs0a2AxloJIMI5DsWU0vQH2z2oZToAnFI7+fu2/BiF3PgzbCKqgC1bXhNH3S6rba4BocR7TquifzLBih5XjcCSrROaAGKbJWHt9uJuGq67fgAki4zrNaVsGIzCP3dNgE20B1VJ+uro8UUz3Xr39UvxugCeEZl3UzCkZsBZn1+W6HRaB6qtZ4pJp2PtTna+58DFoR3sVxqHFxyM8euFsIW6EeXoDeoPrBXEEbAlpqqoN1kD9YY6rYxSQ4DGoE9KOSXBGZLk4NYB7CfigZEP1XMBfVEJ0BJUznIFevaSBzEEolOimYkyo4AfocclVYtrjViB0C9SzJEdE+jrn+CWcTrHvdUKuRUSm0gPrZ0W7tGjjMhTiIVWFWSbAGEnGxhAT/y+HhsL9oiVWFjo3FqnRVqrETrG5pFmiSEAuTYC3TFMVCLSIzTg9H6wuIXR2OneDfMJq1NmzzbS8AAAAASUVORK5CYII=')}.x-tab .x-button-icon.team,.x-button .x-button-icon.x-icon-mask.team{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2ZSYgdVRSG+yUmnagRQYU4NbZKNLYKWTgg4gQOaDYqJIIGl4LixhBwoy50LSIiulEjCkpAUBBRURpdGceFMQ7YtgkOJE4xTjGa9vuedUl1Vd2qevSrFqvrwJ97695zzj3/PXd6nd7MzMzIQpJFC4msXDvCbc94l+Euwy2bgW5JtyyhOTpdhnNT0rKGLsMtS2iOTpfh3JS0rOGQ+eLT6/VWMNYJ4NjUmN9T/xLs4WfqvPxO7TU9DkTdNmvBbeAskJ7kv/n+AjwKXiSW7yibFQk3BSIPZHdTl5xZzML238DDYFlTsQS/jZF1AGQ1mAZZkkXfe9FbGwJrqmz6lL4cEmOgjhyO0jq2gGVj0hhhAl9M1FeB3gDRn4Pu/5NwQnJ0ALKqrgKHDmgzkHpjGR4oioPKP1H96+Dn8GvpKyLqneV5Lp0XgnHggTMFJjlYPqAcpnyLsz/LHBLL0fRfCzwbvNN3gLeI5WXKaik7DbF2/20A28HPYF+CPZQfg9tj9vS5h18DRSdyrO0j9FeW+PQenwTe138AJ+d34OPFa215zDa0l15LOLgamM0DIBukbQ60JjhLl7RL+HWQtSv7jhLGz1FgM3DJZ30Yy69gYzqGonrVHr4eJ+OgB7Ji2xi4lGUW8+PsD0vOwNGNwInMirF42K0nlmXZzvR3LNARDN3fx6WVI3VJF50Fzvr7EZtY8zQdLtUiOYXGIrJpXUmvTDdk61HCKEqiagD9SSwnLCeX3RYwSJafRd/zoUj2FzVm2hyzMJ6gV0Y46Myl/BzjeqfnyMg36G5NJqpoTPvnLGWEnS0f9lVStL/7NgT/C5XNoHTW6XesV4En/1wlGo+Oo4QJ1ivoxxqju+fKCG2lf1uFH7P3eEl2K8xndRt3VKKEE4sPKWOHiCreg28TaPR1RN/X6GwEO0GReJ3cg95kUWeqzT8W6KtMpujcVaZQRfgFjL8qcbCDvndi/Zz0h4Hr6L8JHBHRW0L7DejdAU6K6Nj8CfBQi4mH4xYmrmy1sXlK/gCAAyfkQaAT91kWj9HW/6tJ8MO3NmeC+4CHlqdu1q7o25Xk5Hqynw+WBp+hpO1K4JItsnfr5GyCbSirCHstnQpcKulBXMK+o1frCPGgWAomwL2gLsm0z3S9ny38XARWgEXJOI7xNMiS9ns9MN5ZCQhEQ1lIGCOXmZf4ZeAW8C4IAblv3wBXAIn6sjkZ3Arc80FvGKW/nu4H/nhZDiR0IngI+LYPY3i43gWuAeNgFBQSn0UYJZejRH3CPQ8cMDi19Jp6AviuVfd48ADwRZXWG3Z9J/6fApeAJUm2TYRE02OZjPfA3WAM9HVDdvt2iXHI1HkoPQd2g7SjUHef+NyU7AXgFRD65qOcZrybQXgFmtUDIDu2xE3CBuCWWBxIU+8vk9MozdQukDUO3x4qm5IJOp36ZyW6waaJci/jrkviWEV9qiQOdd8Ebr/+T0fKkYvBp6AqOB2fnQz0SA39Kn9z6Z9mfPeze/UlUOXrB3Q2AW36a77KwP7tYCwh7Mupjk1TOmZuNInlyZqxuN8n3ItrQF1xryvRl9W/3Y3/60QGCTGF71h5JB0Tbn7vsDqyP6Vkva5dymxoVQ+lIE6+3+lJCH3Zcp+E78y2Fny7Evw7kstC8YA7BtQZRP1hiwTDKnuGun8aSiekaDxXwrbG/zOtaOT/ss3MLSjpCLc93V2Guwy3bAa6Jd2yhObodBnOTUnLGroMtyyhOTpdhnNT0rKGfwD3f6JVZi/xSQAAAABJRU5ErkJggg==')}.x-tabbar-light{background-color:#475c76;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #96a9c0), color-stop(2%, #546e8c), color-stop(100%, #394b5f));background-image:-webkit-linear-gradient(#96a9c0,#546e8c 2%,#394b5f);background-image:linear-gradient(#96a9c0,#546e8c 2%,#394b5f);border-color:#3d5066}.x-tabbar-light .x-tab{color:#b6c3d3}.x-tabbar-light .x-tab-active{color:white}.x-tabbar-light .x-tab-pressed{color:white}.x-tabbar-light.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab .x-button-icon{background-color:#768fad;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5dde6), color-stop(2%, #8ca1ba), color-stop(100%, #607d9f));background-image:-webkit-linear-gradient(#d5dde6,#8ca1ba 2%,#607d9f);background-image:linear-gradient(#d5dde6,#8ca1ba 2%,#607d9f)}.x-tabbar-light.x-docked-bottom .x-tab-active{background-color:#506986;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a6b6c9), color-stop(2%, #5e7a9c), color-stop(100%, #43576f));background-image:-webkit-linear-gradient(#a6b6c9,#5e7a9c 2%,#43576f);background-image:linear-gradient(#a6b6c9,#5e7a9c 2%,#43576f);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab-active .x-button-icon{background-color:#003370;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0056bd), color-stop(50%, #003f8a), color-stop(51%, #003370), color-stop(100%, #002757));background-image:-webkit-linear-gradient(#0056bd,#003f8a 50%,#003370 51%,#002757);background-image:linear-gradient(#0056bd,#003f8a 50%,#003370 51%,#002757)}.x-tabbar-light.x-docked-top .x-tab-active{background-color:#3d5066;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2a3746), color-stop(10%, #344356), color-stop(65%, #3d5066), color-stop(100%, #3e5167));background-image:-webkit-linear-gradient(#2a3746,#344356 10%,#3d5066 65%,#3e5167);background-image:linear-gradient(#2a3746,#344356 10%,#3d5066 65%,#3e5167);color:white}.x-tabbar-dark{background-color:#141e29;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #466890), color-stop(2%, #1f2f41), color-stop(100%, #080c11));background-image:-webkit-linear-gradient(#466890,#1f2f41 2%,#080c11);background-image:linear-gradient(#466890,#1f2f41 2%,#080c11);border-color:#0c1118}.x-tabbar-dark .x-tab{color:#5a81af}.x-tabbar-dark .x-tab-active{color:white}.x-tabbar-dark .x-tab-pressed{color:white}.x-tabbar-dark.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab .x-button-icon{background-color:#354f6e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7c9bc0), color-stop(2%, #416086), color-stop(100%, #293e56));background-image:-webkit-linear-gradient(#7c9bc0,#416086 2%,#293e56);background-image:linear-gradient(#7c9bc0,#416086 2%,#293e56)}.x-tabbar-dark.x-docked-bottom .x-tab-active{background-color:#1c2a3a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4e74a2), color-stop(2%, #283b52), color-stop(100%, #111922));background-image:-webkit-linear-gradient(#4e74a2,#283b52 2%,#111922);background-image:linear-gradient(#4e74a2,#283b52 2%,#111922);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab-active .x-button-icon{background-color:#0a7aff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #57a3ff), color-stop(50%, #2488ff), color-stop(51%, #0a7aff), color-stop(100%, #006df0));background-image:-webkit-linear-gradient(#57a3ff,#2488ff 50%,#0a7aff 51%,#006df0);background-image:linear-gradient(#57a3ff,#2488ff 50%,#0a7aff 51%,#006df0)}.x-tabbar-dark.x-docked-top .x-tab-active{background-color:#0c1118;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #000000), color-stop(10%, #030507), color-stop(65%, #0c1118), color-stop(100%, #0c121a));background-image:-webkit-linear-gradient(#000000,#030507 10%,#0c1118 65%,#0c121a);background-image:linear-gradient(#000000,#030507 10%,#0c1118 65%,#0c121a);color:white}.x-tab.x-item-disabled span.x-button-label,.x-tab.x-item-disabled .x-hasbadge span.x-badge,.x-hasbadge .x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-button-icon{opacity:.5}.x-tab.x-draggable{opacity:.7}.x-tab{-webkit-user-select:none;overflow:visible !important}.x-toolbar{padding:0 0.2em;overflow:hidden;position:relative;height:2.6em}.x-toolbar > *{z-index:1}.x-toolbar.x-docked-top{border-bottom:.1em solid}.x-toolbar.x-docked-bottom{border-top:.1em solid}.x-toolbar.x-docked-left{width:7em;height:auto;padding:0.2em;border-right:.1em solid}.x-toolbar.x-docked-right{width:7em;height:auto;padding:0.2em;border-left:.1em solid}.x-title{line-height:2.1em;font-size:1.2em;text-align:center;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 0.3em;max-width:100%}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 .3em}.x-toolbar-dark{background-color:#24364c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5a81af), color-stop(2%, #304864), color-stop(100%, #192533));background-image:-webkit-linear-gradient(#5a81af,#304864 2%,#192533);background-image:linear-gradient(#5a81af,#304864 2%,#192533);border-color:black}.x-toolbar-dark .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-dark.x-docked-top{border-bottom-color:black}.x-toolbar-dark.x-docked-bottom{border-top-color:black}.x-toolbar-dark.x-docked-left{border-right-color:black}.x-toolbar-dark.x-docked-right{border-left-color:black}.x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before{border:1px solid black;border-top-color:black;color:white}.x-toolbar-dark .x-button.x-button-back:before,.x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-button.x-button-back:before,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before{background:black}.x-toolbar-dark .x-button,.x-toolbar-dark .x-button.x-button-back:after,.x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button.x-button-back:after,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after{background-color:#141e29;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #466890), color-stop(2%, #1f2f41), color-stop(100%, #080c11));background-image:-webkit-linear-gradient(#466890,#1f2f41 2%,#080c11);background-image:linear-gradient(#466890,#1f2f41 2%,#080c11)}.x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e7edf3));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e7edf3);background-image:linear-gradient(#ffffff,#ffffff 2%,#e7edf3)}.x-toolbar-dark .x-button.x-button-pressing,.x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar-dark .x-button.x-button-pressed,.x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar-dark .x-button.x-button-active,.x-toolbar-dark .x-button.x-button-active:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-button.x-button-active,.x-toolbar .x-toolbar-dark .x-button.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after{background-color:#0f161f;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #000000), color-stop(10%, #070a0e), color-stop(65%, #0f161f), color-stop(100%, #101721));background-image:-webkit-linear-gradient(#000000,#070a0e 10%,#0f161f 65%,#101721);background-image:linear-gradient(#000000,#070a0e 10%,#0f161f 65%,#101721)}.x-toolbar-dark .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light{background-color:#354f6e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7c9bc0), color-stop(2%, #416086), color-stop(100%, #293e56));background-image:-webkit-linear-gradient(#7c9bc0,#416086 2%,#293e56);background-image:linear-gradient(#7c9bc0,#416086 2%,#293e56);border-color:black}.x-toolbar-light .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light.x-docked-top{border-bottom-color:black}.x-toolbar-light.x-docked-bottom{border-top-color:black}.x-toolbar-light.x-docked-left{border-right-color:black}.x-toolbar-light.x-docked-right{border-left-color:black}.x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before{border:1px solid #030507;border-top-color:#0c1118;color:white}.x-toolbar-light .x-button.x-button-back:before,.x-toolbar-light .x-button.x-button-forward:before,.x-toolbar .x-toolbar-light .x-button.x-button-back:before,.x-toolbar .x-toolbar-light .x-button.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before{background:#030507}.x-toolbar-light .x-button,.x-toolbar-light .x-button.x-button-back:after,.x-toolbar-light .x-button.x-button-forward:after,.x-toolbar .x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button.x-button-back:after,.x-toolbar .x-toolbar-light .x-button.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after{background-color:#24364c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5a81af), color-stop(2%, #304864), color-stop(100%, #192533));background-image:-webkit-linear-gradient(#5a81af,#304864 2%,#192533);background-image:linear-gradient(#5a81af,#304864 2%,#192533)}.x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e7edf3));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e7edf3);background-image:linear-gradient(#ffffff,#ffffff 2%,#e7edf3)}.x-toolbar-light .x-button.x-button-pressing,.x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar-light .x-button.x-button-pressed,.x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar-light .x-button.x-button-active,.x-toolbar-light .x-button.x-button-active:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressing,.x-toolbar .x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressed,.x-toolbar .x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-button.x-button-active,.x-toolbar .x-toolbar-light .x-button.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after{background-color:#1f2f41;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0f161f), color-stop(10%, #172330), color-stop(65%, #1f2f41), color-stop(100%, #203043));background-image:-webkit-linear-gradient(#0f161f,#172330 10%,#1f2f41 65%,#203043);background-image:linear-gradient(#0f161f,#172330 10%,#1f2f41 65%,#203043)}.x-toolbar-light .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-navigation-bar .x-container{overflow:visible}.x-desktop .x-toolbar .x-field-search{padding-left:1.06em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255, 255, 255, 0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-field{width:13em;margin:.5em;min-height:0;border-bottom:0}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.3em;border-radius:0.3em;background-color:white;-webkit-box-shadow:inset rgba(0, 0, 0, 0.5) 0 0.1em 0, inset rgba(0, 0, 0, 0.5) 0 -0.1em 0, inset rgba(0, 0, 0, 0.5) 0.1em 0 0, inset rgba(0, 0, 0, 0.5) -0.1em 0 0, inset rgba(0, 0, 0, 0.5) 0 0.15em 0.4em}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:black}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.8em;border-radius:0.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-webkit-border-top-right-radius:0.8em;border-top-right-radius:0.8em;-webkit-border-bottom-right-radius:0.8em;border-bottom-right-radius:0.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-indexbar-wrapper{-webkit-box-pack:end !important;box-pack:end !important;pointer-events:none}.x-indexbar-vertical{width:1.1em;-webkit-box-orient:vertical;box-orient:vertical;margin-right:8px}.x-indexbar-horizontal{height:1.1em;-webkit-box-orient:horizontal;box-orient:horizontal;margin-bottom:8px}.x-indexbar{pointer-events:auto;z-index:2;padding:.3em 0;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important}.x-indexbar > div{color:#1e2a38;font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-phone.x-landscape .x-indexbar > div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{-webkit-border-radius:0.55em;border-radius:0.55em;background-color:rgba(143, 152, 163, 0.8)}.x-list{position:relative;background-color:#f7f7f7}.x-list .x-list-inner{width:100%}.x-list .x-list-disclosure{position:absolute;bottom:0.44em;right:0.44em}.x-list .x-list-disclosure{overflow:visible;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFNkNCM0JGNTZFMjI2ODExQkNGQjkwMzk3MDc3MkZFQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3M0MzQUU1QUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3M0MzQUU1OUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU3Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU2Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+uoWjuwAACh9JREFUeNrUm2toVdkVx7eJRqPRaHzFGBOjidGYaLQaX9GREXXAkloYQVpT+qFYBkcqLS0zTKFQWpwv86F0KLRfHFqnWDq0UCsMFYqlqHSwGo2v4Du+X9FoNL5P12/N3rLn9Cb33HNvrnHDujfnnHvO2f+91l57/dfaGWBe8xYEQUq/H5ilftWIVIoU2+Ov2e/jIt0inSKnRVpEnvdlR/oK8CKRt0QaRd4QyU3hXkDvFvmXyOeZHoABGXzWWJF3RL4rUuFfKC4uNmPHjjUjRozQ44kTJ+r3jRs3zNOnT013d7e5deuWuXTpknnx4oV/602RP4n8TqQ1EyadCcBlIh9YoHmcqKioMFOnTjXl5eVm1KhR5smTJwrs+fPnCohvOjpw4ECTk5Ojwt/5+fnmzp075vr16+bkyZPm1KlT/nv+KvJLkf++KsCAe89KPidmz55t5s6dawoLC839+/fNo0ePFCwgHjx4oMe0u3fv6vfw4cNNbm6uGTRokCkoKNDBycvLU+DDhg3TQTp27Jg5fPiwuXfvnnvvJyI/EunIJmCczqci1RzMmzfPLFiwQF9Ox65cuWKuXr2qZoqk0ikGa/z48WbcuHFm0qRJOihDhw41LS0tZu/evToI1sl9W2RXNgC/K/IRGp42bZpZsmSJasSZ4fnz51WbmWiDBw9W0NXV1TrvOd6zZ49pbX05nd8XwB/2FWA87a+tYzKLFi0yixcvVoCY3NmzZ8MOJ6OttLRUpwy+4dy5c2bnzp3u0h9FvifAuzMJmPm6Q+SbHGzYsEHn3P79+83Ro0fVCWWrVVZWmqVLl+rfO3bsUA8v7QuRbwjoa5l6z2/xD7KsBJs3bw7WrVsXiINh8rwSGTJkSLBmzRrtS1lZmTv/H5wnc7o3iTpnA1k69AXLli0LZAmJ1VGeQWfFEek3x3FBc684ymDLli0+6E/TBfymyDMeJmasL4jbSe4bPXp0MGvWLJX6+vpAApJAlqTYoAcMGBDU1NQEmzZtCsRxuvPvxQVM7Hubh4gnDsRJxdYsInM+kOUrkHVXj/lmAGVOBuJ909K0rBZBc3OzO4eCmuIA/jcPkEAiWLVqVVqdQjA7WWLc8TZ3ns7W1tYGstaqxuI8m8GbM2dOIKuGO3dDpCAVwCw9QUlJSbB+/XrfXGLLzJkzffMtFNko8pjjyZMnq4njFONOGRSyevVqNXF77hdRARc4U167dm0wZsyYjHhW5m0IsLFMCm0EEl0FDQ0NgZCMl2afqjBgTU1N7vg+PCUK4B9yw/Tp0wNZ6NOatxEAO/JxxC03mCWmH8eZMVBVVVVBXV2dO/ebMOCcEFhIwI/5g1j2woUL5tmzZ30dS7SLLBb5DHKxb98+jaVhXDIAKT2IAIgYnnjcto3iF6r934QBr4G+Tpkyxdy+fdt0dXVlK4DiRetEfs7BgQMHtPPE6rAm6XTkBz18+FDJC2GoDYc39ga4mQ9ZL5UMZEG74fYzC7zrzJkzSitlaqnG4MxRGvH8zZs3daBs+5YMWG6iFE+R1bA+HD6bNBCXkcfsioqKNJsBl+1JGwT9J06ciNLnz0TaRP5+8eLFMvohnlfJCVQzihLQMoMF05JnFNsAanf4dxCDoLy8XIOBKGsiyxXLjUyBQEY0FQdTGDFltMdFVAQ+MmiR4wGiONZme7w1kdNayYcsQ0rio8SdaBa2wuhnigOH8lmryGfRF5gZaSDYEvw7qVMQ/4PF+djCc7iBD9ItUTtPNoK5blu5pZtRpDMi6Cci3xfZjBNua2tTc8WZ8e7e5jWK8GhrvVhJng841+aOdY643FPSjEBubrac2cciK8hjQf6vXbumzowcWE99ACyKGzlypMNX6QNmYueTO3r8+HFWCX0KjTz1AtK1WNXx48c19TNhwgS1ykQNLFiCR4ZeAsZBqMe1SbL+2k7bIGUX2iNIIectsbjmu8INLN7yNNEHXKBrlDiFfqrdcJDydZEPXZDinG0is/YcV6EPWA+42JeJuAy390XW49hI2JNjC8cAYEGJvlJzzOvb8mztStPFeOUkS2muH2l1OxOIGsK94kZU+BdLL1W7xM/hBhYvMuv0NdzhvFoWl5q4rY6pC1iWnIULFxI+6vocbpizt8R2+IDb/egkFXaS5Ub4u496HYU64b2GYARml8j3hIKo9rCGOyh84d69id6f2gfWjAsIOgAMGaEwlwisIzaucGe+LL5/hS1RiH4Tk+5n6zGB8+9F3uaAWhZ9O3ToUK+MDqURSFkNd4lDaw976f18YPPeYp00w9DHrcxWFN6GMKxYsUKJzZEjR5LSV8B6DviLROThn3wQtuEMonhrXko6xrYLGaaHb1iwdSUlJapZ4mjMOEqsT0jZ2fmSo+xOBBgNd7icUBQK1tHRob8jJeTFrJlopGX+QYxP4qCqqkqLdlQqoyQAMGeXtbFtV6KMR7fNNmzExZPBSEYTGWm4MLy4trZWHV4iD8854t3t27frjoAkwcRHtp6lmQ46jgnjfKIWw1iXWW3IeuCb5L7WRIBpnwAY+kUBmpRKb86LDhDhXL58WcH3Ng0izPevBBPLly/XKXPw4MGUkgs4XTKunnb/kOweFnWtBGQqCZ8kL+2CibNcE2sJVq5cGQj1i1XeIRlPzcpLxhf1lpemsVNGQzWSYB7byEowIQOtjglCQOSXSmPuwo897X4sIDt6S9PS2B7Uwh4qzBAvnIn4uof593/BBPOVKRKHteE48T04N0sjfxX13kY/W0gBO12TnjFjhl+UI8PyZ3eNcix1pXTeQ5mGSqfMX3fuB6mWS3Wbg5iI1pjSLZeWlpZqldAen3JpXgkmtBZEh+M+G99ATQmx5w7hv1IFDGE+aWwNFw2lA5r6L46LEqyx9WKcU0VFRVoFOwposqKohdhz0KaauFse6o2t4eI1SYTH7RzTg2Q9SXuhdLobAPOLWwQ3tvpPebWxsdE/35zuphaCdt3nQSmTykQ6+zLoJLXgdIvsaNaB9erJWzOxi4f2jnvR/Pnz1cTTmXNxC95OZKnUGnII7LZkYFPdpviueyHOAUeGV01n61GcaYFlUKzHI3vXtvXkpNIB7Mz7ofPemDhOJ50NKalolXcSReEHvGtbowB1EieXgyNjG6JW1mEylDwIFoi9U42OkjXSNLA3oj6Ykle4g/t9R0D8LZXnxU1esWRttXM7lwwJNA6qCL2EpMO44iYIXNaFyMlFeu3t7Zq78ugeBbZz2d4RX2mBa/oFTRPLQs+ggfBlGA/gYV09hYvQR5eScRvF+Zt7iOm92JjMxU9snam3kLXPALvWYHlsoztBmgjtIGiazkMhw6ABC4+GpADa/QuA5bJ+Temn5sv/f4gSo/c5YNfYKd9kGVBdOCmO5hI1pkAC3t1uExKfmwTbFfoL4HACDlN/y5p+RZLfU/Fvs+BgbK1psLBXAjhR+qauh2unTfRdAa8N4D5pqQL+nwADAKGFDQ//Deb9AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:1.7em;background-color:#003370;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0a7aff), color-stop(2%, #004394), color-stop(100%, #00234c));background-image:-webkit-linear-gradient(#0a7aff,#004394 2%,#00234c);background-image:linear-gradient(#0a7aff,#004394 2%,#00234c);width:1.7em;height:1.7em}.x-list.x-list-indexed .x-list-disclosure{margin-right:1em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-list-item{position:relative;color:black}.x-list .x-list-item .x-list-item-label{min-height:2.6em;padding:0.7em 0.8em}.x-list .x-list-item.x-item-pressed .x-list-item-label{background:#77b2f8 none}.x-list .x-list-item.x-item-selected .x-list-item-label{background-color:#06346a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #167bf3), color-stop(2%, #07448c), color-stop(100%, #042348));background-image:-webkit-linear-gradient(#167bf3,#07448c 2%,#042348);background-image:linear-gradient(#167bf3,#07448c 2%,#042348);color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-list-header{position:relative}.x-list-header-swap{position:absolute;left:0;width:100%;z-index:1}.x-ios .x-list-header-swap{-webkit-transform:translate3d(0, 0, 0)}.x-list-normal .x-list-header{background-color:#4d80bc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bccfe6), color-stop(2%, #6792c5), color-stop(100%, #3f6ea6));background-image:-webkit-linear-gradient(#bccfe6,#6792c5 2%,#3f6ea6);background-image:linear-gradient(#bccfe6,#6792c5 2%,#3f6ea6);color:#1f3651;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;border-top:1px solid #4d80bc;border-bottom:1px solid #2d4e76;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-list-normal .x-list-item .x-list-item-label{border-top:1px solid #d1d1d1}.x-list-normal .x-list-item:first-child{border-top:none}.x-list-normal .x-list-item:last-child .x-list-item-label{border-bottom:1px solid #d1d1d1}.x-list-normal .x-list-item.x-item-pressed .x-list-item-label{border-top-color:#77b2f8}.x-list-normal .x-list-item.x-item-selected .x-list-item-label{border-top-color:#084b9b;border-bottom-color:#021022}.x-list-round .x-scroll-view{background-color:#EEEEEE !important}.x-list-round .x-list-disclosure{-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAtpJREFUeNrs2k2IVlUYAODndZyaUfMnakxsERU5JChUCBIG0s8iaNGPBa0sSkUQJdq0CGnRzypyJS0SddPCsFr0QxtxlURmbcW0NlqgZg6CyuRp4RmYxUz3Bvf7Zo6eF87qu3zffXjPPe97zv0ipeRmijlusqjgCq7gCq7gCq7gCq7gCi4BHBHLIuKpiFh0Q4PjeoziLXyAjRExPBvAc3uAHcCj2IRnMQ+LcTYivkopXZhJcHS5H46I2/AMXsVjGJz08S84gD0ppTPFZzgi7szQjRid4pLVWIahiNidUjpd+jM8H89Pg52IEbyOrRExUjr4LD7FiYbrlmb0loi4p+/ilFJnA4vwCn5EahhnsBururyHxnvs/Au5BS/iaAv0JezHymLBGT2MF/ATxhvQY9iDhyaqRnHgjB7MdfhrXGlAX8QXeKRYcEbPyU3Il/inAT2Og3i4WPAk9Nqc6csN6Kv4HOuKBWd05Ezva4Eex7d4EgNd38vcPpW+FBFHcB7X8FJe2KaKATyOBbmDO5RSGp+VdbhltkfxSV6d/yvT13AYT2OoqCk9BXpFLlmpxfgGS7v67b6feETErbgvNyhN8Rd+zWWtvCmdkRtwpEVtHsNHuL+4VTpjh3L3dazFNB7DXtxbalmayGyb5/ZcbjVXltp4LMmHAm2wp/AuHiy1tVyIHTjeAvsn3sRIqZuHhdiO31pg/8B7uKPU7eFibGuJPY13sLzUA4Db8UZL7Em8jbuKPADAcuzE7y2wP2Nzr5/ZnoHzNH4/l5Um7Am8jOF+t7Vd7pYCd+cGY9rGLmM/xMGU0uViTy0zeA0+xoVpMns0T+MFM7Fp6TTD6br6h4g4n/e9z+GBSZccxi58l1K6NGMvl3pUlkbwGr7PmT2GJ3pxgvF/R/Tqz6URMR/r88u1Q/is05OL2fD2cAr0YK7Lf8/IAtVvcP2PRwVXcAVXcAVXcAVXcAVX8I0T/w4ADBKP+GttJ+EAAAAASUVORK5CYII=') no-repeat;background-color:#777777;background-image:none}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(30%, rgba(238,238,238,0.9)), color-stop(100%, rgba(238,238,238,0.4)));background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-label,.x-list-round.x-list-grouped .x-list-item-label{border:solid #DDDDDD;border-width:1px 1px 0 1px;background:#fff}.x-list-round.x-list-ungrouped .x-list-item:first-child .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-ungrouped .x-list-item:last-child{margin-bottom:13px}.x-list-round.x-list-ungrouped .x-list-item:last-child .x-list-item-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;border-width:1px}.x-list-round.x-list-grouped .x-list-header-item .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-item{margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-item .x-list-item-label{border-width:1px;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-dataview-inlineblock .x-dataview-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-paging{height:50px}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;color:#06346a;padding-top:10px;-webkit-border-radius:6px;border-radius:6px}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:-webkit-box;display:box;-webkit-box-orient:horizontal;box-orient:horizontal;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background:center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA8CAYAAAAUufjgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNrsmU8oREEYwOexdtNuKBfFwdVhCyfuysnFiXISS+1BLopyUpKLXETkRLaUi1LK3Q2lpPbiQLnIn03a/Hm+z86Ttv0zM++bfbOar36Hbad5v535Zp7v47iuy0wOpyoEHccRHV9L9NxPkUE/bhKCOKiOSPAdn69DsJ5I8E2HYA0QJRJ8Bb50CDYRCT7pEMQD0kwk+CByUFQEW4gE73UIhoA2IsFb4ENEMCQ5MdU1IxwygpT3oKNLMGyyYFVscdhusc8tDpu+xRG7xf95BW0O2kNiV1AgIvaQ2BzUJNgJNJYZGyUU7OG1cal4Bi68oqkDPszy2teEwJp5Cdyu/lZ1g8CwIYJ7wEF+2YmrNw90Byx3BizgKhaqizEP1wg7CLLxCEzy/CtauMeBlQDyEfNuGrgU6SyM8F9SyVgHdmRaH6tAb4XkToEp2d4M5mOK0TWMigU2koa8vJMRZPxEb2ss2LEVPMpPLlMRxBgDZjQJLgNbxb6Uab9tAn3EcifAeKkBMoLY+j0GWonk7oB+lmsFkwhidAGHBPmIeTcAnJcbKCuIMQEs+hScAzZEBqoIYuzyFVCJI36lMJ2CDfxibZeUu+EX/4uMIFP8ZyLejxkgK0hG5a8kP4IYSZbr1IuQVHmAX0HGX4VuGfZVJ6cQxPd1uoRcWqDW0SroFVzZAnJZ/h0LWhAjUUAw4XdSSsH8fExRTEgtGAOuOTETBb16Jk412e+bxOSwglYw6PgWYABvLk8P7zGJFwAAAABJRU5ErkJggg==') no-repeat;background-size:2em 3em;-webkit-transform:rotate(0deg)}.x-list-pullrefresh-release .x-list-pullrefresh-arrow{-webkit-transform:rotate(-180deg)}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;margin-bottom:0.1em;text-align:center}.x-list-pullrefresh-updated{text-align:center}html,body{width:100%;height:100%}.x-translatable{position:absolute;top:100%;left:100%;z-index:1}.x-translatable-container{position:relative}.x-translatable-wrapper{width:100%;height:100%;position:absolute;overflow:hidden}.x-translatable-stretcher{width:300%;height:300%;position:absolute;visibility:hidden;z-index:-1}.x-translatable-nested-stretcher{width:100%;height:100%;left:100%;top:100%;position:absolute;visibility:hidden;z-index:-1}.x-layout-fit,.x-layout-card{position:relative;overflow:hidden}.x-layout-fit-item,.x-layout-card-item{position:absolute !important;width:100%;height:100%}.x-layout-hbox,.x-layout-vbox{display:-webkit-box}.x-layout-hbox > *,.x-layout-vbox > *{-webkit-box-flex:0}.x-layout-hbox{-webkit-box-orient:horizontal}.x-layout-vbox{-webkit-box-orient:vertical}.x-layout-hbox > .x-layout-box-item{width:0 !important}.x-layout-vbox > .x-layout-box-item{height:0 !important}.x-table-inner{display:table !important;width:100%;height:100%}.x-table-inner.x-table-fixed{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-row > *{display:table-cell !important;vertical-align:middle}.x-container,.x-body{display:-webkit-box}.x-body{overflow:hidden;-webkit-box-flex:1;min-width:100%;min-height:100%}.x-body > .x-inner,.x-container > .x-inner{-webkit-box-flex:1;min-width:100%;min-height:100%;position:relative}.x-docking-horizontal{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:horizontal;min-width:100%;min-height:100%}.x-docking-vertical{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:vertical;min-width:100%;min-height:100%}.x-centered{position:absolute !important;width:100%;height:100%;display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-floating{position:absolute !important}.x-centered > *{position:relative !important;-webkit-box-flex:0 !important}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector > *{visibility:hidden}.x-size-change-detector-shrink > *{width:200%;height:200%}.x-size-change-detector-expand > *{width:100000px;height:100000px}.x-scroll-view{position:relative;display:block}.x-scroll-container{position:absolute;overflow:hidden;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid > *{display:table-row}.x-scroll-bar-grid > * > *{display:table-cell}.x-scroll-bar-grid > :first-child > :first-child{width:100%;height:100%}.x-scroll-bar-grid > :first-child > :nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid > :nth-child(2) > :first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x > .x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y > .x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:2;opacity:0.5}.x-scroll-indicator.default{-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff;opacity:1}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.csstransform{background:none}.x-scroll-indicator.csstransform > *{position:absolute;background-color:#333}.x-scroll-indicator.csstransform > :nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-light > *{background-color:#eee}.x-scroll-indicator.csstransform.x-scroll-indicator-light > :nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-y > *{width:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :first-child{height:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :nth-child(2){height:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :last-child{height:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > *{height:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :first-child{width:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :nth-child(2){width:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :last-child{width:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-carousel{position:relative;overflow:hidden}.x-carousel-item{position:absolute;width:100%;height:100%}.x-carousel-item > *{position:absolute;width:100%;height:100%}.x-carousel-indicator{padding:0;-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:none;background-color:transparent;background-image:none}.x-carousel-indicator{-webkit-box-flex:1;display:-webkit-box;display:box;-webkit-box-pack:center;box-pack:center;-webkit-box-align:center;box-align:center}.x-carousel-indicator span{display:block;width:0.5em;height:0.5em;-webkit-border-radius:0.25em;border-radius:0.25em;margin:0.2em}.x-carousel-indicator-horizontal{height:1.5em;width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;box-orient:vertical;width:1.5em;height:100%}.x-carousel-indicator-light span{background-color:rgba(255, 255, 255, 0.1);background-image:none}.x-carousel-indicator-light span.x-carousel-indicator-active{background-color:rgba(255, 255, 255, 0.3);background-image:none}.x-carousel-indicator-dark span{background-color:rgba(0, 0, 0, 0.1);background-image:none}.x-carousel-indicator-dark span.x-carousel-indicator-active{background-color:rgba(0, 0, 0, 0.3);background-image:none}.x-form .x-scroll-container{background-color:#eeeeee}.x-form .x-scroll-container > .x-inner{padding:1em}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333333;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;padding:0.6em;display:none !important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-label span{font-size:.8em;font-weight:bold}.x-field{min-height:2.5em}.x-field .x-field-input{position:relative}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field:last-child{border-bottom:0}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;box-flex:1}.x-label-align-left:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em}.x-label-align-left:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-label-align-right{-webkit-box-direction:reverse;box-direction:reverse}.x-label-align-right:first-child .x-form-label{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-label-align-top:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-bottom:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-input-el{padding:.4em;min-height:2.5em;display:block;border-width:0;background:transparent;-webkit-appearance:none}.x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-required label:after,.x-field-required .x-form-label:after{content:"*";display:inline}.x-item-disabled label:after,.x-item-disabled .x-form-label:after{color:#666 !important}.x-field-textarea textarea{min-height:6em;padding-top:.5em}.x-checkmark-base,.x-field .x-input-radio:after,.x-field .x-input-checkbox:after,.x-field .x-input-radio:checked:after,.x-field .x-input-checkbox:checked:after,.x-field.x-item-disabled .x-input-radio:checked:after,.x-field.x-item-disabled .x-input-checkbox:checked:after,.x-select-overlay .x-item-selected .x-list-item-label:before,.x-select-overlay .x-item-selected .x-list-item-label:after{content:"";position:absolute;width:1.4em;height:1.4em;top:50%;left:auto;right:1.1em;-webkit-mask-size:1.4em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAE+klEQVRoBe2aS28URxRGsY0h2FmwCQuEWLHjvUNgZAQ4PMwrEkIRIGEgySKwB8QvYIvEP+ANO0CwsJAA88wGBEKBZJUVQkJCQrwJ5nxN31Z5pnpc7e4ZT9vT0peqqanquqfurVvlIW3Dw8NTJtPTPplgxdoCnugeb3m45eEJtgJTJwJPGw8cP8V6TfmC4/Z/H9uEAAZsIdqHZiMBn2UNbvigSw8M2AIAD6PtqBPpmYe+8t1NoL9GLfYf3bTKKhiWo9PoA9KV0dUgn/tRh8tXWg/Hnj0KUB8yz1JNnjXUuhFd264A/f0O7dKXpQ7EIiTPfkKuVyvrSlx3US+KPF26cMbwxeg8Gg3W4LWHFd6rUUepQprQnI/Rh9A25AtjmqseHVkK7w59UxpgYFdg7wH0CwqFpWvyrKI23GZ7OWluwgqwOnqOobVoWh4Tm97DwCpBHUFp2TiUX3v5QVMnLQzMmqAsUVWWyta3UX/TAmOcwjjk6KmE830W7GbU0ZTAGKYEJdj3yAcQ2qYw1jmsG9e0KF8122UDw/SHwFX0EYWC+fpZGG/hPcn1sqk8jGHas+dQ6KXCB6o2g91IPfKsObZpgDGsqAT1hXdpz25A7QZqZU1gBsxFSh5zbEA9yniOU5R5PSvvCnYTSsLYtdkLTGf9uKdD/gS6gI6jPndgUXXe24OKSFAK4zsoSVA+G6uAGaC758/oBrIs+Zb6rbg9up35Xpa1jffpUqEEldezysbJ0VPLjhHADOpEfUiw2gtuUtAKDiGtYNXeqDWJ7zveYQnqM3V3nqx1s2s97xmRoLzzWqMgkLLaTVQJa0ZoJe+hXjRmaMYKVlslr2dlp5wgu4PsiTyszmg5qgVr0CqvoZW2WFlKxhV5gxJsdIMKtYH+Eew6yksoNLy0soJeFzqR+vEI9gx6h9wFzFoPSlA+25g3SlChnnUNU3grkWmxRg0n+ihBnUR5w9j2bCbPGjzzR3sgbc+6gL66TV4zkTHHEqSfZSzr+94V0mbzKUF1GkSWknG5QktGyoj7qBdVeZo2S1Ch2yUNXOMVUcEJyrcQjOeP4vzQCu9BpBtOck5T70HybN4w1iJcR7ouem9QPjhfG+On7EBPUNrKhrYLWp7+FS1FCjtdKvJ6VvM/Q9o2uWC1AHq60QB6hELh0voJ+im6iHReF+FZwe5HP/g8lrXNzuEfeeFu9C9Kg8nSrr9lBZ9ljK/v37xjL5qRFSytf3K15KXy9EH0D/JN3ui2Qj1rC5AAq4FnJvoDPUSNBnTnUy4YQF1maFHlCOAYuouJFN6PkWtEo+ryrH5sL2TPVi5UFXAMrfDegxrtae3ZfWh6paFFffYCx9BKZLtQo/a0YLXIhSUo3yKlAsfQ8vSBBkALtrCjxwdqbTWBY2glst9REee0Lw/ULUEZpFuOChxD1yuRybNbUV0SlAtq9SDgGFp7ushEJlhdKuqWoAzSLYOBHeidGPkc+cIztE2wA6iuCcoFtXom4Bha4f0nGmv2FqyOnoaFscFG9rsfQusYq0T2G8qayASrbdEdOlfR/TJ72AzAaHla5/QD9BnVCucvfK/fjZXtx8WzZneu/+WBf53XOb0G6XetHjQXyfv2vKLyH7qLLqMhJn5DOW5PLmBZDfRUilloGUoD/ovvXgIrT4/rkxt4XK0fw+TtYxhT6iEt4FK7L8D4locDFqnUXSadh78Bx5bEl2CLG+8AAAAASUVORK5CYII=');margin-top:-0.7em}.x-field .x-input-radio,.x-field .x-input-checkbox{position:relative}.x-field .x-input-radio:after,.x-field .x-input-checkbox:after{background-color:#dddddd}.x-field .x-input-radio:checked:after,.x-field .x-input-checkbox:checked:after{background-color:#06346a}.x-field.x-item-disabled .x-input-radio:checked:after,.x-field.x-item-disabled .x-input-checkbox:checked:after{background-color:#9caaba}.x-spinner .x-component-outer{display:-webkit-box;display:box}.x-spinner .x-component-outer > *{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000;padding:0;width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;color:black}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-color:#f7f7f7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e5e5e5));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e5e5e5);background-image:linear-gradient(#ffffff,#ffffff 2%,#e5e5e5)}.x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-color:#efefef;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5d5d5), color-stop(10%, #e2e2e2), color-stop(65%, #efefef), color-stop(100%, #f0f0f0));background-image:-webkit-linear-gradient(#d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:linear-gradient(#d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{width:3em;padding:.65em 0;font-weight:bold;text-align:center}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #aaaaaa;border-top-color:#b7b7b7;color:black}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#aaaaaa}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #efefef), color-stop(100%, #cbcbcb));background-image:-webkit-linear-gradient(#ffffff,#efefef 2%,#cbcbcb);background-image:linear-gradient(#ffffff,#efefef 2%,#cbcbcb)}.x-spinner .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner .x-spinner-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-color:#d5d5d5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bcbcbc), color-stop(10%, #c9c9c9), color-stop(65%, #d5d5d5), color-stop(100%, #d7d7d7));background-image:-webkit-linear-gradient(#bcbcbc,#c9c9c9 10%,#d5d5d5 65%,#d7d7d7);background-image:linear-gradient(#bcbcbc,#c9c9c9 10%,#d5d5d5 65%,#d7d7d7)}.x-spinner .x-spinner-button-down{border:0 !important;border-right:1px solid #dddddd !important}.x-spinner .x-spinner-button-up{border:0 !important;border-left:1px solid #dddddd !important}.x-phone .x-select-overlay{min-width:14em;min-height:12.5em}.x-select-overlay{min-width:18em;min-height:22em}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected .x-list-item-label:before{background-color:rgba(0, 0, 0, 0.3);margin-top:-0.8em}.x-select-overlay .x-item-selected .x-list-item-label:after{background-color:#dddddd}.x-slider-field .x-component-outer,.x-toggle-field .x-component-outer{padding:0.6em}.x-slider,.x-toggle{position:relative;height:2.2em;min-height:0;min-width:0}.x-slider > *,.x-toggle > *{position:absolute;width:100%;height:100%}.x-slider.x-item-disabled{opacity:.6}.x-thumb{position:absolute;height:2.2em;width:2.2em}.x-thumb:before{content:"";position:absolute;width:1.85em;height:1.85em;top:0.175em;left:0.175em;border:1px solid #919191;-webkit-border-radius:0.925em;border-radius:0.925em;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #efefef), color-stop(100%, #cbcbcb));background-image:-webkit-linear-gradient(#ffffff,#efefef 2%,#cbcbcb);background-image:linear-gradient(#ffffff,#efefef 2%,#cbcbcb);-webkit-background-clip:padding;background-clip:padding-box}.x-thumb.x-dragging{opacity:1}.x-thumb.x-dragging:before{background-color:#d0d0d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #e2e2e2), color-stop(100%, #bebebe));background-image:-webkit-linear-gradient(#ffffff,#e2e2e2 2%,#bebebe);background-image:linear-gradient(#ffffff,#e2e2e2 2%,#bebebe)}.x-slider:after{content:"";position:absolute;width:auto;height:0.8em;top:0.737em;left:0;right:0;margin:0 0.925em;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);border:0.1em solid rgba(0, 0, 0, 0.1);border-bottom:0;-webkit-box-shadow:rgba(255, 255, 255, 0.7) 0 0.1em 0;-webkit-border-radius:0.4em;border-radius:0.4em}.x-toggle{width:4.4em;-webkit-border-radius:1.1em;border-radius:1.1em;overflow:hidden;border:1px solid #b7b7b7;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-box-flex:0}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:0.175em}.x-toggle-on{background-color:#92cf00;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6e9c00), color-stop(10%, #80b500), color-stop(65%, #92cf00), color-stop(100%, #94d200));background-image:-webkit-linear-gradient(#6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:linear-gradient(#6e9c00,#80b500 10%,#92cf00 65%,#94d200)}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{content:"";position:absolute;width:0.86em;height:0.86em;top:50%;left:0.5em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGdElEQVRoBdWaa4ycUxjHd9rpbm2bqKhiUavbVZdo0LCyLl3iHhGEkkZsKBYJX4RISHwQIYIPNJoQlUjTuCakUZ9oVGRF0GywslvqbgkpDarqsn7/6XsmM5n38pzzvtudeZL/nplznvM8z//cz5ktTU5OtuWRUqk0i/qdoAN0gcXgP+CkzIcx8APYBXbi82/SaZFSKGGILiTibnA+GADHgbkgSXZT8CF4GwyDEXxvI92r4k0Yoj1EeAG4CvSDEggRkX8VbID4lhADQXXUwxZgfAF4CGwFmgdFYQJb68HJljjy6mSSJZAZ4CLwESiKZJydb7A/CGblJZVWP5UwzueBB8AfIC7IovO0mK0B89KCzlOWSBinWoBeAkWTstiT3948xJLqxhLG2Xzw4jSRdQ0yiv/upMBD8xsI40Rzdu00k3WknyeO+aHk4urFEb4TJ/80CWEdYB4BhS1kdfswe+zpGNf80RYUIr9QSdgOdNCYCfaLcABpqFxBbymu3FIlDFkdD18B5wRYHaHOJvAeGCU4fa8IdnXUPAaoMZeDk4CvfEKFM7CrhswnbpxjZQX4C7j5Y0m1d64EXc5OWoqeFsPLwTvAYt/p/Iv+6jTb1rLKHMbYgWCjZxCb0T/e6qhWj3o6hz8HRMSRykp17l5WayfksyN8oafzTegfHOLQ1aG+blc6ZGQRdeVawB4GlWno7Pim1G9rB08AZzgrfRfdw3wdxelHvl/38K01Itc2Rf22Q8BPIIuoynXQL/SQj71DwcfA4n8nev1xjWfN0yGjD2gxsYh6432LolWHQL9F91Gj/j7oacUPFhE+11hbLxbrCFBzqWh5A4PDRqN90RZqVK9XE+ET67MSv41D9s3E0nwFX1Ndu4RFjkZpjkUxTkeEdTDIEvXqW1lKoeU0pOavXj10OsuSI1CYnaWUVC7COvpliR7f9CQzlaK5/LPBQRc6mstBIsIW0WXiO4tiDh35mIr1oS4kK2ENOctwqzPu+SX0MdDLjZWw9Pb1suyv7EPYR7cuEithLRLL6moW/0VriaVRtT1qTQkSER411Cyjc4pBL4/KEirPNRj4FZ3gXy5EWM+vWaIhtJQNf2GWYkg5dtWzui9bhuqn6OkVNUhE+ANjTZG91Kjrq6bDxHnGStqvcxHWsU5bQpZ0orCK3rDs21m2quXY6+DLTWBBNTP9wxbOKZZ4E63omLYZWG4r0nkQtOtwVASwdYeH723o9uTxS/3Ks+ytHk5/R3cI5LqIK2hEDw86XVkb+wV0Z+YiHDnWCjnu4Vj3Ug3DzhDn1NPacTX4HljJ6gFPr5e5RpZ74tFz6l0ezhWk5tFTYJFPEOjrLKxhrEazktWR8zVQ9vEVp1ttLYyplyeANQinN0ydIXBUnAOXR7nsrwAbgatrTbX3nu1s5Ul1oKgIRsZYMR/jy72gY0+u6a8OJMJX1P+C9MsaqDcPAseCHtANQkRTwHIoybZd21qR0Q2k1pZP0tNJSIubLhxJOr75egO/sjbekM/VIe0qY1RDb6p//PYl6/QniO0sF2tI2kBYRpBTgVrUOWqm9DPiGgghW+GWVBGj/UCvEM1E1sWinr4sKfa0/NgedhUwqsVITzvOUTOl6gxv0qmERRw5HOi/bHz2zb3VMHp28hremYQj0rq23QhGwFSQ0ZVPu8NvAfa3Use8kJkI1wzxxRhfDcYDAotrKF0GngYnRA17D599f7KVXcVzmoszLfUi7AxhfBG4GKwFPudhBacnmpfBStDwnzrkrQIhpDW8L3ExJqXV/wBA2Vs4WelquT9Qzy8FvdHnDlKR01RQ8OrJMaAp8TnYQUA7SBsEm6pzPXgcyI6PaCG7Hdu6VcVLUkuE5ONBR8ByDGb42sPGteBPEDcV0vK0ZZ2Z5C9oSCcZKzqfwO8OJK2FbCAunqYmrICRQaA3rLRejSvTWtGwTzc94Yj0DQS/O4C05nQd6VYhrIVMpEN6Wqv3crBngY4b582aR9DXgJCFTPt05T+AtKq2jNARzxLs/UBbnY/0onwLO97sXPuwj8cidQn8OuytAe0edjUyuluqh2vIPcNnPS1rIbOKfkRf0pKEGdqSJyFwM/AZ3j+2JGHXpZDWWf4+sMvlpaTal7e3xLYEsdQ4ITIIsras29AppxrKctRM5ZDRLUvv13GnLl1p5yjellylCb5BolvWkRQMgT6g6apXmnVgPWQrc/1/boJCaHVWyukAAAAASUVORK5CYII=');-webkit-mask-size:.86em;background-color:#ccc;-webkit-mask-repeat:no-repeat;margin-top:-0.43em}.x-field-search .x-field-input .x-form-field{margin-left:1.0em}.x-field-input .x-clear-icon{display:none;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAIWklEQVRoBdVbS2hVRxiee83LmJeaRBOTCKWgtIiJoQYNFAnSRSF205AqKEJ3urDQlq7aECuuCqUUzK5gS20XBUMLlQYaH3TRoGJsaTURN0mMryQGE40mJun3He65zL2ZmTPnZZOBm3POzPz//N/MN/88k1hcXBRxh2vXrlUsLCxsWbVq1WaUV5JIJIpRZi5+0/iewvc40gdvI7S1tc3GaU8iDsBXr17dlpOTsxeGt+C3G791NiBgyzzA30De83jvffLkye/Nzc1TNrK2eSIDDJBVAHkIhh6E0a/bGmDKB10zSO9G659ubGzswXdoOoYGfOXKlVcA9BOAPAzj8kwAwqQB67+QP3nr1q0fQfv5oLoCA+7r6yvJz88/joKPAmxOUAMCyN2cn58/umPHjt4AsiIQ4P7+/ndQWBeAVgUpNAoZtPgP0HOkvr5+0o8+X4ABMAGP+xkeHSgk4aegmPIOQO++7du3D9rqtwYMp1SIYeU0wL5rq/xl5ENLT8KmdoDusSkvaZPp8uXLtXBMfyw3sLQdNpUB9K/oZsdssHi2MMHm5ub2QfH/1l9tgDAPhq8TDQ0Nn5ryGwGTxmxZKGgwKVlOaQB9AKDp0JRBS2m0aIJ9FlIrBiwRJpPJb0DvN5Roma5LSHnjZeWgdLZmxRfguxv2V2fFO59KwBxn0cAcelZkgO3V+J29cOHCkgnRkojUDKoLSI3jbF1dnVi7dq22QsbGxsSdO3e06aaE2tpasW6dfr0xMjIixsfHTSrovXeWlZV9gExfyBmXtDCni8js6ZEJZm5uTtaV8b5+/XpRVFSUEWfzQRlTRT5+/FhMTEzYqCLoDjRgjZw5AzAXAkg8KmfQvWM+K4aGhnTJLEzU1NTQiWjzZCe4MnyqwosXLwRbF+OuKlkVV1RQUNApJ2RYk1r1LKG5LCC/Y70qHj58KEdlvIMtoqrKkyxpmY0bNwrK6ALBmlilkkPlHMTwWuempQFzPYuaPewm2DxZ0/fv3xfPnj3TZmdftKF2YWGhKC8v1+ohjUlnvwGYctGQH7lyacCIPIRI3+tZUnt4eNjVt+RJSm/atMmh+JJEKYJ5dPSfnZ0Vd+/e9UNlSbOg3MFz58451EkDZmRGLh8fMzMzjkE6EdK0ulo5LDoiGzZsEKtXr9aJO/2W/TdoQCuXobu0Ut4BDDpvQ2TgbRlSm8ME+7QqQLfjeVXUhlNxqMw8qvDgwQMxPT2tSvIVB/bsp4ADGHTe60takZnU5lCFuawiVQhMU51WzqYtWx7lK2XIHDpFVmjYAB0tnZ2d6TGjJaxCytN5sa/pAluTntgNprGaIFmBYajslsMnad3a2trg9uFmOTHoO4189OiR1pvK1M7LyxOVlZVaZ3bv3j3x9OnToKYo5VD+7hxukoNm+jmiUlQfSWqzlTnMqKjKOI7N9LwErQpTU1PObCoKKsv6AXhrEkq3ypFRvHtRmx65pKREWRQpzNaNispyIQC8JcnjDzkyqvfJyUmH3ip9pHa283LzcSITNZVd3WjczUl4VZ7zRB7orTmkPH/+3Fq3qZKslRgyoqJLkvgTC2CWS2qzxWz6IiuGeekD4gqwo5hemqd4sQWOpXRQXoEOzDTb8pK3TM8l4PDTGE1pnGxw2mhaAbmi7NfMy7E6xjBNLx3pcaRsLBfy2HWQo4zvrBiOzayoOAIqdYp92LxXErBkjsNsMVWgQ9P1a1ZSaWmpSix0HMocp5ceDK0pSwEnF5xCqiYezMp1Lfu2LnBiElN/HkzymgGQR+Ya2Re56C8uVjt/d23L2ZhucuFWWNTUhm0DSd6pwMsNXW37jSeV5QWCLE8ac2wmaC75OO/WUZszMdKbFRhVAJuvu4uH81EoZcuYdjcIUt5e5RTStD1EakfotRcB+KIDGLUc6DRdriS2REVFhbbvkb6jo6OyiLN2ZpxussHpJyswCmoD41+4JzLmAOZtGUTovUiGmeoP7mZwSFEF0pYLeVVrelF7zZo1guvmsNSGDb/QNgdw6mpQt8pYmzhSmXvQukCPzL6rC2xl05w7Cq8NtnzH8t0+THp9qzPIFM+ap0G6tS30eh65kAGm7SGWz+OXENT+070WkQYMfv+Ggnk1yFegNzWdA/GMyWa5R2qbjlDovDiRCUjtL11QacAAy52yk26CzRM3A4xUJk3piW0Dx2YTtekU2ad9hoHu7u6fXJk0YEbw0hceN91E05M1zX6rm02x/nyeAzle20uGp5Z+qA07jnd0dKS3UjMA84YbgtVhGmms26ZhRXFSQZr6DdljdbY8WcWhyiYA7CXc4zoj51Xe8cCB+Bm0oLNxLWdeSe8AOwcMDXBW/8h2Z7SwlHAE7wPS94p7BeBj2WAJQgk4dZ1vH4R8XetbLrUCu0/hJk+Xyh4lYGbkuAVKtEM4spWUyoAY4nqxGai9pKYFnALdg+eHMRgVi0o0zm2M+W179uzRHjUaAdMq0PsrzJZOxGJhhEoJFox8e9euXcYLIJ6AaROv8wH0Abzqj/ojNN6vKoA9j/n6TnZDL1krwFTC63xQ/CZ+mWs8rxJiToc9p9Bn3/JqWdcM5TjsJqqevOEG6pzFb6cq/WXFAegcfsd03lhnh3ULuwpQwChqtBmFfYw4/1MpV1GIJ8q+hAqHKeqhx6TadwvLynjpC6uYThjA/2SJ9QQjVe4AyvocjvR72Q4/775bWFbe1NQ0AkfxPubfryL+axgT10SlD/rbsep5LQxY2h6qhalADrwahM2AfWjt9wC+BU/7YwdZkXPTaPFv6PiZOxU23jdTXP8VKWC5GF4g4Z0KgG7Gbwt+WwFgM57FeHLTml1gGt/8d7wxvHNmN4Dh7zp+F7nhJuuL6v0/Vc+vwPfknLsAAAAASUVORK5CYII=') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;position:absolute;top:50%;right:-0.5em}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:2.2em}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-item-disabled .x-form-label span,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;-webkit-text-fill-color:#b3b3b3;pointer-events:none}.x-form-fieldset{margin:0 0 1.5em}.x-form-fieldset .x-form-label{background-color:#f7f7f7;border-top:1px solid white}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #dddddd;background:#fff;padding:0;-webkit-border-radius:0.4em;border-radius:0.4em;overflow:hidden}.x-form-fieldset .x-field{border-bottom:1px solid #dddddd}.x-form-fieldset .x-field:first-child{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333333;margin:1em 0.7em 0.3em;color:#333333;font-weight:bold;white-space:nowrap}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333333;color:gray;margin:1em 0.7em 0.3em;font-size:.8em;text-align:center}.x-selectmark-base,.x-field-select .x-component-outer:after{content:"";position:absolute;width:1em;height:1em;top:50%;left:auto;right:0.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-0.5em}.x-field-select{position:relative}.x-field-select .x-component-outer:after{background-color:#dddddd;z-index:2}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-field-select .x-component-outer:before{content:"";position:absolute;width:4em;height:auto;top:0;left:auto;right:0;bottom:0;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255, 255, 255, 0)), color-stop(0.5, white));z-index:1}.x-msgbox{min-width:15em;max-width:20em;padding:0.8em;-webkit-box-shadow:rgba(0, 0, 0, 0.4) 0 0.1em 0.5em;-webkit-border-radius:0.3em;border-radius:0.3em;border:0.15em solid #354f6e}.x-msgbox .x-icon{margin-left:1.3em}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-webkit-box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0;height:1.3em}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-msgbox .x-field{min-height:2em;background:#fff;-webkit-border-radius:0.2em;border-radius:0.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{text-align:center;padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button{min-width:4.5em}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(186, 202, 222, 0.9);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-color:rgba(186, 202, 222, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(152,176,205,0.9)), color-stop(10%, rgba(169,189,214,0.9)), color-stop(65%, rgba(186,202,222,0.9)), color-stop(100%, rgba(188,204,223,0.9)));background-image:-webkit-linear-gradient(rgba(152,176,205,0.9),rgba(169,189,214,0.9) 10%,rgba(186,202,222,0.9) 65%,rgba(188,204,223,0.9));background-image:linear-gradient(rgba(152,176,205,0.9),rgba(169,189,214,0.9) 10%,rgba(186,202,222,0.9) 65%,rgba(188,204,223,0.9));border:0.1em solid rgba(66, 99, 138, 0.9)}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:0.5em 0.5em}.x-loading-spinner > span,.x-loading-spinner > span:before,.x-loading-spinner > span:after{display:block;position:absolute;width:0.1em;height:0.25em;top:0;-webkit-transform-origin:0.05em 0.5em;-webkit-border-radius:0.05em;border-radius:0.05em;content:" "}.x-loading-spinner > span.x-loading-top{background-color:rgba(170, 170, 170, 0.99)}.x-loading-spinner > span.x-loading-top::after{background-color:rgba(170, 170, 170, 0.9)}.x-loading-spinner > span.x-loading-left::before{background-color:rgba(170, 170, 170, 0.8)}.x-loading-spinner > span.x-loading-left{background-color:rgba(170, 170, 170, 0.7)}.x-loading-spinner > span.x-loading-left::after{background-color:rgba(170, 170, 170, 0.6)}.x-loading-spinner > span.x-loading-bottom::before{background-color:rgba(170, 170, 170, 0.5)}.x-loading-spinner > span.x-loading-bottom{background-color:rgba(170, 170, 170, 0.4)}.x-loading-spinner > span.x-loading-bottom::after{background-color:rgba(170, 170, 170, 0.35)}.x-loading-spinner > span.x-loading-right::before{background-color:rgba(170, 170, 170, 0.3)}.x-loading-spinner > span.x-loading-right{background-color:rgba(170, 170, 170, 0.25)}.x-loading-spinner > span.x-loading-right::after{background-color:rgba(170, 170, 170, 0.2)}.x-loading-spinner > span.x-loading-top::before{background-color:rgba(170, 170, 170, 0.15)}.x-loading-spinner > span{left:50%;margin-left:-0.05em}.x-loading-spinner > span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg)}.x-loading-spinner > span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg)}.x-loading-spinner > span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg)}.x-loading-spinner > span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg)}.x-loading-spinner > span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg)}.x-loading-spinner > span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}} diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js deleted file mode 100644 index caf8e4541d..0000000000 --- a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js +++ /dev/null @@ -1,15 +0,0 @@ -/* - -This file is part of Sencha Touch 2 - -Copyright (c) 2012 Sencha Inc - -Contact: http://www.sencha.com/contact - -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial Software License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Sencha. - -If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. - -*/ -(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()},});Ext.type=Ext.typeOf})();(function(){var a="4.1.0",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;ee){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){if(!d){d=this}if(!c){c=Array.prototype.slice.call(arguments)}if(a){clearTimeout(a);a=null}a=setTimeout(function(){e.apply(d,c)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){var e=c.apply(this,arguments);d.apply(this,arguments);return e}},interceptAfter:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){d.apply(this,arguments);return c.apply(this,arguments)}}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(l===k){return n[l]}m=n[l];k=k.substring(l.length+1)}if(m.length>0){m+="/"}return m.replace(/\/\.\//g,"/")+k.replace(/\./g,"/")+".js"},getPrefix:function(l){var n=this.config.paths,m,k="";if(n.hasOwnProperty(l)){return l}for(m in n){if(n.hasOwnProperty(m)&&m+"."===l.substring(0,m.length+1)){if(m.length>k.length){k=m}}}return k},require:function(m,l,k,n){if(l){l.call(k)}},syncRequire:function(){},exclude:function(l){var k=this;return{require:function(o,n,m){return k.require(o,n,m,l)},syncRequire:function(o,n,m){return k.syncRequire(o,n,m,l)}}},onReady:function(n,m,o,k){var l;if(o!==false&&Ext.onDocumentReady){l=n;n=function(){Ext.onDocumentReady(l,m,k)}}n.call(m)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var k=this.queue,q=k.length,n,p,l,o,m;if(q===0){this.triggerReady();return}for(n=0;nthis.numLoadedFiles){continue}l=0;do{if(a.isCreated(o[l])){f(o,l,1)}else{l++}}while(l=200&&o<300){Ext.globalEval(u.responseText+"\n//@ sourceURL="+l);s.call(w)}else{}}u=null}},syncRequire:function(){var k=this.syncModeEnabled;if(!k){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!k){this.syncModeEnabled=false}this.refreshQueue()},require:function(F,t,n,q){var v={},m={},y=this.queue,C=this.classNameToFilePathMap,A=this.isClassFileLoaded,s=[],H=[],E=[],l=[],r,G,x,w,k,p,D,B,z,u,o;if(q){q=h(q);for(B=0,u=q.length;B0){s=a.getNamesByExpression(k);for(z=0,o=s.length;z0){r=function(){var K=[],J,L,I;for(J=0,L=l.length;J0){H=a.getNamesByExpression(w);o=H.length;for(z=0;z0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((E.length>1)?"es":"")+": "+E.join(", "))}}else{r.call(n);return this}G=this.syncModeEnabled;if(!G){y.push({requires:E.slice(),callback:r,scope:n})}u=E.length;for(B=0;B');document.write('');document.write('');if(Ext.isString(d)){document.write('')}if(l&&j){document.write('')}if(q&&!j){document.write('')}if(Ext.isString(o)||Ext.isString(k)||Ext.isString(m)){o={"57":k||m||o,"72":m||k||o,"114":k||m||o}}g=(s.glossOnIcon===false)?"-precomposed":"";if(o){var t=o["72"],e=o["57"],h=o["114"],r='')}else{if(!j){if(e){document.write(r+g+'" href="'+e+'">')}if(h){document.write(r+g+'" sizes="114x114" href="'+h+'">')}}}}}},application:function(a){var c,b;if(!a){a={}}Ext.Loader.setPath(a.name,a.appFolder||"app");a.requires=Ext.Array.from(a.requires);a.requires.push("Ext.app.Application");c=a.onReady;b=a.scope;a.onReady=function(){new Ext.app.Application(a);if(c){c.call(b)}};Ext.setup(a)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}else{if(typeof b=="string"){return Ext.getCmp(b)}}if(b===true){if(a){return a}else{return d.instantiate(e)}}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}if("xclass" in b){c=d.instantiate(b.xclass,b)}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{requires:["Ext.Version"],statics:{names:{ios:"iOS",android:"Android",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",linux:"Linux",bada:"Bada",other:"Other"},prefixes:{ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",blackberry:"BlackBerry(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/"}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(m,b){var k=this.statics(),j=k.names,c=k.prefixes,a,h="",d,g,f,l,e;e=this.is=function(i){return this.is[i]===true};for(d in c){if(c.hasOwnProperty(d)){g=c[d];f=m.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[d];if(f[1]&&(f[1]=="HTC_"||f[1]=="Silk/")){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}break}}}if(!a){a=j[(m.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b)}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(d in j){if(j.hasOwnProperty(d)){l=j[d];if(!e.hasOwnProperty(a)){this.setFlag(l,(a===l))}}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&/Windows|Linux|MacOS/.test(g)){d="Desktop"}else{if(b.is.iPad||b.is.Android3||(b.is.Android4&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{requires:["Ext.env.Browser","Ext.env.OS"],constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};return this},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOSX|Linux/))},Orientation:function(){return("orientation" in window)&&this.isEventSupported("orientationchange")},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.os.is.Android2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}this.self.cache[b]=this}return b},setId:function(c){var a=this.id,b=this.self.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:function(){return Boolean(this.dom.offsetParent)},set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(d,b){var e=null,c=a._flyweights;b=b||"_global";d=Ext.getDom(d);if(d){e=c[b]||(c[b]=new a.Fly());e.dom=d;e.isSynchronized=false}return e}});Ext.get=function(b){return a.get.call(a,b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(Ext.isNumber(b)){return b+(a||this.defaultUnit||"px")}if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(!this.unitRe.test(b)){return b||""}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:parseFloat(c[0])||0,right:parseFloat(c[1])||0,bottom:parseFloat(c[2])||0,left:parseFloat(c[3])||0}},unitizeBox:function(f,e){var d=this.addUnits,c=this.parseBox(f);return d(c.top,e)+" "+d(c.right,e)+" "+d(c.bottom,e)+" "+d(c.left,e)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.get(a);this.insertBefore(a);a.remove();return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);Ext.dom.Element.addToCache(b.isFlyweight?new Ext.dom.Element(b.dom):b);return b},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(a){return this.getXY(a)[0]},getY:function(a){return this.getXY(a)[1]},getXY:function(){var a=window.webkitConvertPointFromNodeToPage;if(a){return function(){var b=a(this.dom,new WebKitPoint(0,0));return[b.x,b.y]}}else{return function(){var c=this.dom.getBoundingClientRect(),b=Math.round;return[b(c.left+window.pageXOffset),b(c.top+window.pageYOffset)]}}}(),getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom,j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(!c){return new Ext.util.Region()}if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],requires:["Ext.dom.Element"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a)},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){c[e]=c[e]||function(){return this.invoke(e,arguments)}}).call(c,b)}}c.on=c.addListener;if(Ext.DomQuery){a.selectorFunction=Ext.DomQuery.select}a.select=function(e,f){var g;if(typeof e=="string"){g=a.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return new Ext.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.ComponentManager",{alternateClassName:"Ext.ComponentMgr",singleton:true,constructor:function(){var a={};this.all={map:a,getArray:function(){var b=[],c;for(c in a){b.push(a[c])}return b}};this.map=a},register:function(a){this.map[a.getId()]=a},unregister:function(a){delete this.map[a.getId()]},isRegistered:function(a){return this.map[a]!==undefined},get:function(a){return this.map[a]},create:function(a,c){if(a.isComponent){return a}else{if(Ext.isString(a)){return Ext.createByAlias("widget."+a)}else{var b=a.xtype||c;return Ext.createByAlias("widget."+b,a)}}},registerType:Ext.emptyFn});Ext.define("Ext.ComponentQuery",{singleton:true,uses:["Ext.ComponentManager"]},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:["]([^"]*)["])|(?:[']([^']*)[']))\s*/g,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.app.Action",{config:{scope:null,application:null,controller:null,action:null,args:[],url:undefined,data:{},title:null,beforeFilters:[],currentFilterIndex:-1},constructor:function(a){this.initConfig(a);this.getUrl()},execute:function(){this.resume()},resume:function(){var b=this.getCurrentFilterIndex()+1,c=this.getBeforeFilters(),a=this.getController(),d=c[b];if(d){this.setCurrentFilterIndex(b);d.call(a,this)}else{a[this.getAction()].apply(a,this.getArgs())}},applyUrl:function(a){if(a===null||a===undefined){a=this.urlEncode()}return a},applyController:function(a){var c=this.getApplication(),b=c.getCurrentProfile();if(Ext.isString(a)){a=c.getController(a,b?b.getNamespace():null)}return a},urlEncode:function(){var a=this.getController(),b;if(a instanceof Ext.app.Controller){b=a.$className.split(".");a=b[b.length-1]}return a+"/"+this.getAction()}});Ext.define("Ext.app.Route",{config:{conditions:{},url:null,controller:null,action:null,initialized:false},constructor:function(a){this.initConfig(a)},recognize:function(b){if(!this.getInitialized()){this.initialize()}if(this.recognizes(b)){var c=this.matchesFor(b),a=b.match(this.matcherRegex);a.shift();return Ext.applyIf(c,{controller:this.getController(),action:this.getAction(),historyUrl:b,args:a})}},initialize:function(){this.paramMatchingRegex=new RegExp(/:([0-9A-Za-z\_]*)/g);this.paramsInMatchString=this.getUrl().match(this.paramMatchingRegex)||[];this.matcherRegex=this.createMatcherRegex(this.getUrl());this.setInitialized(true)},recognizes:function(a){return this.matcherRegex.test(a)},matchesFor:function(b){var f={},e=this.paramsInMatchString,a=b.match(this.matcherRegex),d=e.length,c;a.shift();for(c=0;c0){f.timeout=setTimeout(Ext.bind(i.handleTimeout,i,[f]),l)}i.setupErrorHandling(f);i[k]=Ext.bind(i.handleResponse,i,[f],true);i.loadScript(f);return f},abort:function(b){var c=this.statics().requests,a;if(b){if(!b.id){b=c[b]}this.abort(b)}else{for(a in c){if(c.hasOwnProperty(a)){this.abort(c[a])}}}},setupErrorHandling:function(a){a.script.onerror=Ext.bind(this.handleError,this,[a])},handleAbort:function(a){a.errorType="abort";this.handleResponse(null,a)},handleError:function(a){a.errorType="error";this.handleResponse(null,a)},cleanupErrorHandling:function(a){a.script.onerror=null},handleTimeout:function(a){a.errorType="timeout";this.handleResponse(null,a)},handleResponse:function(a,b){var c=true;if(b.timeout){clearTimeout(b.timeout)}delete this[b.callbackName];delete this.statics()[b.id];this.cleanupErrorHandling(b);Ext.fly(b.script).destroy();if(b.errorType){c=false;Ext.callback(b.failure,b.scope,[b.errorType])}else{Ext.callback(b.success,b.scope,[a])}Ext.callback(b.callback,b.scope,[c,a,b.errorType])},createScript:function(c,d,b){var a=document.createElement("script");a.setAttribute("src",Ext.urlAppend(c,Ext.Object.toQueryString(d)));a.setAttribute("async",true);a.setAttribute("type","text/javascript");return a},loadScript:function(a){Ext.getHead().appendChild(a.script)}});Ext.define("Ext.data.Operation",{config:{synchronous:true,action:null,filters:null,sorters:null,grouper:null,start:null,limit:null,batch:null,callback:null,scope:null,resultSet:null,records:null,request:null,response:null,withCredentials:null,params:null,url:null,page:null,node:null,model:undefined,addRecords:false},started:false,running:false,complete:false,success:undefined,exception:false,error:undefined,constructor:function(a){this.initConfig(a)},applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},getRecords:function(){var a=this.getResultSet();return this._records||(a?a.getRecords():[])},setStarted:function(){this.started=true;this.running=true},setCompleted:function(){this.complete=true;this.running=false},setSuccessful:function(){this.success=true},setException:function(a){this.exception=true;this.success=false;this.running=false;this.error=a},hasException:function(){return this.exception===true},getError:function(){return this.error},isStarted:function(){return this.started===true},isRunning:function(){return this.running===true},isComplete:function(){return this.complete===true},wasSuccessful:function(){return this.isComplete()&&this.success===true},allowWrite:function(){return this.getAction()!="read"},process:function(d,b,c,a){if(b.getSuccess()!==false){this.setResponse(a);this.setResultSet(b);this.setCompleted();this.setSuccessful()}else{return false}return this["process"+Ext.String.capitalize(d)].call(this,b,c,a)},processRead:function(d){var b=d.getRecords(),g=[],f=this.getModel(),e=b.length,c,a;for(c=0;c]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,requires:["Ext.data.SortTypes"],stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c===true||c==="true"||c==1},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(this.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Validations",{alternateClassName:"Ext.data.validations",singleton:true,config:{presenceMessage:"must be present",lengthMessage:"is the wrong length",formatMessage:"is the wrong format",inclusionMessage:"is not included in the list of acceptable values",exclusionMessage:"is not an acceptable value",emailMessage:"is not a valid email address"},constructor:function(a){this.initConfig(a)},getMessage:function(a){var b=this["get"+a[0].toUpperCase()+a.slice(1)+"Message"];if(b){return b.call(this)}return""},emailRe:/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,presence:function(a,b){if(b===undefined){b=a}return !!b||b===0},length:function(b,e){if(e===undefined||e===null){return false}var d=e.length,c=b.min,a=b.max;if((c&&da)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.identifier.Uuid",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.uuid",config:{id:undefined,salt:null,timestamp:null,version:4},applyId:function(a){if(a===undefined){return Ext.data.identifier.Uuid.Global}return a},constructor:function(){var a=this;a.callParent(arguments);a.parts=[];a.init()},reconfigure:function(a){this.setConfig(a);this.init()},generate:function(){var c=this,e=c.parts,a=c.getVersion(),b=c.getSalt(),d=c.getTimestamp();e[0]=c.toHex(d.lo,8);e[1]=c.toHex(d.hi&65535,4);e[2]=c.toHex(((d.hi>>>16)&4095)|(a<<12),4);e[3]=c.toHex(128|((c.clockSeq>>>8)&63),2)+c.toHex(c.clockSeq&255,2);e[4]=c.toHex(b.hi,4)+c.toHex(b.lo,8);if(a==4){c.init()}else{++d.lo;if(d.lo>=c.twoPow32){d.lo=0;++d.hi}}return e.join("-").toLowerCase()},init:function(){var b=this,a=b.getSalt(),c=b.getTimestamp();if(b.getVersion()==4){b.clockSeq=b.rand(0,b.twoPow14-1);if(!a){a={};b.setSalt(a)}if(!c){c={};b.setTimestamp(c)}a.lo=b.rand(0,b.twoPow32-1);a.hi=b.rand(0,b.twoPow16-1);c.lo=b.rand(0,b.twoPow32-1);c.hi=b.rand(0,b.twoPow28-1)}else{b.setSalt(b.split(b.getSalt()));b.setTimestamp(b.split(b.getTimestamp()));b.getSalt().hi|=256}},twoPow14:Math.pow(2,14),twoPow16:Math.pow(2,16),twoPow28:Math.pow(2,28),twoPow32:Math.pow(2,32),toHex:function(c,b){var a=c.toString(16);if(a.length>b){a=a.substring(a.length-b)}else{if(a.length")}for(;c");for(j in k){if(k.hasOwnProperty(j)){d.push("<",j,">",k[j],"")}}d.push("")}if(h){d.push("")}a.setXmlData(d.join(""));return a}});Ext.define("Ext.direct.RemotingMethod",{config:{name:null,params:null,formHandler:null,len:null,ordered:true},constructor:function(a){this.initConfig(a)},applyParams:function(f){if(Ext.isNumber(f)){this.setLen(f)}else{if(Ext.isArray(f)){this.setOrdered(false);var d=f.length,b=[],c,e,a;for(c=0;c0){if(a){for(c=0,d=a.length;c0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Event",{alternateClassName:"Ext.EventObject",isStopped:false,set:function(a,b){if(arguments.length===1&&typeof a!="string"){var c=a;for(a in c){if(c.hasOwnProperty(a)){this[a]=c[a]}}}else{this[a]=c[a]}},stopEvent:function(){return this.stopPropagation()},stopPropagation:function(){this.isStopped=true;return this}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.publisher.Publisher",{targetType:"",idSelectorRegex:/^#([\w\-]+)$/i,constructor:function(){var b=this.handledEvents,a,c,e,d;a=this.handledEventsMap={};for(c=0,e=b.length;cb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.fx.easing.Momentum",{extend:"Ext.fx.easing.Abstract",config:{acceleration:30,friction:0,startVelocity:0},alpha:0,updateFriction:function(b){var a=Math.log(1-(b/10));this.theta=a;this.alpha=a/this.getAcceleration()},updateStartVelocity:function(a){this.velocity=a*this.getAcceleration()},updateAcceleration:function(a){this.velocity=this.getStartVelocity()*a;this.alpha=this.theta/a},getValue:function(){return this.getStartValue()-this.velocity*(1-this.getFrictionFactor())/this.theta},getFrictionFactor:function(){var a=Ext.Date.now()-this.getStartTime();return Math.exp(a*this.alpha)},getVelocity:function(){return this.getFrictionFactor()*this.velocity}});Ext.define("Ext.mixin.Mixin",{onClassExtended:function(b,e){var a=e.mixinConfig,d,f,c;if(a){d=b.superclass.mixinConfig;if(d){a=e.mixinConfig=Ext.merge({},d,a)}e.mixinId=a.id;f=a.beforeHooks;c=a.hooks||a.afterHooks;if(f||c){Ext.Function.interceptBefore(e,"onClassMixedIn",function(h){var g=this.prototype;if(f){Ext.Object.each(f,function(j,i){h.override(i,function(){if(g[j].apply(this,arguments)!==false){return this.callOverridden(arguments)}})})}if(c){Ext.Object.each(c,function(j,i){h.override(i,function(){var k=this.callOverridden(arguments);g[j].apply(this,arguments);return k})})}})}}}});Ext.define("Ext.mixin.Selectable",{extend:"Ext.mixin.Mixin",mixinConfig:{id:"selectable",hooks:{updateStore:"updateStore"}},config:{disableSelection:null,mode:"SINGLE",allowDeselect:false,lastSelected:null,lastFocused:null,deselectOnContainerClick:true},modes:{SINGLE:true,SIMPLE:true,MULTI:true},selectableEventHooks:{addrecords:"onSelectionStoreAdd",removerecords:"onSelectionStoreRemove",updaterecord:"onSelectionStoreUpdate",load:"refreshSelection",refresh:"refreshSelection"},constructor:function(){this.selected=new Ext.util.MixedCollection();this.callParent(arguments)},applyMode:function(a){a=a?a.toUpperCase():"SINGLE";return this.modes[a]?a:"SINGLE"},updateStore:function(a,c){var b=this,d=Ext.apply({},b.selectableEventHooks,{scope:b});if(c&&Ext.isObject(c)&&c.isStore){if(c.autoDestroy){c.destroy()}else{c.un(d)}}if(a){a.on(d);b.refreshSelection()}},selectAll:function(a){var e=this,c=e.getStore().getRange(),d=c.length,b=0;for(;bd){f=d;d=l;l=f}for(e=l;e<=d;e++){if(g.isSelected(k.getAt(e))){c++}}if(!b){a=-1}else{a=(b=="up")?l:d}for(e=l;e<=d;e++){if(c==(d-l+1)){if(e!=a){g.deselect(e,true)}}else{g.select(e,true)}}},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);d.fireSelectionChange(!b)},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreClear:function(){var b=this,a=b.selected;if(a.getCount()>0){a.clear();b.setLastSelected(null);b.setLastFocused(null);b.fireSelectionChange(true)}},onSelectionStoreRemove:function(b,a){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(c.remove(a)){if(d.getLastSelected()==a){d.setLastSelected(null)}if(d.getLastFocused()==a){d.setLastFocused(null)}d.fireSelectionChange(true)}},getSelectionCount:function(){return this.selected.getCount()},onSelectionStoreAdd:Ext.emptyFn,onSelectionStoreUpdate:Ext.emptyFn,onItemSelect:Ext.emptyFn,onItemDeselect:Ext.emptyFn,onLastFocusChanged:Ext.emptyFn,onEditorKey:Ext.emptyFn},function(){});Ext.define("Ext.mixin.Traversable",{extend:"Ext.mixin.Mixin",mixinConfig:{id:"traversable"},setParent:function(a){this.parent=a;return this},hasParent:function(){return Boolean(this.parent)},getParent:function(){return this.parent},getAncestors:function(){var b=[],a=this.getParent();while(a){b.push(a);a=a.getParent()}return b},getAncestorIds:function(){var b=[],a=this.getParent();while(a){b.push(a.getId());a=a.getParent()}return b}});Ext.define("Ext.util.DelayedTask",{config:{interval:null,delay:null,fn:null,scope:null,args:null},constructor:function(d,c,b){var a={fn:d,scope:c,args:b};this.initConfig(a)},delay:function(b,f,e,a){var d=this;d.cancel();d.setConfig({delay:b,fn:f,scope:e,args:a});var c=function(){d.getFn().apply(d.getScope(),d.getArgs()||[]);d.cancel()};d.setInterval(setInterval(c,d.getDelay()))},cancel:function(){this.setInterval(null)},updateInterval:function(a,b){if(b){clearInterval(b)}},applyArgs:function(a){if(!Ext.isArray(a)){a=[a]}return a}});Ext.define("Ext.util.Filter",{isFilter:true,config:{property:null,value:null,filterFn:Ext.emptyFn,anyMatch:false,exactMatch:false,caseSensitive:false,root:null,id:undefined,scope:null},applyId:function(a){if(!a){if(this.getProperty()){a=this.getProperty()+"-"+String(this.getValue())}if(!a){a=Ext.id(null,"ext-filter-")}}return a},constructor:function(a){this.initConfig(a)},applyFilterFn:function(b){if(b===Ext.emptyFn){b=this.getInitialConfig("filter");if(b){return b}var a=this.getValue();if(!this.getProperty()&&!a&&a!==0){return Ext.emptyFn}else{return this.createFilterFn()}}return b},createFilterFn:function(){var a=this,b=a.createValueMatcher();return function(d){var c=a.getRoot(),e=a.getProperty();if(c){d=d[c]}return b.test(d[e])}},createValueMatcher:function(){var d=this,e=d.getValue(),f=d.getAnyMatch(),c=d.getExactMatch(),a=d.getCaseSensitive(),b=Ext.String.escapeRegex;if(e===null||e===undefined||!e.exec){e=String(e);if(f===true){e=b(e)}else{e="^"+b(e);if(c===true){e+="$"}}e=new RegExp(e,a?"":"i")}return e}});Ext.define("Ext.util.Point",{radianToDegreeConstant:180/Math.PI,statics:{fromEvent:function(b){var a=b.changedTouches,c=(a&&a.length>0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.Region",{statics:{getRegion:function(a){return Ext.fly(a).getPageBox(true)},from:function(a){return new this(a.top,a.right,a.bottom,a.left)}},constructor:function(d,f,a,c){var e=this;e.top=d;e[1]=d;e.right=f;e.bottom=a;e.left=c;e[0]=c},contains:function(b){var a=this;return(b.left>=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},intersect:function(g){var f=this,d=Math.max(f.top,g.top),e=Math.min(f.right,g.right),a=Math.min(f.bottom,g.bottom),c=Math.max(f.left,g.left);if(a>d&&e>c){return new Ext.util.Region(d,e,a,c)}else{return false}},union:function(g){var f=this,d=Math.min(f.top,g.top),e=Math.max(f.right,g.right),a=Math.max(f.bottom,g.bottom),c=Math.min(f.left,g.left);return new Ext.util.Region(d,e,a,c)},constrainTo:function(b){var a=this,c=Ext.util.Numbers.constrain;a.top=c(a.top,b.top,b.bottom);a.bottom=c(a.bottom,b.top,b.bottom);a.left=c(a.left,b.left,b.right);a.right=c(a.right,b.left,b.right);return a},adjust:function(d,f,a,c){var e=this;e.top+=d;e.left+=c;e.right+=f;e.bottom+=a;return e},getOutOfBoundOffset:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.getOutOfBoundOffsetX(b)}else{return this.getOutOfBoundOffsetY(b)}}else{b=a;var c=new Ext.util.Offset();c.x=this.getOutOfBoundOffsetX(b.x);c.y=this.getOutOfBoundOffsetY(b.y);return c}},getOutOfBoundOffsetX:function(a){if(a<=this.left){return this.left-a}else{if(a>=this.right){return this.right-a}}return 0},getOutOfBoundOffsetY:function(a){if(a<=this.top){return this.top-a}else{if(a>=this.bottom){return this.bottom-a}}return 0},isOutOfBound:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.isOutOfBoundX(b)}else{return this.isOutOfBoundY(b)}}else{b=a;return(this.isOutOfBoundX(b.x)||this.isOutOfBoundY(b.y))}},isOutOfBoundX:function(a){return(athis.right)},isOutOfBoundY:function(a){return(athis.bottom)},restrict:function(b,d,a){if(Ext.isObject(b)){var c;a=d;d=b;if(d.copy){c=d.copy()}else{c={x:d.x,y:d.y}}c.x=this.restrictX(d.x,a);c.y=this.restrictY(d.y,a);return c}else{if(b=="x"){return this.restrictX(d,a)}else{return this.restrictY(d,a)}}},restrictX:function(b,a){if(!a){a=1}if(b<=this.left){b-=(b-this.left)*a}else{if(b>=this.right){b-=(b-this.right)*a}}return b},restrictY:function(b,a){if(!a){a=1}if(b<=this.top){b-=(b-this.top)*a}else{if(b>=this.bottom){b-=(b-this.bottom)*a}}return b},getSize:function(){return{width:this.right-this.left,height:this.bottom-this.top}},copy:function(){return new Ext.util.Region(this.top,this.right,this.bottom,this.left)},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(a){this.left+=a.x;this.right+=a.x;this.top+=a.y;this.bottom+=a.y;return this},round:function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this},equals:function(a){return(this.top==a.top&&this.right==a.right&&this.bottom==a.bottom&&this.left==a.left)}});Ext.define("Ext.util.Sorter",{isSorter:true,config:{property:null,sorterFn:null,root:null,transform:null,direction:"ASC",id:undefined},constructor:function(a){this.initConfig(a)},applyId:function(a){if(!a){a=this.getProperty();if(!a){a=Ext.id(null,"ext-sorter-")}}return a},createSortFunction:function(b){var c=this,a=c.getDirection().toUpperCase()=="DESC"?-1:1;return function(e,d){return a*b.call(c,e,d)}},defaultSortFn:function(e,c){var g=this,f=g._transform,b=g._root,d,a,h=g._property;if(b!==null){e=e[b];c=c[b]}d=e[h];a=c[h];if(f){d=f(d);a=f(a)}return d>a?1:(d -1 || Ext.isDate(values) ? values : ""'}else{if(e=="#"){c="xindex"}else{if(e.substr(0,7)=="parent."){c=e}else{if((e.indexOf(".")!==-1)&&(e.indexOf("-")===-1)){c="values."+e}else{c="values['"+e+"']"}}}}if(f){c="("+c+f+")"}if(g&&this.useFormat){d=d?","+d:"";if(g.substr(0,5)!="this."){g="fm."+g+"("}else{g+="("}}else{d="";g="("+c+" === undefined ? '' : "}return g+c+d+")"},evalTpl:function($){eval($);return $},newLineRe:/\r\n|\r|\n/g,aposRe:/[']/g,intRe:/^\s*(\d+)\s*$/,tagRe:/([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?/},function(){var a=this.prototype;a.fnArgs="out,values,parent,xindex,xcount";a.callFn=".call(this,"+a.fnArgs+")"});Ext.define("Ext.data.Field",{requires:["Ext.data.Types","Ext.data.SortTypes"],alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Sequential",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.sequential",config:{prefix:"",seed:1},constructor:function(){var a=this;a.callParent(arguments);a.parts=[a.getPrefix(),""]},generate:function(b){var c=this,d=c.parts,a=c.getSeed()+1;c.setSeed(a);d[1]=a;return d.join("")}});Ext.define("Ext.data.writer.Json",{extend:"Ext.data.writer.Writer",alternateClassName:"Ext.data.JsonWriter",alias:"writer.json",config:{root:undefined,encode:false,allowSingle:true,encodeRequest:false},applyRoot:function(a){if(!a&&(this.getEncode()||this.getEncodeRequest())){a="data"}return a},writeRecords:function(d,e){var a=this.getRoot(),f=d.getParams(),b=this.getAllowSingle(),c;if(this.getAllowSingle()&&e&&e.length==1){e=e[0]}if(this.getEncodeRequest()){c=d.getJsonData()||{};if(e&&(e.length||(b&&Ext.isObject(e)))){c[a]=e}d.setJsonData(Ext.apply(c,f||{}));d.setParams(null);d.setMethod("POST");return d}if(!e||!(e.length||(b&&Ext.isObject(e)))){return d}if(this.getEncode()){if(a){f[a]=Ext.encode(e)}else{}}else{c=d.getJsonData()||{};if(a){c[a]=e}else{c=e}d.setJsonData(c)}return d}});Ext.define("Ext.event.Dispatcher",{requires:["Ext.event.ListenerStack","Ext.event.Controller"],statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(d,e,a){var f=this.getActivePublishers(d,a),c=f.length,b;if(c>0){for(b=0;b0){for(b=0;b0){for(b=0;b0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0){c=a.slice(0);a.length=0;for(b=0;b0){this.processEvent(this.mergeEvents(d));d.length=0}this.processEvent(e)}}if(d.length>0){this.processEvent(this.mergeEvents(d));d.length=0}}},mergeEvents:function(c){var b=[],f=c.length,a,e,d;d=c[f-1];if(f===1){return d}for(a=0;ah){for(d=0;dh){return}}for(d=0;da){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:"Ext.event.recognizer.SingleTouch",config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var c=this,b=this.getMaxDuration(),h=g.changedTouches[0],f=g.time,a=this.lastTapTime,d;this.lastTapTime=f;if(a){d=f-a;if(d<=b){this.lastTapTime=0;this.fire("doubletap",g,[h],{touch:h,duration:d});return}}if(f-this.startTime>b){this.fireSingleTap(g,h)}else{this.singleTapTimer=setTimeout(function(){c.fireSingleTap(g,h)},b)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:"Ext.event.recognizer.SingleTouch",isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],onTouchStart:function(b){var c,a;if(this.callParent(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.onTouchEnd(this.lastMoveEvent)}return false}this.startTouches=c=b.changedTouches;this.startTouch=a=c[0];this.startPoint=a.point},onTouchMove:function(d){var c=d.changedTouches,f=c[0],a=f.point,b=d.time;if(this.lastPoint){this.previousPoint=this.lastPoint}if(this.lastTime){this.previousTime=this.lastTime}this.lastTime=b;this.lastPoint=a;this.lastMoveEvent=d;if(!this.isStarted){this.isStarted=true;this.startTime=b;this.previousTime=b;this.previousPoint=this.startPoint;this.fire("dragstart",d,this.startTouches,this.getInfo(d,this.startTouch))}else{this.fire("drag",d,c,this.getInfo(d,f))}},onTouchEnd:function(c){if(this.isStarted){var b=c.changedTouches,d=b[0],a=d.point;this.isStarted=false;this.lastPoint=a;this.fire("dragend",c,b,this.getInfo(c,d));this.startTime=0;this.previousTime=0;this.lastTime=0;this.startPoint=null;this.previousPoint=null;this.lastPoint=null;this.lastMoveEvent=null}},getInfo:function(j,i){var d=j.time,a=this.startPoint,f=this.previousPoint,b=this.startTime,k=this.previousTime,l=this.lastPoint,h=l.x-a.x,g=l.y-a.y,c={touch:i,startX:a.x,startY:a.y,previousX:f.x,previousY:f.y,pageX:l.x,pageY:l.y,deltaX:h,deltaY:g,absDeltaX:Math.abs(h),absDeltaY:Math.abs(g),previousDeltaX:l.x-f.x,previousDeltaY:l.y-f.y,time:d,startTime:b,previousTime:k,deltaTime:d-b,previousDeltaTime:d-k};return c}});Ext.define("Ext.event.recognizer.LongPress",{extend:"Ext.event.recognizer.SingleTouch",inheritableStatics:{DURATION_NOT_ENOUGH:32},config:{minDuration:1000},handledEvents:["longpress"],fireLongPress:function(a){var b=a.changedTouches[0];this.fire("longpress",a,[b],{touch:b,duration:this.getMinDuration()});this.isLongPress=true},onTouchStart:function(b){var a=this;if(this.callParent(arguments)===false){return false}this.isLongPress=false;this.timer=setTimeout(function(){a.fireLongPress(b)},this.getMinDuration())},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(){if(!this.isLongPress){return this.fail(this.self.DURATION_NOT_ENOUGH)}},fail:function(){clearTimeout(this.timer);return this.callParent(arguments)}},function(){});Ext.define("Ext.event.recognizer.Tap",{handledEvents:["tap"],extend:"Ext.event.recognizer.SingleTouch",onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b])}},function(){});(function(){function b(d){var c=Array.prototype.slice.call(arguments,1);return d.replace(/\{(\d+)\}/g,function(e,f){return c[f]})}Ext.DateExtras={now:Date.now||function(){return +new Date()},getElapsed:function(d,c){return Math.abs(d-(c||new Date()))},useStrict:false,formatCodeToRegex:function(d,c){var e=a.parseCodes[d];if(e){e=typeof e=="function"?e():e;a.parseCodes[d]=e}return e?Ext.applyIf({c:e.c?b(e.c,c||"{0}"):e.c},e):{g:0,c:null,s:Ext.String.escapeRegex(d)}},parseFunctions:{MS:function(d,c){var e=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");var f=(d||"").match(e);return f?new Date(((f[1]||"")+f[2])*1):null}},parseRegexes:[],formatFunctions:{MS:function(){return"\\/Date("+this.getTime()+")\\/"}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},defaultFormat:"m/d/Y",getShortMonthName:function(c){return a.monthNames[c].substring(0,3)},getShortDayName:function(c){return a.dayNames[c].substring(0,3)},getMonthNumber:function(c){return a.monthNumbers[c.substring(0,1).toUpperCase()+c.substring(1,3).toLowerCase()]},formatCodes:{d:"Ext.String.leftPad(this.getDate(), 2, '0')",D:"Ext.Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Ext.Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"Ext.Date.getSuffix(this)",w:"this.getDay()",z:"Ext.Date.getDayOfYear(this)",W:"Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",F:"Ext.Date.monthNames[this.getMonth()]",m:"Ext.String.leftPad(this.getMonth() + 1, 2, '0')",M:"Ext.Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"Ext.Date.getDaysInMonth(this)",L:"(Ext.Date.isLeapYear(this) ? 1 : 0)",o:"(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){e=Math.min(e,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(g),"mo",h)).getDate())}i.setDate(e);i.setMonth(g.getMonth()+h);break;case Ext.Date.YEAR:i.setFullYear(g.getFullYear()+h);break}return i},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.fx.Easing",{requires:["Ext.fx.easing.Linear"],constructor:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")}});Ext.define("Ext.fx.easing.BoundMomentum",{extend:"Ext.fx.easing.Abstract",requires:["Ext.fx.easing.Momentum","Ext.fx.easing.Bounce"],config:{momentum:null,bounce:null,minMomentumValue:0,maxMomentumValue:0,minVelocity:0.01,startVelocity:0},applyMomentum:function(a,b){return Ext.factory(a,Ext.fx.easing.Momentum,b)},applyBounce:function(a,b){return Ext.factory(a,Ext.fx.easing.Bounce,b)},updateStartTime:function(a){this.getMomentum().setStartTime(a);this.callParent(arguments)},updateStartVelocity:function(a){this.getMomentum().setStartVelocity(a)},updateStartValue:function(a){this.getMomentum().setStartValue(a)},reset:function(){this.lastValue=null;this.isBouncingBack=false;this.isOutOfBound=false;return this.callParent(arguments)},getValue:function(){var a=this.getMomentum(),j=this.getBounce(),e=a.getStartVelocity(),f=e>0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseIn",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-in",config:{exponent:4,duration:1500},getValue:function(){var c=Ext.Date.now()-this.getStartTime(),g=this.getDuration(),b=this.getStartValue(),a=this.getEndValue(),h=this.distance,e=c/g,d=Math.pow(e,this.getExponent()),f=b+(d*h);if(c>=g){this.isEnded=true;return a}return f}});Ext.define("Ext.fx.easing.EaseOut",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.mixin.Filterable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Filter"],mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=200&&a<300)||a==304||a==0,b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(c){var g=c.xhr,a={},h,d,i,e,f,b;if(c.timedout||c.aborted){c.success=false;h=[]}else{h=g.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}d=h.length;while(d--){i=h[d];e=i.indexOf(":");if(e>=0){f=i.substr(0,e).toLowerCase();if(i.charAt(e+1)==" "){++e}a[f]=i.substr(e+1)}}c.xhr=null;delete c.xhr;b={request:c,requestId:c.id,status:g.status,statusText:g.statusText,getResponseHeader:function(j){return a[j.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:g.responseText,responseXML:g.responseXML};g=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:"Ext.data.Connection",singleton:true,autoAbort:false});Ext.define("Ext.data.reader.Reader",{requires:["Ext.data.ResultSet"],alternateClassName:["Ext.data.Reader","Ext.data.DataReader"],mixins:["Ext.mixin.Observable"],isReader:true,config:{idProperty:undefined,clientIdProperty:"clientId",totalProperty:"total",successProperty:"success",messageProperty:null,rootProperty:"",implicitIncludes:true,model:undefined},constructor:function(a){this.initConfig(a)},fieldCount:0,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},applyIdProperty:function(a){if(!a&&this.getModel()){a=this.getModel().getIdProperty()}return a},updateModel:function(a){if(a){if(!this.getIdProperty()){this.setIdProperty(a.getIdProperty())}this.buildExtractors()}},createAccessor:Ext.emptyFn,createFieldAccessExpression:function(){return"undefined"},buildExtractors:function(){if(!this.getModel()){return}var b=this,c=b.getTotalProperty(),a=b.getSuccessProperty(),d=b.getMessageProperty();if(c){b.getTotal=b.createAccessor(c)}if(a){b.getSuccess=b.createAccessor(a)}if(d){b.getMessage=b.createAccessor(d)}b.extractRecordData=b.buildRecordDataExtractor()},buildRecordDataExtractor:function(){var k=this,e=k.getModel(),g=e.getFields(),j=g.length,a=[],h=k.getModel().getClientIdProperty(),f="__field",b=["var me = this,\n"," fields = me.getModel().getFields(),\n"," idProperty = me.getIdProperty(),\n",' idPropertyIsFn = (typeof idProperty == "function"),'," value,\n"," internalId"],d,l,c,m;g=g.items;for(d=0;d=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.proxy.Proxy",{extend:"Ext.Evented",alias:"proxy.proxy",alternateClassName:["Ext.data.DataProxy","Ext.data.Proxy"],requires:["Ext.data.reader.Json","Ext.data.writer.Json"],uses:["Ext.data.Batch","Ext.data.Operation","Ext.data.Model"],config:{batchOrder:"create,update,destroy",batchActions:true,model:null,reader:{type:"json"},writer:{type:"json"}},isProxy:true,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},updateModel:function(b){if(b){var a=this.getReader();if(a&&!a.getModel()){a.setModel(b)}}},applyReader:function(b,a){return Ext.factory(b,Ext.data.Reader,a,"reader")},updateReader:function(a){if(a){var b=this.getModel();if(!b){b=a.getModel();if(b){this.setModel(b)}}else{a.setModel(b)}if(a.onMetaChange){a.onMetaChange=Ext.Function.createSequence(a.onMetaChange,this.onMetaChange,this)}}},onMetaChange:function(b){var a=this.getReader().getModel();if(!this.getModel()&&a){this.setModel(a)}this.fireEvent("metachange",this,b)},applyWriter:function(b,a){return Ext.factory(b,Ext.data.Writer,a,"writer")},create:Ext.emptyFn,read:Ext.emptyFn,update:Ext.emptyFn,destroy:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.getReader(),this.getWriter())},batch:function(e,f){var g=this,d=g.getBatchActions(),c=this.getModel(),b,a;if(e.operations===undefined){e={operations:e,batch:{listeners:f}}}if(e.batch){if(e.batch.isBatch){e.batch.setProxy(g)}else{e.batch.proxy=g}}else{e.batch={proxy:g,listeners:e.listeners||{}}}if(!b){b=new Ext.data.Batch(e.batch)}b.on("complete",Ext.bind(g.onBatchComplete,g,[e],0));Ext.each(g.getBatchOrder().split(","),function(h){a=e.operations[h];if(a){if(d){b.add(new Ext.data.Operation({action:h,records:a,model:c}))}else{Ext.each(a,function(i){b.add(new Ext.data.Operation({action:h,records:[i],model:c}))})}}},g);b.start();return b},onBatchComplete:function(a,b){var c=a.scope||this;if(b.hasException){if(Ext.isFunction(a.failure)){Ext.callback(a.failure,c,[b,a])}}else{if(Ext.isFunction(a.success)){Ext.callback(a.success,c,[b,a])}}if(Ext.isFunction(a.callback)){Ext.callback(a.callback,c,[b,a])}}},function(){});Ext.define("Ext.data.proxy.Client",{extend:"Ext.data.proxy.Proxy",alternateClassName:"Ext.proxy.ClientProxy",clear:function(){}});Ext.define("Ext.data.proxy.Memory",{extend:"Ext.data.proxy.Client",alias:"proxy.memory",alternateClassName:"Ext.data.MemoryProxy",isMemoryProxy:true,config:{data:[]},finishOperation:function(b,f,d){if(b){var c=0,e=b.getRecords(),a=e.length;for(c;c0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(a,c,b){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.JsonP",{extend:"Ext.data.proxy.Server",alternateClassName:"Ext.data.ScriptTagProxy",alias:["proxy.jsonp","proxy.scripttag"],requires:["Ext.data.JsonP"],config:{defaultWriterType:"base",callbackKey:"callback",recordParam:"records",autoAppendParams:true},doRequest:function(a,g,b){var d=this,e=d.getWriter(),c=d.buildRequest(a),f=c.getParams();if(a.allowWrite()){c=e.write(c)}c.setConfig({callbackKey:d.getCallbackKey(),timeout:d.getTimeout(),scope:d,callback:d.createRequestCallback(c,a,g,b)});if(d.getAutoAppendParams()){c.setParams({})}c.setJsonP(Ext.data.JsonP.request(c.getCurrentConfig()));c.setParams(f);a.setStarted();d.lastRequest=c;return c},createRequestCallback:function(d,a,e,b){var c=this;return function(h,f,g){delete c.lastRequest;c.processResponse(h,a,d,f,e,b)}},setException:function(b,a){b.setException(b.getRequest().getJsonP().errorType)},buildUrl:function(f){var h=this,a=h.callParent(arguments),e=Ext.apply({},f.getParams()),c=e.filters,d,b,g,j;delete e.filters;if(h.getAutoAppendParams()){a=Ext.urlAppend(a,Ext.Object.toQueryString(e))}if(c&&c.length){for(g=0;g0){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",h.getRecordParam(),h.encodeRecords(d)))}return a},destroy:function(){this.abort();this.callParent(arguments)},abort:function(){var a=this.lastRequest;if(a){Ext.data.JsonP.abort(a.getJsonP())}},encodeRecords:function(b){var d="",c=0,a=b.length;for(;c1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","!important");e.show();Ext.Animator.run([g,b]);d.pause()}}});Ext.define("Ext.fx.layout.card.Cover",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cube",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cube",config:{reverse:null,inAnimation:{type:"cube"},outAnimation:{type:"cube",out:true}}});Ext.define("Ext.fx.layout.card.Fade",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Slide",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.Card",{requires:["Ext.fx.layout.card.Slide","Ext.fx.layout.card.Cover","Ext.fx.layout.card.Reveal","Ext.fx.layout.card.Fade","Ext.fx.layout.card.Flip","Ext.fx.layout.card.Pop","Ext.fx.layout.card.Cube","Ext.fx.layout.card.Scroll"],constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.os.is.Android2){if(c!="fade"){c="scroll"}}else{if(c==="slide"&&Ext.browser.is.ChromeMobile){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.runner.Css",{extend:"Ext.Evented",requires:["Ext.fx.Animation"],prefixedProperties:{transform:true,"transform-origin":true,perspective:true,"transform-style":true,transition:true,"transition-property":true,"transition-duration":true,"transition-timing-function":true,"transition-delay":true,animation:true,"animation-name":true,"animation-duration":true,"animation-iteration-count":true,"animation-direction":true,"animation-timing-function":true,"animation-delay":true},lengthProperties:{top:true,right:true,bottom:true,left:true,width:true,height:true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,"border-bottom-width":true,"border-left-width":true,"border-right-width":true,"border-spacing":true,"border-top-width":true,"border-width":true,"outline-width":true,"letter-spacing":true,"line-height":true,"text-indent":true,"word-spacing":true,"font-size":true,translate:true,translateX:true,translateY:true,translateZ:true,translate3d:true},durationProperties:{"transition-duration":true,"transition-delay":true,"animation-duration":true,"animation-delay":true},angleProperties:{rotate:true,rotateX:true,rotateY:true,rotateZ:true,skew:true,skewX:true,skewY:true},lengthUnitRegex:/([a-z%]*)$/,DEFAULT_UNIT_LENGTH:"px",DEFAULT_UNIT_ANGLE:"deg",DEFAULT_UNIT_DURATION:"ms",formattedNameCache:{},constructor:function(){var a=Ext.feature.has.Css3dTransforms;if(a){this.transformMethods=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","skewX","skewY","scaleX","scaleY","scaleZ"]}else{this.transformMethods=["translateX","translateY","rotate","skewX","skewY","scaleX","scaleY"]}this.vendorPrefix=Ext.browser.getStyleDashPrefix();this.ruleStylesCache={};return this},getStyleSheet:function(){var c=this.styleSheet,a,b;if(!c){a=document.createElement("style");a.type="text/css";(document.head||document.getElementsByTagName("head")[0]).appendChild(a);b=document.styleSheets;this.styleSheet=c=b[b.length-1]}return c},applyRules:function(i){var g=this.getStyleSheet(),k=this.ruleStylesCache,j=g.cssRules,c,e,h,b,d,a,f;for(c in i){e=i[c];h=k[c];if(h===undefined){d=j.length;g.insertRule(c+"{}",d);h=k[c]=j.item(d).style}b=h.$cache;if(!b){b=h.$cache={}}for(a in e){f=this.formatValue(e[a],a);a=this.formatName(a);if(b[a]!==f){b[a]=f;if(f===null){h.removeProperty(a)}else{h.setProperty(a,f,"important")}}}}return this},applyStyles:function(d){var g,c,f,b,a,e;for(g in d){c=document.getElementById(g);if(!c){return this}f=c.style;b=d[g];for(a in b){e=this.formatValue(b[a],a);a=this.formatName(a);if(e===null){f.removeProperty(a)}else{f.setProperty(a,e,"important")}}}return this},formatName:function(b){var a=this.formattedNameCache,c=a[b];if(!c){if(this.prefixedProperties[b]){c=this.vendorPrefix+b}else{c=b}a[b]=c}return c},formatValue:function(j,b){var g=typeof j,l=this.DEFAULT_UNIT_LENGTH,e,a,d,f,c,k,h;if(g=="string"){if(this.lengthProperties[b]){h=j.match(this.lengthUnitRegex)[1];if(h.length>0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:"Ext.fx.runner.Css",listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var b=g.getId(),k=this.runningAnimationsData[b],c=k.nameMap,o={},m={},h,e,l,a;o[b]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g],m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","!important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(o){var E=this,h=this.lengthProperties,w={},D={},F={},d,r,x,e,t,H,u,p,q,a,z,y,n,A,l,s,g,B,G,k,f,v,m,c,C,b;if(!this.listenersAttached){this.attachListeners()}o=Ext.Array.from(o);for(z=0,n=o.length;z0){this.refreshRunningAnimationsData(d,Ext.Array.merge(H,u),true,F.replacePrevious)}c=a.nameMap;C=a.nameList;s={};for(y=0;y0){H=Ext.Array.difference(C,H);u=Ext.Array.merge(H,u);x["transition-property"]=H}D[r]=e=Ext.Object.chain(e);e["transition-property"]=u;e["transition-duration"]=F.duration;e["transition-timing-function"]=F.easing;e["transition-delay"]=F.delay;A.startTime=Date.now()}q=this.$className;this.applyStyles(w);p=function(i){if(i.data===q&&i.source===window){window.removeEventListener("message",p,false);E.applyStyles(D)}};window.addEventListener("message",p,false);window.postMessage(q,"*")}});Ext.define("Ext.fx.Runner",{requires:["Ext.fx.runner.CssTransition"],constructor:function(){return new Ext.fx.runner.CssTransition()}});(function(a){Ext.define("Ext.layout.Default",{extend:"Ext.Evented",alternateClassName:["Ext.layout.AutoContainerLayout","Ext.layout.ContainerLayout"],alias:["layout.auto","layout.default"],isLayout:true,hasDockedItemsCls:a+"hasdocked",centeredItemCls:a+"centered",floatingItemCls:a+"floating",dockingWrapperCls:a+"docking",dockingInnerCls:a+"docking-inner",maskCls:a+"mask",positionMap:{top:"start",left:"start",bottom:"end",right:"end"},positionDirectionMap:{top:"vertical",bottom:"vertical",left:"horizontal",right:"horizontal"},DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",POSITION_START:"start",POSITION_END:"end",config:{animation:null},constructor:function(b,c){this.container=b;this.innerItems=[];this.centeringWrappers={};this.initConfig(c)},reapply:Ext.emptyFn,unapply:Ext.emptyFn,onItemAdd:function(){this.doItemAdd.apply(this,arguments)},onItemRemove:function(){this.doItemRemove.apply(this,arguments)},onItemMove:function(){this.doItemMove.apply(this,arguments)},onItemCenteredChange:function(){this.doItemCenteredChange.apply(this,arguments)},onItemFloatingChange:function(){this.doItemFloatingChange.apply(this,arguments)},onItemDockedChange:function(){this.doItemDockedChange.apply(this,arguments)},doItemAdd:function(c,b){var d=c.getDocked();if(d!==null){this.dockItem(c,d)}else{if(c.isCentered()){this.centerItem(c,b)}else{this.insertItem(c,b)}}if(c.isFloating()){this.onItemFloatingChange(c,true)}},doItemRemove:function(b){if(b.isDocked()){this.undockItem(b)}else{if(b.isCentered()){this.uncenterItem(b)}}Ext.Array.remove(this.innerItems,b);this.container.innerElement.dom.removeChild(b.renderElement.dom)},doItemMove:function(c,d,b){if(c.isCentered()){c.setZIndex((d+1)*2)}else{if(c.isFloating()){c.setZIndex((d+1)*2)}this.insertItem(c,d)}},doItemCenteredChange:function(c,b){if(b){this.centerItem(c)}else{this.uncenterItem(c)}},doItemFloatingChange:function(d,e){var c=d.element,b=this.floatingItemCls;if(e){if(d.getZIndex()===null){d.setZIndex((this.container.indexOf(d)+1)*2)}c.addCls(b)}else{d.setZIndex(null);c.removeCls(b)}},doItemDockedChange:function(b,d,c){if(c){this.undockItem(b,c)}if(d){this.dockItem(b,d)}},centerItem:function(b){this.insertItem(b,0);if(b.getZIndex()===null){b.setZIndex((this.container.indexOf(b)+1)*2)}this.createCenteringWrapper(b);b.element.addCls(this.floatingItemCls)},uncenterItem:function(b){this.destroyCenteringWrapper(b);b.setZIndex(null);this.insertItem(b,this.container.indexOf(b));b.element.removeCls(this.floatingItemCls)},dockItem:function(f,b){var c=this.container,g=f.renderElement,e=f.element,d=this.dockingInnerElement;if(!d){c.setUseBodyElement(true);this.dockingInnerElement=d=c.bodyElement}this.getDockingWrapper(b);if(this.positionMap[b]===this.POSITION_START){g.insertBefore(d)}else{g.insertAfter(d)}e.addCls(a+"docked-"+b)},undockItem:function(b,c){this.insertItem(b,this.container.indexOf(b));b.element.removeCls(a+"docked-"+c)},getDockingWrapper:function(b){var e=this.currentDockingDirection,d=this.positionDirectionMap[b],c=this.dockingWrapper;if(e!==d){this.currentDockingDirection=d;this.dockingWrapper=c=this.createDockingWrapper(d)}return c},createDockingWrapper:function(b){return this.dockingInnerElement.wrap({classList:[this.dockingWrapperCls+"-"+b]},true)},createCenteringWrapper:function(c){var f=c.getId(),d=this.centeringWrappers,b=c.renderElement,e;d[f]=e=b.wrap({className:this.centeredItemCls});return e},destroyCenteringWrapper:function(c){var f=c.getId(),d=this.centeringWrappers,b=c.renderElement,e=d[f];b.unwrap();e.destroy();delete d[f];return this},insertItem:function(k,g){var d=this.container,j=d.getItems().items,e=this.innerItems,c=d.innerElement.dom,i=k.renderElement.dom,h,f,b;if(d.has(k)){Ext.Array.remove(e,k)}if(typeof g=="number"){h=j[g];if(h===k){h=j[++g]}while(h&&(h.isCentered()||h.isDocked())){h=j[++g]}if(h){b=e.indexOf(h);if(b!==-1){while(h&&(h.isCentered()||h.isDocked())){h=e[++b]}if(h){e.splice(b,0,k);f=h.renderElement.dom;c.insertBefore(i,f);return this}}}}e.push(k);c.appendChild(i);return this}})})(Ext.baseCSSPrefix);Ext.define("Ext.layout.AbstractBox",{extend:"Ext.layout.Default",config:{align:"stretch",pack:null},flexItemCls:Ext.baseCSSPrefix+"layout-box-item",positionMap:{middle:"center",left:"start",top:"start",right:"end",bottom:"end"},constructor:function(a){this.callParent(arguments);a.innerElement.addCls(this.cls);a.on(this.sizeChangeEventName,"onItemSizeChange",this,{delegate:"> component"})},reapply:function(){this.container.innerElement.addCls(this.cls);this.updatePack(this.getPack());this.updateAlign(this.getAlign())},unapply:function(){this.container.innerElement.removeCls(this.cls);this.updatePack(null);this.updateAlign(null)},doItemAdd:function(d,b){this.callParent(arguments);if(d.isInnerItem()){var c=d.getConfig(this.sizePropertyName),a=d.config;if(!c&&("flex" in a)){this.setItemFlex(d,a.flex)}}},doItemRemove:function(a){if(a.isInnerItem()){this.setItemFlex(a,null)}this.callParent(arguments)},onItemSizeChange:function(a){this.setItemFlex(a,null)},doItemCenteredChange:function(b,a){if(a){this.setItemFlex(b,null)}this.callParent(arguments)},doItemFloatingChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},doItemDockedChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},redrawContainer:function(){var a=this.container,b=a.renderElement.dom.parentNode;if(b&&b.nodeType!==11){a.innerElement.redraw()}},setItemFlex:function(c,a){var b=c.element,d=this.flexItemCls;if(a){b.addCls(d)}else{if(b.hasCls(d)){this.redrawContainer();b.removeCls(d)}}b.dom.style.webkitBoxFlex=a},convertPosition:function(a){if(this.positionMap.hasOwnProperty(a)){return this.positionMap[a]}return a},applyAlign:function(a){return this.convertPosition(a)},updateAlign:function(a){this.container.innerElement.dom.style.webkitBoxAlign=a},applyPack:function(a){return this.convertPosition(a)},updatePack:function(a){this.container.innerElement.dom.style.webkitBoxPack=a}});Ext.define("Ext.layout.Fit",{extend:"Ext.layout.Default",alternateClassName:"Ext.layout.FitLayout",alias:"layout.fit",cls:Ext.baseCSSPrefix+"layout-fit",itemCls:Ext.baseCSSPrefix+"layout-fit-item",constructor:function(a){this.callParent(arguments);this.apply()},apply:function(){this.container.innerElement.addCls(this.cls)},reapply:function(){this.apply()},unapply:function(){this.container.innerElement.removeCls(this.cls)},doItemAdd:function(b,a){if(b.isInnerItem()){b.addCls(this.itemCls)}this.callParent(arguments)},doItemRemove:function(a){if(a.isInnerItem()){a.removeCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.Card",{extend:"Ext.layout.Fit",alternateClassName:"Ext.layout.CardLayout",isCard:true,requires:["Ext.fx.layout.Card"],alias:"layout.card",cls:Ext.baseCSSPrefix+"layout-card",itemCls:Ext.baseCSSPrefix+"layout-card-item",constructor:function(){this.callParent(arguments);this.container.onInitialized(this.onContainerInitialized,this)},applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},doItemAdd:function(b,a){if(b.isInnerItem()){b.hide()}this.callParent(arguments)},doItemRemove:function(c,a,b){this.callParent(arguments);if(!b&&c.isInnerItem()){c.show()}},onContainerInitialized:function(a){var b=a.getActiveItem();if(b){b.show()}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},doItemDockedChange:function(b,c){var a=b.element;if(c){a.removeCls(this.itemCls)}else{a.addCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.HBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.HBoxLayout",alias:"layout.hbox",sizePropertyName:"width",sizeChangeEventName:"widthchange",cls:Ext.baseCSSPrefix+"layout-hbox"});Ext.define("Ext.layout.VBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.VBoxLayout",alias:"layout.vbox",sizePropertyName:"height",sizeChangeEventName:"heightchange",cls:Ext.baseCSSPrefix+"layout-vbox"});Ext.define("Ext.layout.Layout",{requires:["Ext.layout.Fit","Ext.layout.Card","Ext.layout.HBox","Ext.layout.VBox"],constructor:function(a,b){var c=Ext.layout.Default,d,e;if(typeof b=="string"){d=b;b={}}else{if("type" in b){d=b.type}}if(d){c=Ext.ClassManager.getByAlias("layout."+d)}return new c(a,b)}});Ext.define("Ext.mixin.Sortable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Sorter"],mixinConfig:{id:"sortable"},config:{sorters:null,defaultSortDirection:"ASC",sortRoot:null},dirtySortFn:false,sortFn:null,sorted:false,applySorters:function(a,b){if(!b){b=this.createSortersCollection()}b.clear();this.sorted=false;if(a){this.addSorters(a)}return b},createSortersCollection:function(){this._sorters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._sorters},addSorter:function(b,a){this.addSorters([b],a)},addSorters:function(c,a){var b=this.getSorters();return this.insertSorters(b?b.length:0,c,a)},insertSorter:function(a,c,b){return this.insertSorters(a,[c],b)},insertSorters:function(e,h,a){if(!Ext.isArray(h)){h=[h]}var f=h.length,j=a||this.getDefaultSortDirection(),c=this.getSortRoot(),k=this.getSorters(),l=[],g,b,m,d;if(!k){k=this.createSortersCollection()}for(b=0;b>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.util.AbstractMixedCollection",{requires:["Ext.util.Filter"],mixins:{observable:"Ext.util.Observable"},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;h=e.length||(a&&e.getAutoSort())){return e.add(d,f)}this.all.push(f);if(typeof d!="undefined"&&d!==null){e.map[d]=f}if(b&&this.getAutoFilter()&&filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[this.getKey(b)];return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b1){for(c=a.length;ba){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(b,c){var a=b;if(!b){return""}if(!Ext.isDate(b)){a=new Date(Date.parse(b));if(isNaN(a)){if(this.iso8601TestRe.test(b)){a=b.split(this.iso8601SplitRe);a=new Date(a[0],a[1]-1,a[2],a[3],a[4],a[5])}if(isNaN(a)){a=new Date(Date.parse(b.replace(this.dashesRe,"/")))}}b=a}return Ext.Date.format(b,c||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{requires:["Ext.dom.Helper","Ext.util.Format"],inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e>1){for(;cf)?1:((ba?1:(d0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;cMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.util.SizeMonitor",{extend:"Ext.Evented",config:{element:null,detectorCls:Ext.baseCSSPrefix+"size-change-detector",callback:Ext.emptyFn,scope:null,args:[]},constructor:function(d){this.initConfig(d);this.doFireSizeChangeEvent=Ext.Function.bind(this.doFireSizeChangeEvent,this);var g=this,e=this.getElement().dom,b=this.getDetectorCls(),c=Ext.Element.create({classList:[b,b+"-expand"],children:[{}]},true),h=Ext.Element.create({classList:[b,b+"-shrink"],children:[{}]},true),a=function(i){g.onDetectorScroll("expand",i)},f=function(i){g.onDetectorScroll("shrink",i)};e.appendChild(c);e.appendChild(h);c.addEventListener("scroll",a,true);h.addEventListener("scroll",f,true);this.detectors={expand:c,shrink:h};this.position={expand:{left:0,top:0},shrink:{left:0,top:0}};this.listeners={expand:a,shrink:f};this.refresh()},applyElement:function(a){if(a){return Ext.get(a)}},refreshPosition:function(b){var e=this.detectors[b],a=this.position[b],d,c;a.left=d=e.scrollWidth-e.offsetWidth;a.top=c=e.scrollHeight-e.offsetHeight;e.scrollLeft=d;e.scrollTop=c},refresh:function(){this.refreshPosition("expand");this.refreshPosition("shrink")},onDetectorScroll:function(b){var c=this.detectors[b],a=this.position[b];if(c.scrollLeft!==a.left||c.scrollTop!==a.top){this.refresh();this.fireSizeChangeEvent()}},fireSizeChangeEvent:function(){clearTimeout(this.sizeChangeThrottleTimer);this.sizeChangeThrottleTimer=setTimeout(this.doFireSizeChangeEvent,1)},doFireSizeChangeEvent:function(){this.getCallback().apply(this.getScope(),this.getArgs())},destroyDetector:function(a){var c=this.detectors[a],b=this.listeners[a];c.removeEventListener("scroll",b,true);Ext.removeNode(c)},destroy:function(){this.callParent(arguments);this.destroyDetector("expand");this.destroyDetector("shrink");delete this.listeners;delete this.detectors}});Ext.define("Ext.event.publisher.ComponentSize",{extend:"Ext.event.publisher.Publisher",requires:["Ext.ComponentManager","Ext.util.SizeMonitor"],targetType:"component",handledEvents:["resize"],constructor:function(){this.callParent(arguments);this.sizeMonitors={}},subscribe:function(g){var c=g.match(this.idSelectorRegex),f=this.subscribers,a=this.sizeMonitors,d=this.dispatcher,e=this.targetType,b;if(!c){return false}if(!f.hasOwnProperty(g)){f[g]=0;d.addListener(e,g,"painted","onComponentPainted",this,null,"before");b=Ext.ComponentManager.get(c[1]);a[g]=new Ext.util.SizeMonitor({element:b.element,callback:this.onComponentSizeChange,scope:this,args:[this,g]})}f[g]++;return true},unsubscribe:function(h,b,e){var c=h.match(this.idSelectorRegex),g=this.subscribers,d=this.dispatcher,f=this.targetType,a=this.sizeMonitors;if(!c){return false}if(!g.hasOwnProperty(h)||(!e&&--g[h]>0)){return true}a[h].destroy();delete a[h];d.removeListener(f,h,"painted","onComponentPainted",this,"before");delete g[h];return true},onComponentPainted:function(b){var c=b.getObservableId(),a=this.sizeMonitors[c];a.refresh()},onComponentSizeChange:function(a,b){this.dispatcher.doDispatchEvent(this.targetType,b,"resize",[a])}});Ext.define("Ext.util.Sortable",{isSortable:true,defaultSortDirection:"ASC",requires:["Ext.util.Sorter"],initSortable:function(){var a=this,b=a.sorters;a.sorters=Ext.create("Ext.util.AbstractMixedCollection",false,function(c){return c.id||c.property});if(b){a.sorters.addAll(a.decodeSorters(b))}},sort:function(g,f,c,e){var d=this,h,b,a;if(Ext.isArray(g)){e=c;c=f;a=g}else{if(Ext.isObject(g)){e=c;c=f;a=[g]}else{if(Ext.isString(g)){h=d.sorters.get(g);if(!h){h={property:g,direction:f};a=[h]}else{if(f===undefined){h.toggle()}else{h.setDirection(f)}}}}}if(a&&a.length){a=d.decodeSorters(a);if(Ext.isString(c)){if(c==="prepend"){g=d.sorters.clone().items;d.sorters.clear();d.sorters.addAll(a);d.sorters.addAll(g)}else{d.sorters.addAll(a)}}else{d.sorters.clear();d.sorters.addAll(a)}if(e!==false){d.onBeforeSort(a)}}if(e!==false){g=d.sorters.items;if(g.length){b=function(l,k){var j=g[0].sort(l,k),n=g.length,m;for(m=1;me?1:(f0){g=f.data.items;r=g.length;for(k=0;k0){b.create=e;f=true}if(c.length>0){b.update=c;f=true}if(a.length>0){b.destroy=a;f=true}if(f&&d.fireEvent("beforesync",this,b)!==false){d.getProxy().batch({operations:b,listeners:d.getBatchListeners()})}return{added:e,updated:c,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:"Ext.data.NodeStore",alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(l,b){var j=this.getProxy(),g=j.getReader(),e=b.raw,c=[],a=g.getRootProperty(),k,f,d,h;if(!b.isLeaf()){k=g.getRoot(e);if(k){f=g.extractData(k);for(d=0,h=f.length;d0){this.sendRequest(b==1?a[0]:a);this.callBuffer=[]}}});Ext.define("Ext.util.TapRepeater",{requires:["Ext.DateExtras"],mixins:{observable:"Ext.mixin.Observable"},config:{el:null,accelerate:true,interval:10,delay:250,preventDefault:true,stopDefault:false,timer:0,pressCls:null},constructor:function(a){var b=this;b.initConfig(a)},updateEl:function(c,b){var a={touchstart:"onTouchStart",touchend:"onTouchEnd",tap:"eventOptions",scope:this};if(b){b.un(a)}c.on(a)},eventOptions:function(a){if(this.getPreventDefault()){a.preventDefault()}if(this.getStopDefault()){a.stopEvent()}},destroy:function(){this.clearListeners();Ext.destroy(this.el)},onTouchStart:function(c){var b=this,a=b.getPressCls();clearTimeout(b.getTimer());if(a){b.getEl().addCls(a)}b.tapStartTime=new Date();b.fireEvent("touchstart",b,c);b.fireEvent("tap",b,c);if(b.getAccelerate()){b.delay=400}b.setTimer(Ext.defer(b.tap,b.getDelay()||b.getInterval(),b,[c]))},tap:function(b){var a=this;a.fireEvent("tap",a,b);a.setTimer(Ext.defer(a.tap,a.getAccelerate()?a.easeOutExpo(Ext.Date.getElapsed(a.tapStartTime),400,-390,12000):a.getInterval(),a,[b]))},easeOutExpo:function(e,a,g,f){return(e==f)?a+g:g*(-Math.pow(2,-10*e/f)+1)+a},onTouchEnd:function(b){var a=this;clearTimeout(a.getTimer());a.getEl().removeCls(a.getPressCls());a.fireEvent("touchend",a,b)}});Ext.define("Ext.util.translatable.Abstract",{extend:"Ext.Evented",requires:["Ext.fx.easing.Linear"],config:{element:null,easing:null,easingX:null,easingY:null,fps:60},constructor:function(a){var b;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.x=0;this.y=0;this.activeEasingX=null;this.activeEasingY=null;this.initialConfig=a;if(a&&a.element){b=a.element;this.setElement(b)}},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initConfig(this.initialConfig);this.refresh()},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},updateFps:function(a){this.animationInterval=1000/a},doTranslate:function(a,b){if(typeof a=="number"){this.x=a}if(typeof b=="number"){this.y=b}return this},translate:function(a,c,b){if(Ext.isObject(a)){throw new Error()}this.stopAnimation();if(b!==undefined){return this.translateAnimated(a,c,b)}return this.doTranslate(a,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.animationTimer=setInterval(this.doAnimationFrame,this.animationInterval);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(Ext.isObject(b)){throw new Error()}if(!Ext.isObject(e)){e={}}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||this.getEasingX()||f||true):null,a=(typeof g=="number")?(e.easingY||this.getEasingY()||f||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){if(!this.isAnimating){return}var c=this.activeEasingX,b=this.activeEasingY,a,d;if(c===null&&b===null){this.stopAnimation();return}if(c!==null){this.x=a=Math.round(c.getValue());if(c.isEnded){this.activeEasingX=null;this.fireEvent("axisanimationend",this,"x",a)}}else{a=this.x}if(b!==null){this.y=d=Math.round(b.getValue());if(b.isEnded){this.activeEasingY=null;this.fireEvent("axisanimationend",this,"y",d)}}else{d=this.y}this.doTranslate(a,d);this.fireEvent("animationframe",this,a,d)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;clearInterval(this.animationTimer);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)}});Ext.define("Ext.util.translatable.CssTransform",{extend:"Ext.util.translatable.Abstract",doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a!="number"){a=this.x}if(typeof c!="number"){c=this.y}b.webkitTransform="translate3d("+a+"px, "+c+"px, 0px)";return this.callParent(arguments)},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callParent(arguments)}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:"Ext.util.translatable.Abstract",wrapperWidth:0,wrapperHeight:0,baseCls:"x-translatable",config:{useWrapper:true},getWrapper:function(){var e=this.wrapper,c=this.baseCls,b=this.getElement(),d,a;if(!e){a=b.getParent();if(!a){return null}if(this.getUseWrapper()){e=b.wrap({className:c+"-wrapper"},true)}else{e=a.dom}e.appendChild(Ext.Element.create({className:c+"-stretcher"},true));this.nestedStretcher=d=Ext.Element.create({className:c+"-nested-stretcher"},true);b.appendChild(d);b.addCls(c);a.addCls(c+"-container");this.container=a;this.wrapper=e;this.refresh()}return e},doTranslate:function(a,c){var b=this.getWrapper();if(b){if(typeof a=="number"){b.scrollLeft=this.wrapperWidth-a}if(typeof c=="number"){b.scrollTop=this.wrapperHeight-c}}return this.callParent(arguments)},refresh:function(){var a=this.getWrapper();if(a){this.wrapperWidth=a.offsetWidth;this.wrapperHeight=a.offsetHeight;this.callParent(arguments)}},destroy:function(){var b=this.getElement(),a=this.baseCls;if(this.wrapper){if(this.getUseWrapper()){b.unwrap()}this.container.removeCls(a+"-container");b.removeCls(a);b.removeChild(this.nestedStretcher)}this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{requires:["Ext.util.translatable.CssTransform","Ext.util.translatable.ScrollPosition"],constructor:function(a){var c=Ext.util.translatable,e=c.CssTransform,d=c.ScrollPosition,b;if(typeof a=="object"&&"translationMethod" in a){if(a.translationMethod==="scrollposition"){b=d}else{if(a.translationMethod==="csstransform"){b=e}}}if(!b){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){b=d}else{b=e}}return new b(a)}});Ext.define("Ext.behavior.Translatable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Translatable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.translatable.refresh()},setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){var a=this.component;delete this.translatable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.scroll.Scroller",{extend:"Ext.Evented",requires:["Ext.fx.easing.BoundMomentum","Ext.fx.easing.EaseOut","Ext.util.SizeMonitor","Ext.util.Translatable"],config:{element:null,direction:"auto",translationMethod:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",containerScrollSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.stopAnimation=Ext.Function.bind(this.stopAnimation,this);this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.size={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();a.addCls(this.cls);if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},getTranslatable:function(){if(!this.hasOwnProperty("translatable")){var a=this.getBounceEasing();this.translatable=new Ext.util.Translatable({translationMethod:this.getTranslationMethod(),element:this.getElement(),easingX:a.x,easingY:a.y,useWrapper:false,listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",axisanimationend:"onAxisAnimationEnd",scope:this}})}return this.translatable},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().doTranslate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(b){var a=this.isAxisEnabledFlags;a.x=(b==="both"||b==="horizontal");a.y=(b==="both"||b==="vertical")},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c,a,d;this.givenContainerSize=b;if(b==="auto"){c=this.getContainer().dom;a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c,a,d;this.givenSize=b;if(b==="auto"){c=this.getElement().dom;a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applyContainerScrollSize:function(b){var c,a,d;this.givenContainerScrollSize=b;if(b==="auto"){c=this.getContainer().dom;a=c.scrollWidth;d=c.scrollHeight}else{a=b.x;d=b.y}return{x:a,y:d}},updateAutoRefresh:function(b){var c=Ext.util.SizeMonitor,a;if(b){this.sizeMonitors={element:new c({element:this.getElement(),callback:this.doRefresh,scope:this}),container:new c({element:this.getContainer(),callback:this.doRefresh,scope:this})}}else{a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}}},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container;if(!a){this.container=a=this.getElement().getParent();a.addCls(this.containerCls)}return a},doRefresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setContainerScrollSize(this.givenContainerScrollSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this)},refresh:function(){var a=this.sizeMonitors;if(a){a.element.refresh();a.container.refresh()}this.doRefresh();return this},scrollTo:function(c,h,g){var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.doTranslate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(a){return this.scrollTo(0,this.getSize().y-this.getContainerSize().y,a)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x");a=this.getAnimationEasing("y");if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g){if(!this.isAxisEnabled(g)){return null}var e=this.position[g],f=this.flickStartPosition[g],k=this.flickStartTime[g],c=this.getMinPosition()[g],j=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,l,i,h;if(ej){d=j}}if(d!==null){l=this.getBounceEasing()[g];l.setConfig({startTime:b,startValue:-e,endValue:-d});return l}h=b-k;if(h===0){return null}i=(e-f)/(b-k);if(i===0){return null}if(i<-a){i=-a}else{if(i>a){i=a}}l=this.getMomentumEasing()[g];l.setConfig({startTime:b,startValue:-e,startVelocity:-i,minMomentumValue:-j,maxMomentumValue:0});return l},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAxisAnimationEnd:function(a){},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=(a-f)%g;if(b!==0){if(Math.abs(b)>g/2){d=a+((b>0)?g-b:b-g);if(d>e){d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var b=this.getElement(),a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}if(b&&!b.isDestroyed){b.removeCls(this.cls);this.getContainer().removeCls(this.containerCls)}Ext.destroy(this.translatable);this.callParent(arguments)}},function(){});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:["Ext.mixin.Observable"],requires:["Ext.util.SizeMonitor","Ext.util.Translatable"],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",constructor:function(a){var b;this.sizeMonitors={};this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.sizeMonitors.element=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.initConfig(this.initialConfig)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);a.setElement(this.getElement());return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(b,a){this.currentConstraint=b;if(b==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,b)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var b=this.getContainer();if(!b){return{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}}}var g=this.getElement().dom,f=b.dom,c=g.offsetWidth,a=g.offsetHeight,e=f.offsetWidth,d=f.offsetHeight;return{min:{x:0,y:0},max:{x:e-c,y:d-a}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.sizeMonitors.container=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.container=a}}return a},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},doRefresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},refresh:function(){var a=this.sizeMonitors;if(a.element){a.element.refresh()}if(a.container){a.container.refresh()}this.doRefresh()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var b=this.sizeMonitors,a=this.getTranslatable();if(b.element){b.element.destroy()}if(b.container){b.container.destroy()}var c=this.getElement();if(c&&!c.isDestroyed){c.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Draggable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.draggable.refresh()},setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(true);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){var a=this.component;delete this.draggable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:"Ext.AbstractComponent",alternateClassName:"Ext.lib.Component",mixins:["Ext.mixin.Traversable"],requires:["Ext.ComponentManager","Ext.XTemplate","Ext.dom.Element","Ext.behavior.Translatable","Ext.behavior.Draggable"],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:null,hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.initialize();d.triggerInitialized();if("fullscreen" in d.config){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",children:this.getTemplate()}},triggerInitialized:function(){var c=this.onInitializedListeners,d=c.length,e,b;if(!this.initialized){this.initialized=true;if(d>0){for(b=0;b0){this.pressedTimeout=setTimeout(function(){if(a){a.addCls(b)}},c)}else{a.addCls(b)}}},onTouchMove:function(a){return},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.isPressed){return}a.isPressed=false;if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}a.releasedTimeout=setTimeout(function(){if(a&&a.element){a.element.removeCls(a.getPressedCls())}},10)},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}d.preventDefault();b.apply(a,arguments)}},function(){});Ext.define("Ext.Decorator",{extend:"Ext.Component",isDecorator:true,config:{component:{}},statics:{generateProxySetter:function(a){return function(c){var b=this.getComponent();b[a].call(b,c);return this}},generateProxyGetter:function(a){return function(){var b=this.getComponent();return b[a].call(b)}}},onClassExtended:function(c,e){if(!e.hasOwnProperty("proxyConfig")){return}var f=Ext.Class,i=e.proxyConfig,d=e.config;e.config=(d)?Ext.applyIf(d,i):i;var b,h,g,a;for(b in i){if(i.hasOwnProperty(b)){h=f.getConfigNameMap(b);g=h.set;a=h.get;e[g]=this.generateProxySetter(g);e[a]=this.generateProxyGetter(a)}}},applyComponent:function(a){return Ext.factory(a,Ext.Component)},updateComponent:function(a,b){if(b){if(this.isRendered()&&b.setRendered(false)){b.fireAction("renderedchange",[this,b,false],"doUnsetComponent",this,{args:[b]})}else{this.doUnsetComponent(b)}}if(a){if(this.isRendered()&&a.setRendered(true)){a.fireAction("renderedchange",[this,a,true],"doSetComponent",this,{args:[a]})}else{this.doSetComponent(a)}}},doUnsetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.removeChild(a.renderElement.dom)}},doSetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.appendChild(a.renderElement.dom)}},setRendered:function(b){var a;if(this.callParent(arguments)){a=this.getComponent();if(a){a.setRendered(b)}return true}return false},setDisabled:function(a){this.callParent(arguments);this.getComponent().setDisabled(a)},destroy:function(){Ext.destroy(this.getComponent());this.callParent()}});Ext.define("Ext.Img",{extend:"Ext.Component",xtype:["image","img"],config:{src:null,baseCls:Ext.baseCSSPrefix+"img",mode:"background"},beforeInitialize:function(){var a=this;a.onLoad=Ext.Function.bind(a.onLoad,a);a.onError=Ext.Function.bind(a.onError,a)},initialize:function(){var a=this;a.callParent();a.relayEvents(a.renderElement,"*");a.element.on({tap:"onTap",scope:a})},hide:function(){this.callParent();this.hiddenSrc=this.hiddenSrc||this.getSrc();this.setSrc(null)},show:function(){this.callParent();if(this.hiddenSrc){this.setSrc(this.hiddenSrc);delete this.hiddenSrc}},updateMode:function(a){if(a==="background"){if(this.imageElement){this.imageElement.destroy();delete this.imageElement;this.updateSrc(this.getSrc())}}else{this.imageElement=this.element.createChild({tag:"img"})}},onTap:function(a){this.fireEvent("tap",this,a)},onAfterRender:function(){this.updateSrc(this.getSrc())},updateSrc:function(a){var b=this,c;if(b.getMode()==="background"){c=this.imageObject||new Image()}else{c=b.imageElement.dom}this.imageObject=c;c.setAttribute("src",Ext.isString(a)?a:"");c.addEventListener("load",b.onLoad,false);c.addEventListener("error",b.onError,false)},detachListeners:function(){var a=this.imageObject;if(a){a.removeEventListener("load",this.onLoad,false);a.removeEventListener("error",this.onError,false)}},onLoad:function(a){this.detachListeners();if(this.getMode()==="background"){this.element.dom.style.backgroundImage='url("'+this.imageObject.src+'")'}this.fireEvent("load",this,a)},onError:function(a){this.detachListeners();this.fireEvent("error",this,a)},doSetWidth:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setWidth(b);this.callParent(arguments)},doSetHeight:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setHeight(b);this.callParent(arguments)},destroy:function(){this.detachListeners();Ext.destroy(this.imageObject);delete this.imageObject;this.callParent()}});Ext.define("Ext.Label",{extend:"Ext.Component",xtype:"label",config:{}});Ext.define("Ext.Map",{extend:"Ext.Component",xtype:"map",requires:["Ext.util.GeoLocation"],isMap:true,config:{baseCls:Ext.baseCSSPrefix+"map",useCurrentLocation:false,map:null,geo:null,mapOptions:{}},constructor:function(){this.callParent(arguments);this.options={};this.element.setVisibilityMode(Ext.Element.OFFSETS);if(!(window.google||{}).maps){this.setHtml("Google Maps API is required")}},initialize:function(){this.callParent();this.on({painted:"doResize",scope:this});this.element.on("touchstart","onTouchStart",this)},onTouchStart:function(a){a.makeUnpreventable()},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(c){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){a.setOptions(c)}},getMapOptions:function(){return Ext.merge({},this.options)},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.renderMap()}},applyGeo:function(a){return Ext.factory(a,Ext.util.GeoLocation,this.getGeo())},updateGeo:function(b,a){var c={locationupdate:"onGeoUpdate",locationerror:"onGeoError",scope:this};if(a){a.un(c)}if(b){b.on(c);b.updateLocation()}},doResize:function(){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){b.event.trigger(a,"resize")}},renderMap:function(){var d=this,f=(window.google||{}).maps,b=d.element,a=d.getMapOptions(),e=d.getMap(),c;if(f){if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:f.NavigationControlStyle.ZOOM_PAN}},a)}a=Ext.merge({zoom:12,mapTypeId:f.MapTypeId.ROADMAP},a);if(!a.hasOwnProperty("center")){a.center=new f.LatLng(37.381592,-122.135672)}if(b.dom.firstChild){Ext.fly(b.dom.firstChild).destroy()}if(e){f.event.clearInstanceListeners(e)}d.setMap(new f.Map(b.dom,a));e=d.getMap();c=f.event;c.addListener(e,"zoom_changed",Ext.bind(d.onZoomChange,d));c.addListener(e,"maptypeid_changed",Ext.bind(d.onTypeChange,d));c.addListener(e,"center_changed",Ext.bind(d.onCenterChange,d));d.fireEvent("maprender",d,e)}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(d){var a=this,c=a.getMap(),b=(window.google||{}).maps;if(b){if(!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{single:true,args:[d]});return}d=d||new b.LatLng(37.381592,-122.135672);if(d&&!(d instanceof b.LatLng)&&"longitude" in d){d=new b.LatLng(d.latitude,d.longitude)}if(!c){a.renderMap();c=a.getMap()}if(c&&d instanceof b.LatLng){c.panTo(d)}else{this.options=Ext.apply(this.getMapOptions(),{center:d})}}},onZoomChange:function(){var a=this.getMapOptions(),c=this.getMap(),b;b=(c&&c.getZoom)?c.getZoom():a.zoom||10;this.options=Ext.apply(a,{zoom:b});this.fireEvent("zoomchange",this,c,b)},onTypeChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getMapTypeId)?c.getMapTypeId():b.mapTypeId;this.options=Ext.apply(b,{mapTypeId:a});this.fireEvent("typechange",this,c,a)},onCenterChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getCenter)?c.getCenter():b.center;this.options=Ext.apply(b,{center:a});this.fireEvent("centerchange",this,c,a)},destroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()}},function(){});Ext.define("Ext.Mask",{extend:"Ext.Component",xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callParent();this.on({painted:"onPainted",erased:"onErased"})},onPainted:function(){this.element.on("*","onEvent",this)},onErased:function(){this.element.un("*","onEvent",this)},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.LoadMask",{extend:"Ext.Mask",xtype:"loadmask",config:{message:"Loading...",messageCls:Ext.baseCSSPrefix+"mask-message",indicator:true,listeners:{painted:"onPainted",erased:"onErased"}},getTemplate:function(){var a=Ext.baseCSSPrefix;return[{reference:"innerElement",cls:a+"mask-inner",children:[{reference:"indicatorElement",cls:a+"loading-spinner-outer",children:[{cls:a+"loading-spinner",children:[{tag:"span",cls:a+"loading-top"},{tag:"span",cls:a+"loading-right"},{tag:"span",cls:a+"loading-bottom"},{tag:"span",cls:a+"loading-left"}]}]},{reference:"messageElement"}]}]},updateMessage:function(a){this.messageElement.setHtml(a)},updateMessageCls:function(b,a){this.messageElement.replaceCls(a,b)},updateIndicator:function(a){this[a?"removeCls":"addCls"](Ext.baseCSSPrefix+"indicator-hidden")},onPainted:function(){this.getParent().on({scope:this,resize:this.refreshPosition});this.refreshPosition()},onErased:function(){this.getParent().un({scope:this,resize:this.refreshPosition})},refreshPosition:function(){var c=this.getParent(),d=c.getScrollable(),a=(d)?d.getScroller():null,f=(a)?a.position:{x:0,y:0},e=c.element.getSize(),b=this.element.getSize();this.innerElement.setStyle({marginTop:Math.round(e.height-b.height+(f.y*2))+"px",marginLeft:Math.round(e.width-b.width+f.x)+"px"})}},function(){});Ext.define("Ext.Media",{extend:"Ext.Component",xtype:"media",config:{url:"",enableControls:Ext.os.is.Android?false:true,autoResume:false,autoPause:true,preload:true,loop:false,media:null,playing:false,volume:1,muted:false},initialize:function(){var a=this;a.callParent();a.on({scope:a,activate:a.onActivate,deactivate:a.onDeactivate});a.addMediaListener({play:"onPlay",pause:"onPause",ended:"onEnd",volumechange:"onVolumeChange",timeupdate:"onTimeUpdate"})},addMediaListener:function(d,b){var c=this,e=c.media.dom,f=Ext.Function.bind;if(!Ext.isObject(d)){var a=d;d={};d[a]=b}Ext.Object.each(d,function(h,g){if(typeof g!=="function"){g=c[g]}if(typeof g=="function"){g=f(g,c);e.addEventListener(h,g)}})},onPlay:function(){this.fireEvent("play",this)},onPause:function(){this.fireEvent("pause",this,this.getCurrentTime())},onEnd:function(){this.fireEvent("ended",this,this.getCurrentTime())},onVolumeChange:function(){this.fireEvent("volumechange",this,this.media.dom.volume)},onTimeUpdate:function(){this.fireEvent("timeupdate",this,this.getCurrentTime())},isPlaying:function(){return this.getPlaying()},onActivate:function(){var a=this;if(a.getAutoResume()&&!a.isPlaying()){a.play()}},onDeactivate:function(){var a=this;if(a.getAutoResume()&&a.isPlaying()){a.pause()}},updateUrl:function(a){var b=this.media.dom;b.src=a;b.load();if(this.getPlaying()){this.play()}},updateEnableControls:function(a){this.media.dom.controls=a?"controls":false},updateLoop:function(a){this.media.dom.loop=a?"loop":false},play:function(){this.media.dom.play();this.setPlaying(true)},pause:function(){this.media.dom.pause();this.setPlaying(false)},toggle:function(){if(this.isPlaying()){this.pause()}else{this.play()}},stop:function(){var a=this;a.setCurrentTime(0);a.fireEvent("stop",a);a.pause()},updateVolume:function(a){this.media.dom.volume=a},updateMuted:function(a){this.fireEvent("mutedchange",this,a);this.media.dom.muted=a},getCurrentTime:function(){return this.media.dom.currentTime},setCurrentTime:function(a){this.media.dom.currentTime=a;return a},getDuration:function(){return this.media.dom.duration},destroy:function(){var a=this;Ext.Object.each(event,function(c,b){if(typeof b!=="function"){b=a[b]}if(typeof b=="function"){b=bind(b,a);dom.removeEventListener(c,b)}})}});Ext.define("Ext.Audio",{extend:"Ext.Media",xtype:"audio",config:{cls:Ext.baseCSSPrefix+"audio"},onActivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.show()}},onDeactivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.hide()}},template:[{reference:"media",preload:"auto",tag:"audio",cls:Ext.baseCSSPrefix+"component"}]});Ext.define("Ext.Spacer",{extend:"Ext.Component",alias:"widget.spacer",config:{},constructor:function(a){a=a||{};if(!a.width){a.flex=1}this.callParent([a])}});Ext.define("Ext.Title",{extend:"Ext.Component",xtype:"title",config:{baseCls:"x-title",title:""},updateTitle:function(a){this.setHtml(a)}});Ext.define("Ext.Video",{extend:"Ext.Media",xtype:"video",config:{posterUrl:null,cls:Ext.baseCSSPrefix+"video"},template:[{reference:"ghost",classList:[Ext.baseCSSPrefix+"video-ghost"]},{tag:"video",reference:"media",classList:[Ext.baseCSSPrefix+"media"]}],initialize:function(){var a=this;a.callParent();a.media.hide();a.onBefore({erased:"onErased",scope:a});a.ghost.on({tap:"onGhostTap",scope:a});a.media.on({pause:"onPause",scope:a});if(Ext.os.is.Android4||Ext.os.is.iPad){this.isInlineVideo=true}},applyUrl:function(a){return[].concat(a)},updateUrl:function(f){var c=this,e=c.media,g=f.length,d=e.query("source"),b=d.length,a;for(a=0;a0){a.pop().destroy()}},setActiveIndex:function(b){var e=this.indicators,d=this.activeIndex,a=e[d],f=e[b],c=this.getBaseCls();if(a){a.removeCls(c,null,"active")}if(f){f.addCls(c,null,"active")}this.activeIndex=b;return this},onTap:function(f){var g=f.touch,a=this.element.getPageBox(),d=a.left+(a.width/2),b=a.top+(a.height/2),c=this.getDirection();if((c==="horizontal"&&g.pageX>=d)||(c==="vertical"&&g.pageY>=b)){this.fireEvent("next",this)}else{this.fireEvent("previous",this)}},destroy:function(){var d=this.indicators,b,c,a;for(b=0,c=d.length;bd.bottom||a.yd.right||a.x div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,d){var c=this,a=c.dataview,e=a.prepareData(b.getData(true),a.getStore().indexOf(b),b);d.innerHTML=c.dataview.getItemTpl().apply(e)},addListItem:function(e,c){var h=this,d=h.dataview,a=d.prepareData(c.getData(true),d.getStore().indexOf(c),c),b=h.element,i=b.dom.childNodes,g=i.length,f;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(i[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];c.parentNode.removeChild(c)}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;uf){d=e}}c.setValue(d);d=c.getValue();c.fireEvent("spin",c,d,g);c.fireEvent("spin"+g,c,d)},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){this.setValue(this.getDefaultValue())},destroy:function(){var a=this;Ext.destroy(a.downRepeater,a.upRepeater,a.spinDownButton,a.spinUpButton);a.callParent(arguments)}},function(){});Ext.define("Ext.field.TextAreaInput",{extend:"Ext.field.Input",xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:"Ext.field.Text",xtype:"textareafield",requires:["Ext.field.TextAreaInput"],alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.field.Url",{extend:"Ext.field.Text",xtype:"urlfield",alternateClassName:"Ext.form.Url",config:{autoCapitalize:false,component:{type:"url"}}});Ext.define("Ext.plugin.ListPaging",{extend:"Ext.Component",alias:"plugin.listpaging",config:{autoPaging:false,loadMoreText:"Load More...",noMoreRecordsText:"No More Records",loadTpl:['
    ','','','','',"
    ",'
    {message}
    '].join(""),loadMoreCmp:{xtype:"component",baseCls:Ext.baseCSSPrefix+"list-paging"},loadMoreCmpAdded:false,loadingCls:Ext.baseCSSPrefix+"loading",list:null,scroller:null,loading:false},init:function(c){var a=c.getScrollable().getScroller(),b=c.getStore();this.setList(c);this.setScroller(a);this.bindStore(c.getStore());if(b){this.disableDataViewMask(b)}c.updateStore=Ext.Function.createInterceptor(c.updateStore,this.bindStore,this);if(this.getAutoPaging()){a.on({scrollend:this.onScrollEnd,scope:this})}},bindStore:function(a,b){if(b){b.un({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}if(a){a.on({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}},disableDataViewMask:function(a){var b=this.getList();if(a.isAutoLoading()){b.setLoadingText(null)}else{a.on({load:{single:true,fn:function(){b.setLoadingText(null)}}})}},applyLoadTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},applyLoadMoreCmp:function(a){a=Ext.merge(a,{html:this.getLoadTpl().apply({cssPrefix:Ext.baseCSSPrefix,message:this.getLoadMoreText()}),listeners:{tap:{fn:this.loadNextPage,scope:this,element:"element"}}});return Ext.factory(a,Ext.Component,this.getLoadMoreCmp())},onScrollEnd:function(b,a,c){if(!this.getLoading()&&c>=b.maxPosition.y){if(!this.storeFullyLoaded()){this.loadNextPage()}}},updateLoading:function(a){var b=this.getLoadMoreCmp(),c=this.getLoadingCls();if(a){b.addCls(c)}else{b.removeCls(c)}},onStoreBeforeLoad:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}},onStoreLoad:function(a){var d=this.addLoadMoreCmp(),b=this.getLoadTpl(),c=this.storeFullyLoaded()?this.getNoMoreRecordsText():this.getLoadMoreText();this.getLoadMoreCmp().show();this.setLoading(false);if(this.scrollY){this.getScroller().scrollTo(null,this.scrollY);delete this.scrollY}d.setHtml(b.apply({cssPrefix:Ext.baseCSSPrefix,message:c}))},addLoadMoreCmp:function(){var b=this.getList(),a=this.getLoadMoreCmp();if(!this.getLoadMoreCmpAdded()){b.add(a);this.setLoadMoreCmpAdded(true)}return a},storeFullyLoaded:function(){var a=this.getList().getStore(),b=a.getTotalCount();return b!==null?a.getTotalCount()<=(a.currentPage*a.getPageSize()):false},loadNextPage:function(){var a=this.getList().getStore();this.setLoading(true);this.scrollY=this.getScroller().position.y;a.nextPage({addRecords:true})}});Ext.define("Ext.plugin.PullRefresh",{extend:"Ext.Component",alias:"plugin.pullrefresh",requires:["Ext.DateExtras"],config:{list:null,pullRefreshText:"Pull down to refresh...",releaseRefreshText:"Release to refresh...",loadingText:"Loading...",snappingAnimationDuration:150,refreshFn:null,pullTpl:['
    ','
    ','
    ','','','','',"
    ",'
    ','

    {message}

    ','
    Last Updated: {lastUpdated:date("m/d/Y h:iA")}
    ',"
    ","
    "].join("")},isRefreshing:false,currentViewState:"",initialize:function(){this.callParent();this.on({painted:"onPainted",scope:this})},init:function(f){var d=this,b=f.getStore(),e=d.getPullTpl(),c=d.element,a=f.getScrollable().getScroller();d.setList(f);d.lastUpdated=new Date();f.insert(0,d);if(b){if(b.isAutoLoading()){f.setLoadingText(null)}else{b.on({load:{single:true,fn:function(){f.setLoadingText(null)}}})}}e.overwrite(c,{message:d.getPullRefreshText(),lastUpdated:d.lastUpdated},true);d.loadingElement=c.getFirstChild();d.messageEl=c.down(".x-list-pullrefresh-message");d.updatedEl=c.down(".x-list-pullrefresh-updated > span");d.maxScroller=a.getMaxPosition();a.on({maxpositionchange:d.setMaxScroller,scroll:d.onScrollChange,scope:d})},fetchLatest:function(){var b=this.getList().getStore(),c=b.getProxy(),a;a=Ext.create("Ext.data.Operation",{page:1,start:0,model:b.getModel(),limit:b.getPageSize(),action:"read",filters:b.getRemoteFilter()?b.getFilters():[]});c.read(a,this.onLatestFetched,this)},onLatestFetched:function(d){var j=this.getList().getStore(),b=j.getData(),c=d.getRecords(),a=c.length,g=[],h,f,e;for(e=0;ethis.maxScroller.y){this.onBounceBottom(c)}},applyPullTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onBounceTop:function(d){var b=this,c=b.getList(),a=c.getScrollable().getScroller();if(!b.isReleased){if(!b.isRefreshing&&-d>=b.pullHeight+10){b.isRefreshing=true;b.setViewState("release");a.getContainer().onBefore({dragend:"onScrollerDragEnd",single:true,scope:b})}else{if(b.isRefreshing&&-d=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},setOffset:function(c){var a=this.getAxis(),b=this.element.dom.style;c=Math.round(c);if(a==="x"){b.webkitTransform="translate3d("+c+"px, 0, 0)"}else{b.webkitTransform="translate3d(0, "+c+"px, 0)"}}});Ext.define("Ext.scroll.indicator.Default",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"default"},setOffset:function(c){var b=this.getAxis(),a=this.element.dom.style;if(b==="x"){a.webkitTransform="translate3d("+c+"px, 0, 0)"}else{a.webkitTransform="translate3d(0, "+c+"px, 0)"}},applyLength:function(a){return Math.round(Math.max(0,a))},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>1){a=a-1}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},setLength:function(e){var c=this.getAxis(),a=this.barLength,d=this.barElement.dom,b=this.element;this.callParent(arguments);if(c==="x"){d.scrollLeft=a;b.setLeft(a)}else{d.scrollTop=a;b.setTop(a)}},setOffset:function(d){var b=this.getAxis(),a=this.barLength,c=this.barElement.dom;d=a-d;if(b==="x"){c.scrollLeft=d}else{c.scrollTop=d}}});Ext.define("Ext.scroll.Indicator",{requires:["Ext.scroll.indicator.Default","Ext.scroll.indicator.ScrollPosition","Ext.scroll.indicator.CssTransform"],alternateClassName:"Ext.util.Indicator",constructor:function(a){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){return new Ext.scroll.indicator.ScrollPosition(a)}else{if(Ext.os.is.iOS){return new Ext.scroll.indicator.CssTransform(a)}else{return new Ext.scroll.indicator.Default(a)}}}});Ext.define("Ext.scroll.View",{extend:"Ext.Evented",alternateClassName:"Ext.util.ScrollView",requires:["Ext.scroll.Scroller","Ext.scroll.Indicator"],config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=c.getFirstChild().getFirstChild(),a=this.getScroller();c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);a.setElement(b);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();Ext.destroy(this.getScroller(),this.indicatorsGrid);delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:"Ext.behavior.Behavior",requires:["Ext.scroll.View"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(d){var b=this.scrollView,c=this.component,f,e,a;if(d){if(!b){this.scrollView=b=new Ext.scroll.View(d);b.on("destroy","onScrollViewDestroy",this);c.setUseBodyElement(true);this.scrollerElement=a=c.innerElement;this.scrollContainer=e=a.wrap();this.scrollViewElement=f=c.bodyElement;b.setElement(f);if(c.isPainted()){this.onComponentPainted(c)}c.on(this.listeners)}else{if(Ext.isObject(d)){b.setConfig(d)}}}else{if(b){b.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();b.un(this.listeners);delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.Container",{extend:"Ext.Component",alternateClassName:"Ext.lib.Container",requires:["Ext.layout.Layout","Ext.ItemCollection","Ext.behavior.Scrollable","Ext.Mask"],xtype:"container",eventedConfig:{activeItem:0},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,scrollable:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange"},constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",className:"x-container",children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(a,b){b=Ext.factory(a,Ext.Mask,b);if(b){this.add(b)}return b},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},applyModal:function(a,b){if(!a&&!b){return}return Ext.factory(a,Ext.Mask,b)},updateModal:function(c,a){var b={painted:"refreshModalMask",erased:"destroyModalMask"};if(c){this.on(b);c.on("destroy","onModalDestroy",this);if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null&&!this.getCentered()){this.setTop(0);this.setLeft(0)}if(this.isPainted()){this.refreshModalMask()}}else{if(a){a.un("destroy","onModalDestroy",this);this.un(b)}}},onModalDestroy:function(){this.setModal(null)},refreshModalMask:function(){var b=this.getModal(),a=this.getParent();if(!this.painted){this.painted=true;if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}}},destroyModalMask:function(){var b=this.getModal(),a=this.getParent();if(this.painted){this.painted=false;if(b){a.remove(b,false)}}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateHideOnMaskTap:function(b){var a=this.getModal();if(a){a[b?"on":"un"].call(a,"tap","hide",this)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d)}}if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(b,null,d)}}},updateUseBodyElement:function(a){if(a){this.bodyElement=this.innerElement.wrap({cls:"x-body"});this.referenceList.push("bodyElement")}},applyItems:function(a,b){if(a){this.getDefaultType();this.getDefaults();if(this.initialized&&b.length>0){this.removeAll()}this.add(a)}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;this.setLayout(new Ext.layout.Layout(this,this.getLayout()||"default"));if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on(this.delegateListeners);return this.onItemAdd.apply(this,arguments)},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;a=Ext.Array.from(a);d=a.length;for(b=0;b0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=this.getInnerItems(),f;if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!this.removingAll&&e.length>1&&d===this.getActiveItem()){this.on({activeitemchange:"doRemove",scope:this,single:true,order:"after",args:[d,a,b]});f=e.indexOf(d);if(f===0){this.setActiveItem(1)}else{this.setActiveItem(0)}}else{this.doRemove(d,a,b)}}return c},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(c===undefined){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var a=this.getModal();if(a){a.destroy()}this.removeAll(true,true);Ext.destroy(this.getScrollable(),this.bodyElement);this.callParent()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.Panel",{extend:"Ext.Container",requires:["Ext.util.LineSegment"],alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){var a=this.callParent();a.children.push({reference:"tipElement",className:"x-anchor",hidden:true});return a},applyBodyPadding:function(a){if(a===true){a=5}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(m){var w=this.tipElement;w.hide();if(this.currentTipPosition){w.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=m.isComponent?m.renderElement:m,a=this.renderElement,n=d.getPageBox(),k=a.getPageBox(),b=k.left,t=k.top,C=k.right,h=k.bottom,j=b+(k.width/2),i=t+(k.height/2),o={x:b,y:t},l={x:C,y:t},B={x:b,y:h},D={x:C,y:h},y={x:j,y:i},s=n.left+(n.width/2),q=n.top+(n.height/2),v={x:s,y:q},c=new f(y,v),g=0,A=0,e,z,r,p,x,u;w.setVisibility(false);w.show();e=w.getSize();z=e.width;r=e.height;if(c.intersects(new f(o,l))){x=Math.min(Math.max(s,b),C-(z/2));u=t;A=r+10;p="top"}else{if(c.intersects(new f(o,B))){x=b;u=Math.min(Math.max(q+(z/2),t),h);g=r+10;p="left"}else{if(c.intersects(new f(B,D))){x=Math.min(Math.max(s,b),C-(z/2));u=h;A=-r-10;p="bottom"}else{if(c.intersects(new f(l,D))){x=C;u=Math.min(Math.max(q-(z/2),t),h);g=-r-10;p="right"}}}}if(x||u){this.currentTipPosition=p;w.addCls("x-anchor-"+p);w.setLeft(x-b);w.setTop(u-t);w.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+A)}}});Ext.define("Ext.SegmentedButton",{extend:"Ext.Container",xtype:"segmentedbutton",requires:["Ext.Button"],config:{baseCls:Ext.baseCSSPrefix+"segmentedbutton",pressedCls:Ext.baseCSSPrefix+"button-pressed",allowMultiple:false,allowDepress:null,pressedButtons:null,layout:{type:"hbox",align:"stretch"},defaultType:"button"},initialize:function(){var a=this;a.callParent();a.on({delegate:"> button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hiddenchange:"onButtonHiddenChange"})},updateAllowMultiple:function(){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;b--){c=a.items[b];if(!c.isHidden()){c.addCls(e+"last");break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(Ext.isArray(a)){d=a.length;for(b=0;bm){c.renderElement.setWidth(m)}}var j=this.spacer.renderElement.getPageBox(),k=f.getPageBox(),g=k.width-j.width,d=k.left,i=k.right,b,l,e;if(g>0){f.setWidth(j.width);b=g/2;d+=b;i-=b}l=j.left-d;e=i-j.right;if(l>0){f.setLeft(l)}else{if(e>0){f.setLeft(-e)}}f.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);this.titleBox=null;if(this.painted){this.refreshTitlePosition()}},destroy:function(){this.callParent();var a=this.sizeMonitors;a.leftBox.destroy();a.spacer.destroy();a.rightBox.destroy()}});Ext.define("Ext.Toolbar",{extend:"Ext.Container",xtype:"toolbar",requires:["Ext.Button","Ext.Title","Ext.Spacer"],isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",ui:"dark",title:null,defaultType:"button",layout:{type:"hbox",align:"center"}},constructor:function(a){a=a||{};if(a.docked=="left"||a.docked=="right"){a.layout={type:"vbox",align:"stretch"}}this.callParent([a])},applyTitle:function(a){if(typeof a=="string"){a={title:a,centered:true}}return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b);this.getLayout().setItemFlex(b,1)}if(a){a.destroy()}},showTitle:function(){var a=this.getTitle();if(a){a.show()}},hideTitle:function(){var a=this.getTitle();if(a){a.hide()}}},function(){});Ext.define("Ext.MessageBox",{extend:"Ext.Sheet",requires:["Ext.Toolbar","Ext.field.Text","Ext.field.TextArea"],config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:10,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,layout:{type:"vbox",pack:"center"}},statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.callParent([a])},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",cls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Toolbar,this.getTitle())},updateTitle:function(a){if(a){this.add(a)}},updateButtons:function(a){var b=this;if(a){if(b.buttonsToolbar){b.buttonsToolbar.removeAll();b.buttonsToolbar.setItems(a)}else{b.buttonsToolbar=Ext.create("Ext.Toolbar",{docked:"bottom",defaultType:"button",layout:{type:"hbox",pack:"center"},ui:b.getUi(),cls:b.getBaseCls()+"-buttons",items:a});b.add(b.buttonsToolbar)}}},applyMessage:function(a){a={html:a,cls:this.getBaseCls()+"-text"};return Ext.factory(a,Ext.Component,this._message)},updateMessage:function(a){if(a){this.add(a)}},getMessage:function(){if(this._message){return this._message.getHtml()}return null},applyIconCls:function(a){a={xtype:"component",docked:"left",width:40,height:40,baseCls:Ext.baseCSSPrefix+"icon",hidden:(a)?false:true,cls:a};return Ext.factory(a,Ext.Component,this._iconCls)},updateIconCls:function(a,b){var c=this;this.getTitle();this.getButtons();if(a&&!b){this.add(a)}else{this.remove(b)}},getIconCls:function(){var b=this._iconCls,a;if(b){a=b.getCls();return(a)?a[0]:null}return null},applyPrompt:function(a){if(a){var b={label:false};if(Ext.isObject(a)){Ext.apply(b,a)}if(b.multiLine){b.height=Ext.isNumber(b.multiLine)?parseFloat(b.multiLine):this.getDefaultTextHeight();return Ext.factory(b,Ext.field.TextArea,this.getPrompt())}else{return Ext.factory(b,Ext.field.Text,this.getPrompt())}}return a},updatePrompt:function(a,b){if(a){this.add(a)}if(b){this.remove(b)}},onClick:function(c){if(c){var b=c.config.userConfig||{},d=c.getInitialConfig(),a=this.getPrompt();if(typeof b.fn=="function"){this.on({hiddenchange:function(){b.fn.call(b.scope||null,d.itemId||d.text,a?a.getValue():null,b)},single:true,scope:this})}if(b.cls){this.el.removeCls(b.cls)}if(b.input){b.input.dom.blur()}}this.hide()},show:function(f){if(!this.getParent()&&Ext.Viewport){Ext.Viewport.add(this)}if(!f){return this.callParent()}var b=Ext.Object.merge({},{value:""},f);var e=f.buttons||Ext.MessageBox.OK||[],d=[],c=f;Ext.each(e,function(g){if(!g){return}d.push(Ext.apply({userConfig:c,scope:this,handler:"onClick"},g))},this);b.buttons=d;if(b.promptConfig){}b.prompt=(b.promptConfig||b.prompt)||null;if(b.multiLine){b.prompt=b.prompt||{};b.prompt.multiLine=b.multiLine;delete b.multiLine}this.setConfig(b);var a=this.getPrompt();if(a){a.setValue(f.value||"")}this.callParent();return this},alert:function(d,c,b,a){return this.show({title:d,message:c,buttons:Ext.MessageBox.OK,promptConfig:false,fn:function(e){if(b){b.call(a,e)}},scope:a})},confirm:function(d,c,b,a){return this.show({title:d,message:c,buttons:Ext.MessageBox.YESNO,promptConfig:false,scope:a,fn:function(e){if(b){b.call(a,e)}}})},prompt:function(g,d,c,b,f,e,a){return this.show({title:g,message:d,buttons:Ext.MessageBox.OKCANCEL,scope:b,prompt:a||true,multiLine:f,value:e,fn:function(i,h){if(c){c.call(b,i,h)}}})}},function(a){Ext.onSetup(function(){Ext.Msg=new a})});Ext.define("Ext.carousel.Carousel",{extend:"Ext.Container",alternateClassName:"Ext.Carousel",xtype:"carousel",requires:["Ext.fx.easing.EaseOut","Ext.carousel.Item","Ext.carousel.Indicator"],config:{baseCls:"x-carousel",direction:"horizontal",directionLock:false,animation:{duration:250,easing:{type:"ease-out"}},indicator:true,ui:"dark",itemConfig:{},bufferSize:1,itemLength:null},itemLength:0,offset:0,flickStartOffset:0,flickStartTime:0,dragDirection:0,count:0,painted:false,activeIndex:-1,beforeInitialize:function(){this.animationListeners={animationframe:"onActiveItemAnimationFrame",animationend:"onActiveItemAnimationEnd",scope:this};this.element.on({dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",scope:this});this.on({painted:"onPainted",erased:"onErased",resize:"onSizeChange"});this.carouselItems=[];this.orderedCarouselItems=[];this.inactiveCarouselItems=[];this.hiddenTranslation=0},updateBufferSize:function(n){var l=Ext.carousel.Item,h=n*2+1,m=this.isRendered(),c=this.innerElement,g=this.carouselItems,f=g.length,e=this.getItemConfig(),d=this.getItemLength(),j=this.getDirection(),b=j==="horizontal"?"setWidth":"setHeight",a,k;for(a=f;a=a-c&&b<=a+c)},onDragStart:function(f){var d=this.getDirection(),b=f.absDeltaX,a=f.absDeltaY,c=this.getDirectionLock();this.isDragging=true;if(c){if((d==="horizontal"&&b>a)||(d==="vertical"&&a>b)){f.stopPropagation()}else{this.isDragging=false;return}}if(this.isAnimating){this.getActiveCarouselItem().getTranslatable().stopAnimation()}this.dragStartOffset=this.offset;this.dragDirection=0},onDrag:function(j){if(!this.isDragging){return}var k=this.dragStartOffset,l=this.getDirection(),m=l==="horizontal"?j.deltaX:j.deltaY,a=this.offset,i=this.flickStartTime,c=this.dragDirection,b=Ext.Date.now(),h=this.getActiveIndex(),f=this.getMaxItemIndex(),d=c,g;if((h===0&&m>0)||(h===f&&m<0)){m*=0.5}g=k+m;if(g>a){c=1}else{if(g300){this.flickStartOffset=a;this.flickStartTime=b}this.dragDirection=c;this.setOffset(g)},onDragEnd:function(j){if(!this.isDragging){return}this.onDrag(j);this.isDragging=false;var a=Ext.Date.now(),i=this.itemLength,g=i/2,f=this.offset,m=this.getActiveIndex(),c=this.getMaxItemIndex(),h=0,l=f-this.flickStartOffset,b=a-this.flickStartTime,k=this.getIndicator(),d;if(b>0&&Math.abs(l)>=10){d=l/b;if(Math.abs(d)>=1){if(d<0&&m0&&m>0){h=1}}}}if(h===0){if(m0&&f>g){h=1}}}if(k){k.setActiveIndex(m-h)}this.animationDirection=h;this.setOffsetAnimated(h*i)},applyAnimation:function(a){a.easing=Ext.factory(a.easing,Ext.fx.easing.EaseOut);return a},updateDirection:function(b){var a=this.getIndicator();this.currentAxis=(b==="horizontal")?"x":"y";if(a){a.setDirection(b)}},setOffset:function(e){var k=this.orderedCarouselItems,c=this.getBufferSize(),g=k[c],j=this.itemLength,d=this.currentAxis,a,h,b,f;this.offset=e;e+=this.itemOffset;if(g){g.translateAxis(d,e);for(f=1,b=0;f<=c;f++){h=k[c-f];if(h){b+=j;h.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=k[c+f];if(a){b+=j;a.translateAxis(d,e+b)}}}return this},setOffsetAnimated:function(c){var b=this.orderedCarouselItems[this.getBufferSize()],a=this.getIndicator();if(a){a.setActiveIndex(this.getActiveIndex()-this.animationDirection)}this.offset=c;c+=this.itemOffset;if(b){this.isAnimating=true;b.getTranslatable().on(this.animationListeners);b.translateAxis(this.currentAxis,c,this.getAnimation())}return this},onActiveItemAnimationFrame:function(k){var j=this.orderedCarouselItems,c=this.getBufferSize(),h=this.itemLength,d=this.currentAxis,e=k[d],g,a,f,b;for(f=1,b=0;f<=c;f++){g=j[c-f];if(g){b+=h;g.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=j[c+f];if(a){b+=h;a.translateAxis(d,e+b)}}},onActiveItemAnimationEnd:function(b){var c=this.getActiveIndex(),a=this.animationDirection,e=this.currentAxis,f=b[e],d=this.itemLength,g;this.isAnimating=false;b.un(this.animationListeners);if(a===-1){g=d+f}else{if(a===1){g=f-d}else{g=f}}g-=this.itemOffset;this.offset=g;this.setActiveItem(c-a)},refresh:function(){this.refreshSizing();this.refreshActiveItem()},refreshSizing:function(){var a=this.element,b=this.getItemLength(),c,d;if(this.getDirection()==="horizontal"){d=a.getWidth()}else{d=a.getHeight()}this.hiddenTranslation=-d;if(b===null){b=d;c=0}else{c=(d-b)/2}this.itemLength=b;this.itemOffset=c},refreshOffset:function(){this.setOffset(this.offset)},refreshActiveItem:function(){this.doSetActiveItem(this.getActiveItem())},getActiveIndex:function(){return this.activeIndex},refreshActiveIndex:function(){this.activeIndex=this.getInnerItemIndex(this.getActiveItem())},refreshCarouselItems:function(){var a=this.carouselItems,b,d,c;for(b=0,d=a.length;b0){for(f=1;f<=c;f++){h=q-f;if(h>=0){a=this.getInnerItemAt(h);b=a.getId();o[b]=a;p[b]=c-f}else{break}}}if(qb){this.setActiveItem(b)}else{this.rebuildInnerIndexes(a);this.refreshActiveItem()}}},rebuildInnerIndexes:function(n){var c=this.innerIndexToItem,g=this.innerIdToIndex,j=this.innerItems.slice(),h=j.length,b=this.getBufferSize(),d=this.getMaxItemIndex(),l=[],e,k,f,a,m;if(n===undefined){this.innerIndexToItem=c={};this.innerIdToIndex=g={};for(e=0;e=0&&e<=d){if(c.hasOwnProperty(e)){Ext.Array.remove(j,c[e]);continue}l.push(e)}}for(e=0,h=l.length;e ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c{text}",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var b=this;b.hasLoadedStore=false;b.mixins.selectable.constructor.apply(b,arguments);b.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a;b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;b.on(b.getTriggerEvent(),b.onItemTrigger,b);a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(this.getStore()){this.refresh()}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){this.selectWithEvent(this.getStore().getAt(a))},doAddPressedCls:function(a){var c=this,b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.addCls(c.getPressedCls())}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}},onItemDeselect:function(a,b){var c=this;if(c.container){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls([c.getPressedCls(),c.getSelectedCls()])}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){if(e.autoDestroy){e.destroy()}else{e.un(f);c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var b=this.getScrollable();if(b){b.getScroller().stopAnimation()}var a=this.getLoadingText();if(a){this.setMasked({xtype:"loadmask",message:a});if(b){b.getScroller().setDisabled(true)}}this.hideEmptyText()},updateEmptyText:function(b){var a=this;if(b){a.emptyTextCmp=a.add({xtype:"component",cls:a.getBaseCls()+"-emptytext",html:b,hidden:true})}else{if(a.emptyTextCmp){a.remove(a.emptyTextCmp,true);delete a.emptyTextCmp}}},onLoad:function(a){var b=this.getScrollable();this.hasLoadedStore=true;this.setMasked(false);if(b){b.getScroller().setDisabled(false)}if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(f){var a=f.container,j=f.getStore(),b=j.getRange(),e=a.getViewItems(),h=b.length,l=e.length,c=h-l,g=f.getScrollable(),d,k;if(this.getScrollToTopOnRefresh()&&g){g.getScroller().scrollToTop()}if(h<1){f.onStoreClear();return}if(c<0){a.moveItemsToCache(l+c,l-1);e=a.getViewItems();l=e.length}else{if(c>0){a.moveItemsFromCache(j.getRange(l))}}for(d=0;dh.y){c=g;break}f=g}return{current:f,next:c}},doRefreshHeaders:function(){if(!this.getGrouped()||!this.container){return false}var l=this.findGroupHeaderIndices(),f=l.length,g=this.container.getViewItems(),j=this.pinHeaderInfo={offsets:[]},a=j.offsets,h=this.getScrollable(),e,k,b,d,c;if(f){for(b=0;bd.offset)||(f&&h0&&d.offset-h<=c){var k=c-(d.offset-h);this.translateHeader(k)}else{this.translateHeader(null)}},translateHeaderTransform:function(a){this.header.renderElement.dom.style.webkitTransform=(a===null)?null:"translate3d(0px, -"+a+"px, 0px)"},translateHeaderCssPosition:function(a){this.header.renderElement.dom.style.top=(a===null)?null:"-"+Math.round(a)+"px"},setActiveGroup:function(b){var a=this,c=a.header;if(c){if(b){if(!a.activeGroup||a.activeGroup.header!=b.header){c.show();if(c.element){c.setHtml(b.header.innerHTML)}}}else{if(c&&c.dom){c.hide()}}}this.activeGroup=b},onIndex:function(o,c){var r=this,s=c.toLowerCase(),b=r.getStore(),q=b.getGroups(),f=q.length,h=r.getScrollable(),n,e,m,g,k,p;if(h){n=r.getScrollable().getScroller()}else{return}for(m=0;ms){g=e;break}else{g=e}}if(h&&g){p=r.container.getViewItems()[b.indexOf(g.children[0])];n.stopAnimation();var l=n.getContainerSize().y,j=n.getSize().y,d=j-l,a=(p.offsetTop>d)?d:p.offsetTop;n.scrollTo(0,a)}},applyOnItemDisclosure:function(a){if(Ext.isFunction(a)){return{scope:this,handler:a}}return a},handleItemDisclosure:function(f){var d=this,c=f.getTarget().parentNode,b=d.container.getViewItems().indexOf(c),a=d.getStore().getAt(b);d.fireAction("disclose",[d,a,c,b,f],"doDisclose")},doDisclose:function(f,a,d,c,g){var b=f.getOnItemDisclosure();if(b&&b.handler){b.handler.call(f,a,d,c,g)}},findGroupHeaderIndices:function(){if(!this.getGrouped()){return[]}var h=this,k=h.getStore();if(!k){return[]}var b=h.container,d=k.getGroups(),m=d.length,g=b.getViewItems(),c=[],l=b.footerClsShortCache,e,a,f,n,j;b.doRemoveHeaders();b.doRemoveFooterCls();if(g.length){for(e=0;e class="x-list-item-leaf">'+a.getItemTextTpl(b)+""},this.getListConfig())}},function(){});Ext.define("Ext.form.FieldSet",{extend:"Ext.Container",alias:"widget.fieldset",requires:["Ext.Title"],config:{baseCls:Ext.baseCSSPrefix+"form-fieldset",title:null,instructions:null},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",baseCls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},applyInstructions:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"bottom",baseCls:this.getBaseCls()+"-instructions"});return Ext.factory(a,Ext.Title,this.getInstructions())},updateInstructions:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}}});Ext.define("Ext.form.Panel",{alternateClassName:"Ext.form.FormPanel",extend:"Ext.Panel",xtype:"formpanel",requires:["Ext.XTemplate","Ext.field.Checkbox","Ext.Ajax"],config:{baseCls:Ext.baseCSSPrefix+"form",standardSubmit:false,url:null,baseParams:null,submitOnAction:true,record:null,method:"post",scrollable:{translationMethod:"scrollposition"}},getElementConfig:function(){var a=this.callParent();a.tag="form";return a},initialize:function(){var a=this;a.callParent();a.on({action:"onFieldAction",scope:a});a.element.on({submit:"onSubmit",scope:a})},updateRecord:function(c){var a,b,d;if(c&&(a=c.fields)){b=this.getValues();for(d in b){if(b.hasOwnProperty(d)&&a.containsKey(d)){c.set(d,b[d])}}}return this},setRecord:function(a){var b=this;if(a&&a.data){b.setValues(a.data)}b._record=a;return this},onSubmit:function(b){var a=this;if(b&&!a.getStandardSubmit()){b.stopEvent()}a.fireAction("submit",[a,a.getValues(true),b],"doSubmit")},doSubmit:function(b,a,c){if(c){c.stopEvent()}},onFieldAction:function(a){if(this.getSubmitOnAction()){a.blur();this.submit()}},submit:function(a){var c=this,b=c.element.dom||{},d;a=Ext.apply({url:c.getUrl()||b.action,submit:false,method:c.getMethod()||b.method||"post",autoAbort:false,params:null,waitMsg:null,headers:null,success:null,failure:null},a||{});d=c.getValues(c.getStandardSubmit()||!a.submitDisabled);return c.fireAction("beforesubmit",[c,d,a],"doBeforeSubmit")},doBeforeSubmit:function(c,d,a){var b=c.element.dom||{};if(c.getStandardSubmit()){if(a.url&&Ext.isEmpty(b.action)){b.action=a.url}b.method=(a.method||b.method).toLowerCase();b.submit()}else{if(a.waitMsg){c.setMasked(a.waitMsg)}return Ext.Ajax.request({url:a.url,method:a.method,rawData:Ext.urlEncode(Ext.apply(Ext.apply({},c.getBaseParams()||{}),a.params||{},d)),autoAbort:a.autoAbort,headers:Ext.apply({"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},a.headers||{}),scope:c,callback:function(e,j,f){var h=this,i=f.responseText,g;h.setMasked(false);g=function(){if(Ext.isFunction(a.failure)){a.failure.call(a.scope||h,h,f,i)}h.fireEvent("exception",h,f)};if(j){f=Ext.decode(i);j=!!f.success;if(j){if(Ext.isFunction(a.success)){a.success.call(a.scope||h,h,f,i)}h.fireEvent("submit",h,f)}else{g()}}else{g()}}})}},setValues:function(b){var a=this.getFields(),c,e,d;b=b||{};for(c in b){if(b.hasOwnProperty(c)){e=a[c];d=b[c];if(e){if(Ext.isArray(e)){e.forEach(function(g){if(g.isRadio){g.setGroupValue(d)}else{if(Ext.isArray(b[c])){g.setChecked((d.indexOf(g.getValue())!=-1))}else{g.setChecked((d==g.getValue()))}}})}else{if(e.setChecked){e.setChecked(d)}else{e.setValue(d)}}}}}return this},getValues:function(d){var a=this.getFields(),b={},g,c,f,e;for(c in a){if(a.hasOwnProperty(c)){if(Ext.isArray(a[c])){b[c]=[];f=a[c].length;for(e=0;e1){this.pushBackButtonAnimated(this.getBackButtonText())}this.pushTitleAnimated(this.getTitleText())}else{if(this.backButtonStack.length>1){this.pushBackButton(this.getBackButtonText())}this.pushTitle(this.getTitleText())}},onViewRemove:function(a,c,b){var d=a.getLayout().getAnimation();this.endAnimation();this.backButtonStack.pop();this.refreshNavigationBarProxy();if(d&&d.isAnimation&&a.isPainted()){this.popBackButtonAnimated(this.getBackButtonText());this.popTitleAnimated(this.getTitleText())}else{this.popBackButton(this.getBackButtonText());this.popTitle(this.getTitleText())}},endAnimation:function(){var c=this.lastAnimationProperties,d,b,a;if(c){for(d in c){b=Ext.get(d);for(a in c[d].to){b.setStyle(a,c[d][a])}if(c[d].onEnd){c[d].onEnd.call(this)}}}},applyBackButton:function(a){return Ext.factory(a,Ext.Button,this.getBackButton())},updateBackButton:function(a,b){if(b){this.remove(b)}if(a){this.add(a);a.on({scope:this,tap:this.onBackButtonTap})}},onBackButtonTap:function(){this.fireEvent("back",this)},updateUseTitleForBackButtonText:function(a){var b=this.getBackButton();if(b){b.setText(this.getBackButtonText())}this.onSizeMonitorChange()},onPainted:function(){this.painted=true;this.sizeMonitor.refresh();this.onSizeMonitorChange()},onErased:function(){this.painted=false},applyItems:function(c){var e=this;if(!e.initialized){var f=e.getDefaults()||{},a,b,d;e.leftBox=a=e.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"}});e.spacer=d=e.add({xtype:"component",style:"position: relative",flex:1});e.rightBox=b=e.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"}});e.titleComponent=e.add({xtype:"title",hidden:f.hidden,centered:true});e.sizeMonitor=new Ext.util.SizeMonitor({element:e.element,callback:e.onSizeMonitorChange,scope:e});e.doAdd=e.doBoxAdd;e.doInsert=e.doBoxInsert}e.callParent(arguments)},doBoxAdd:function(a){if(a.config.align=="right"){this.rightBox.add(a)}else{this.leftBox.add(a)}},doBoxInsert:function(a,b){if(b.config.align=="right"){this.rightBox.add(b)}else{this.leftBox.add(b)}},onSizeMonitorChange:function(){if(!this.rendered){return}var c=this.getBackButton(),a=this.titleComponent;if(c&&c.rendered){c.setWidth(null)}this.refreshNavigationBarProxy();var b=this.getNavigationBarProxyProperties();if(c&&c.rendered){c.setWidth(b.backButton.width)}a.setStyle("-webkit-transform",null);a.setWidth(b.title.width);a.element.setLeft(b.title.left)},getBackButtonAnimationProperties:function(){var c=this,b=c.element,h=c.getBackButton().element,e=c.titleComponent.element,g=Math.min(b.getWidth()/3,200),a=this.getNavigationBarProxyProperties(),d,f;d=e.getX()-b.getX();f=b.getX()-h.getX()-h.getWidth();d=Math.min(d,g);return{element:{from:{left:d,width:a.backButton.width,opacity:0},to:{left:0,width:a.backButton.width,opacity:1}},ghost:{from:null,to:{left:f,opacity:0}}}},getBackButtonAnimationReverseProperties:function(){var d=this,c=d.element,h=d.getBackButton().element,f=d.titleComponent.element,b=Math.min(c.getWidth()/3,200),a=this.getNavigationBarProxyProperties(),e,g;e=c.getX()-h.getX()-h.getWidth();g=f.getX()-h.getWidth();g=Math.min(g,b);return{element:{from:{left:e,width:a.backButton.width,opacity:0},to:{left:0,width:a.backButton.width,opacity:1}},ghost:{from:null,to:{left:g,opacity:0}}}},getTitleAnimationProperties:function(){var c=this,b=c.element,e=c.titleComponent.element,a=this.getNavigationBarProxyProperties(),d,f;d=b.getWidth()-e.getX();f=b.getX()-e.getX()+a.backButton.width;if((a.backButton.left+e.getWidth())>e.getX()){f=b.getX()-e.getX()-e.getWidth()}return{element:{from:{left:d,width:a.title.width,opacity:0},to:{left:a.title.left,width:a.title.width,opacity:1}},ghost:{from:e.getLeft(),to:{left:f,opacity:0}}}},getTitleAnimationReverseProperties:function(){var d=this,c=d.element,f=d.titleComponent.element,a=this.getNavigationBarProxyProperties(),b=0,e,g;b=f.getLeft();f.setLeft(0);e=c.getX()-f.getX()+a.backButton.width;g=c.getX()+c.getWidth();if((a.backButton.left+f.getWidth())>f.getX()){e=c.getX()-f.getX()-f.getWidth()}return{element:{from:{left:e,width:a.title.width,opacity:0},to:{left:a.title.left,width:a.title.width,opacity:1}},ghost:{from:b,to:{left:g,opacity:0}}}},animate:function(c,d,h,g,b){var e=this,a={element:d,easing:"ease-in-out",duration:this.getAnimation().duration,replacePrevious:true,preserveEndState:true},f;this.lastAnimationProperties[d.id]={to:g,onEnd:b};d.setLeft(0);if(Ext.os.is.Android){if(h){a.from={left:h.left,opacity:h.opacity};if(h.width){a.from.width=h.width}}if(g){a.to={left:g.left,opacity:g.opacity};if(g.width){a.to.width=g.width}}}else{if(h){a.from={transform:{translateX:h.left},opacity:h.opacity};if(h.width){a.from.width=h.width}}if(g){a.to={transform:{translateX:g.left},opacity:g.opacity};if(g.width){a.to.width=g.width}}}fn=function(){if(b){b.call(e)}if(c&&Ext.isNumber(g.width)){c.setWidth(g.width)}e.lastAnimationProperties={}};f=new Ext.fx.Animation(a);f.on("animationend",fn,this);Ext.Animator.run(f)},getBackButtonText:function(){var b=this.backButtonStack[this.backButtonStack.length-2],a=this.getUseTitleForBackButtonText();if(!a){if(b){b=this.getDefaultBackButtonText()}}return b},getTitleText:function(){return this.backButtonStack[this.backButtonStack.length-1]},pushBackButton:function(c){var b=this.getBackButton();b.setText(c);b.show();var a=this.getBackButtonAnimationProperties(),d=a.element.to;if(d.left){b.setLeft(d.left)}if(d.width){b.setWidth(d.width)}},pushBackButtonAnimated:function(f){var e=this;var d=e.getBackButton(),b=d.getText(),g=d.element,c=e.getBackButtonAnimationProperties(),a;if(b){a=e.createProxy(d)}d.setText(this.getBackButtonText());d.show();e.animate(d,g,c.element.from,c.element.to,function(){e.animating=false});if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},popBackButton:function(c){var b=this.getBackButton();b.setText(null);if(c){b.setText(this.getBackButtonText())}else{b.hide()}var a=this.getBackButtonAnimationReverseProperties(),d=a.element.to;if(d.left){b.setLeft(d.left)}if(d.width){b.setWidth(d.width)}},popBackButtonAnimated:function(f){var e=this;var d=e.getBackButton(),b=d.getText(),g=d.element,c=e.getBackButtonAnimationReverseProperties(),a;if(b){a=e.createProxy(d)}if(f&&e.backButtonStack.length){d.setText(this.getBackButtonText());d.show();e.animate(d,g,c.element.from,c.element.to)}else{d.hide()}if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy();if(!f){d.setText(null)}})}},pushTitle:function(e){var c=this.titleComponent,b=c.element,a=this.getTitleAnimationProperties(),d=a.element.to;c.setTitle(e);if(d.left){b.setLeft(d.left)}if(d.width){c.setWidth(d.width)}},pushTitleAnimated:function(h){var e=this;var d=e.getBackButton(),b=(d)?d.getText():null,g=e.titleComponent,f=g.element,c,a;if(b){a=e.createProxy(g,true)}g.setTitle(h);c=e.getTitleAnimationProperties();e.animate(g,f,c.element.from,c.element.to);if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},popTitle:function(e){var c=this.titleComponent,b=c.element,a=this.getTitleAnimationReverseProperties(),d=a.element.to;c.setTitle(e);if(d.left){b.setLeft(d.left)}if(d.width){c.setWidth(d.width)}},popTitleAnimated:function(h){var e=this;var d=e.getBackButton(),b=e.titleComponent.getTitle(),g=e.titleComponent,f=g.element,c=e.getTitleAnimationReverseProperties(),a;if(b){a=e.createProxy(g,true)}g.setTitle(h||"");e.animate(g,f,c.element.from,c.element.to,function(){e.animating=false});if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},createNavigationBarProxy:function(){var a=this.proxy;if(a){return}this.proxy=a=Ext.create("Ext.TitleBar",{items:[{xtype:"button",ui:"back",text:""}],title:this.backButtonStack[0]});a.backButton=a.down("button[ui=back]");Ext.getBody().appendChild(a.element);a.element.setStyle("position","absolute");a.element.setStyle("visibility","hidden");a.element.setX(0);a.element.setY(-1000)},getNavigationBarProxyProperties:function(){return{title:{left:this.proxy.titleComponent.element.getLeft(),width:this.proxy.titleComponent.element.getWidth()},backButton:{left:this.proxy.backButton.element.getLeft(),width:this.proxy.backButton.element.getWidth()}}},refreshNavigationBarProxy:function(){var c=this.proxy,b=this.element,a=this.backButtonStack,e=a[a.length-1],d=this.getBackButtonText();if(!c){this.createNavigationBarProxy();c=this.proxy}c.element.setWidth(b.getWidth());c.element.setHeight(b.getHeight());c.setTitle(e);if(d){c.backButton.setText(d);c.backButton.show()}else{c.backButton.hide()}c.refreshTitlePosition()},onBeforePop:function(b){b--;for(var a=0;a1&&d===this.getActiveItem()){this.on({activeitemchange:"doRemove",scope:this,single:true,order:"after",args:[d,a,b]});g=f.indexOf(d);if(g>0){if(e&&e.isAnimation){e.setReverse(true)}this.setActiveItem(g-1);this.getNavigationBar().onViewRemove(this,f[g],g)}}else{this.doRemove(d,a,b)}}return c},doRemove:function(){var a=this.getLayout().getAnimation();if(a&&a.isAnimation){a.setReverse(false)}this.callParent(arguments)},onItemAdd:function(b,a){this.doItemLayoutAdd(b,a);if(!this.isItemsInitializing&&b.isInnerItem()){this.setActiveItem(b);this.getNavigationBar().onViewAdd(this,b,a)}if(this.initialized){this.fireEvent("add",this,b,a)}},reset:function(){this.pop(this.getInnerItems().length)}});Ext.define("Ext.picker.Slot",{extend:"Ext.DataView",xtype:"pickerslot",alternateClassName:"Ext.Picker.Slot",requires:["Ext.XTemplate","Ext.data.Store","Ext.Component","Ext.data.StoreManager"],isSlot:true,config:{title:null,showTitle:true,cls:Ext.baseCSSPrefix+"picker-slot",name:null,value:null,flex:1,align:"left",displayField:"text",valueField:"value",scrollable:{direction:"vertical",indicators:false,momentumEasing:{minVelocity:2},slotSnapEasing:{duration:100}}},constructor:function(){this.selectedIndex=0;this.callParent(arguments)},applyTitle:function(a){if(a){a=Ext.create("Ext.Component",{cls:Ext.baseCSSPrefix+"picker-slot-title",docked:"top",html:a})}return a},updateTitle:function(b,a){if(b){this.add(b);this.setupBar()}if(a){this.remove(a)}},updateShowTitle:function(a){var b=this.getTitle();if(b){b[a?"show":"hide"]();this.setupBar()}},updateDisplayField:function(a){this.setItemTpl('
    '+Ext.baseCSSPrefix+'picker-invalid">{'+a+"}
    ")},updateAlign:function(a,c){var b=this.element;b.addCls(Ext.baseCSSPrefix+"picker-"+a);b.removeCls(Ext.baseCSSPrefix+"picker-"+c)},applyData:function(d){var f=[],c=d&&d.length,a,b,e;if(d&&Ext.isArray(d)&&c){for(a=0;a{'+this.getDisplayField()+"}",listeners:{select:this.onListSelect,itemtap:this.onListTap,scope:this}}},a))}return this.listPanel},onMaskTap:function(){if(this.getDisabled()){return false}this.showPicker();return false},showPicker:function(){if(this.getStore().getCount()===0){return}if(this.getReadOnly()){return}this.isFocused=true;if(this.getUsePicker()){var e=this.getPhonePicker(),d=this.getName(),h={};h[d]=this.record.get(this.getValueField());e.setValue(h);if(!e.getParent()){Ext.Viewport.add(e)}e.show()}else{var f=this.getTabletPicker(),g=f.down("list"),b=g.getStore(),c=b.find(this.getValueField(),this.getValue(),null,null,null,true),a=b.getAt((c==-1)?0:c);if(!f.getParent()){Ext.Viewport.add(f)}f.showBy(this.getComponent());g.select(a,null,true)}},onListSelect:function(c,a){var b=this;if(a){b.setValue(a)}},onListTap:function(){this.listPanel.hide({type:"fade",out:true,scope:this})},onPickerChange:function(d,f){var e=this,g=f[e.getName()],b=e.getStore(),c=b.find(e.getValueField(),g,null,null,null,true),a=b.getAt(c);e.setValue(a)},updateOptions:function(b){var a=this.getStore();if(!b){a.clearData()}else{a.setData(b);this.onStoreDataChanged(a)}},applyStore:function(a){if(a===true){a=Ext.create("Ext.data.Store",{fields:[this.getValueField(),this.getDisplayField()]})}if(a){a=Ext.data.StoreManager.lookup(a);a.on({scope:this,addrecords:this.onStoreDataChanged,removerecords:this.onStoreDataChanged,updaterecord:this.onStoreDataChanged,refresh:this.onStoreDataChanged})}return a},updateStore:function(a){if(a){this.onStoreDataChanged(a)}},onStoreDataChanged:function(a){var c=this.getInitialConfig(),b=this.getValue();if(Ext.isDefined(b)){this.updateValue(this.applyValue(b))}if(this.getValue()===null){if(c.hasOwnProperty("value")){this.setValue(c.value)}if(this.getValue()===null){if(a.getCount()>0){this.setValue(a.getAt(0))}}}},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){var b=this.getStore(),a=(this.originalValue)?this.originalValue:b.getAt(0);if(b&&a){this.setValue(a)}return this},onFocus:function(a){this.fireEvent("focus",this,a);this.isFocused=true;this.showPicker()},destroy:function(){this.callParent(arguments);Ext.destroy(this.listPanel,this.picker,this.hiddenField)}});Ext.define("Ext.picker.Date",{extend:"Ext.picker.Picker",xtype:"datepicker",alternateClassName:"Ext.DatePicker",requires:["Ext.DateExtras"],config:{yearFrom:1980,yearTo:new Date().getFullYear(),monthText:"Month",dayText:"Day",yearText:"Year",slotOrder:["month","day","year"]},initialize:function(){this.callParent();this.on({scope:this,delegate:"> slot",slotpick:this.onSlotPick})},setValue:function(b,a){if(Ext.isDate(b)){b={day:b.getDate(),month:b.getMonth()+1,year:b.getFullYear()}}this.callParent([b,a])},getValue:function(){var h={},a,g,c,f,e=this.getItems().items,d=e.length,j,b;for(b=0;bf){e=m;m=f;f=e}for(d=m;d<=f;d++){g.push({text:d,value:d})}a=this.getDaysInMonth(1,new Date().getFullYear());for(d=0;d thumb",dragstart:"onThumbDragStart",drag:"onThumbDrag",dragend:"onThumbDragEnd"});this.on({painted:"refresh",resize:"refresh"})},factoryThumb:function(){return Ext.factory(this.getThumbConfig(),Ext.slider.Thumb)},getThumbs:function(){return this.innerItems},getThumb:function(a){if(typeof a!="number"){a=0}return this.innerItems[a]},refreshOffsetValueRatio:function(){var b=this.getMaxValue()-this.getMinValue(),a=this.elementWidth-this.thumbWidth;this.offsetValueRatio=a/b},refreshElementWidth:function(){this.elementWidth=this.element.dom.offsetWidth;this.thumbWidth=this.getThumb(0).getElementWidth()},refresh:function(){this.refreshElementWidth();this.refreshValue()},setActiveThumb:function(b){var a=this.activeThumb;if(a&&a!==b){a.setZIndex(null)}this.activeThumb=b;b.setZIndex(2);return this},onThumbDragStart:function(a,b){if(b.absDeltaX<=b.absDeltaY){return false}else{b.stopPropagation()}if(this.getAllowThumbsOverlapping()){this.setActiveThumb(a)}this.dragStartValue=this.getValue()[this.getThumbIndex(a)];this.fireEvent("dragstart",this,a,this.dragStartValue,b)},onThumbDrag:function(c,g,a){var d=this.getThumbIndex(c),f=this.offsetValueRatio,b=this.constrainValue(a/f);g.stopPropagation();this.setIndexValue(d,b);this.fireEvent("drag",this,c,this.getValue(),g);return false},setIndexValue:function(d,g,f){var c=this.getThumb(d),b=this.getValue(),e=this.offsetValueRatio,a=c.getDraggable();a.setOffset(g*e,null,f);b[d]=this.constrainValue(a.getOffset().x/e)},onThumbDragEnd:function(a,f){this.refreshThumbConstraints(a);var c=this.getThumbIndex(a),d=this.getValue()[c],b=this.dragStartValue;this.fireEvent("dragend",this,a,this.getValue(),f);if(b!==d){this.fireEvent("change",this,a,d,b)}},getThumbIndex:function(a){return this.getThumbs().indexOf(a)},refreshThumbConstraints:function(d){var b=this.getAllowThumbsOverlapping(),a=d.getDraggable().getOffset().x,c=this.getThumbs(),e=this.getThumbIndex(d),g=c[e-1],h=c[e+1],f=this.thumbWidth;if(g){g.getDraggable().addExtraConstraint({max:{x:a-((b)?0:f)}})}if(h){h.getDraggable().addExtraConstraint({min:{x:a+((b)?0:f)}})}},onTap:function(j){if(this.isDisabled()){return}var k=Ext.get(j.target);if(!k||k.hasCls("x-thumb")){return}var n=j.touch.point.x,h=this.element,c=h.getX(),d=n-c-(this.thumbWidth/2),o=this.constrainValue(d/this.offsetValueRatio),r=this.getValue(),q=Infinity,m=r.length,g,f,l,p,b,a;if(m===1){p=0}else{for(g=0;g=(a/2)){e+=(c>0)?a:-a}e=Math.max(d,e);e=Math.min(f,e);return e},setThumbsCount:function(e){var a=this.getThumbs(),f=a.length,c,d,b;if(f>e){for(c=0,d=f-e;c0,b=d.getMaxValueCls(),e=d.getMinValueCls();this.element.addCls(g?b:e);this.element.removeCls(g?e:b)}});Ext.define("Ext.field.Toggle",{extend:"Ext.field.Slider",xtype:"togglefield",alternateClassName:"Ext.form.Toggle",requires:["Ext.slider.Toggle"],config:{cls:"x-toggle-field"},proxyConfig:{minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},applyComponent:function(a){return Ext.factory(a,Ext.slider.Toggle)},setValue:function(a){if(a===true){a=1}this.getComponent().setValue(a);return this},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this}});Ext.define("Ext.tab.Tab",{extend:"Ext.Button",xtype:"tab",alternateClassName:"Ext.Tab",isTab:true,config:{baseCls:Ext.baseCSSPrefix+"tab",pressedCls:Ext.baseCSSPrefix+"tab-pressed",activeCls:Ext.baseCSSPrefix+"tab-active",active:false,title:" "},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement",style:"visibility: hidden !important"},{tag:"span",reference:"textElement",hidden:true}],updateTitle:function(a){this.setText(a)},hideIconElement:function(){this.iconElement.dom.style.setProperty("visibility","hidden","!important")},showIconElement:function(){this.iconElement.dom.style.setProperty("visibility","visible","!important")},updateActive:function(c,b){var a=this.getActiveCls();if(c&&!b){this.element.addCls(a);this.fireEvent("activate",this)}else{if(b){this.element.removeCls(a);this.fireEvent("deactivate",this)}}}},function(){this.override({activate:function(){this.setActive(true)},deactivate:function(){this.setActive(false)}})});Ext.define("Ext.tab.Bar",{extend:"Ext.Toolbar",alternateClassName:"Ext.TabBar",xtype:"tabbar",requires:["Ext.tab.Tab"],config:{baseCls:Ext.baseCSSPrefix+"tabbar",defaultType:"tab",layout:{type:"hbox",align:"middle"}},eventedConfig:{activeTab:null},initialize:function(){var a=this;a.callParent();a.on({tap:"onTabTap",delegate:"> tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(a,c){if(!a&&a!==0){return}var b=this.parseActiveTab(a);if(!b){return}return b},doSetDocked:function(a){var c=this.getLayout(),b=a=="bottom"?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getInnerItems()[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:"Ext.Container",xtype:"tabpanel",alternateClassName:"Ext.TabPanel",requires:["Ext.tab.Bar"],config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange",disabledchange:"onItemDisabledChange"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this})},applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.getTabBar().setActiveTab(i);if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,b){this.setActiveItem(a.indexOf(b))},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=o.title,i=o.iconCls,j=o.hidden,n=o.disabled,p=o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=k.getInnerItems(),m=(l.length>=a.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments)},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.table.Cell",{extend:"Ext.Container",xtype:"tablecell",config:{baseCls:"x-table-cell"},getElementConfig:function(){var a=this.callParent();a.children.length=0;return a}});Ext.define("Ext.table.Row",{extend:"Ext.table.Cell",xtype:"tablerow",config:{baseCls:"x-table-row",defaultType:"tablecell"}});Ext.define("Ext.table.Table",{extend:"Ext.Container",requires:["Ext.table.Row"],xtype:"table",config:{baseCls:"x-table",defaultType:"tablerow"},cachedConfig:{fixedLayout:false},fixedLayoutCls:"x-table-fixed",updateFixedLayout:function(a){this.innerElement[a?"addCls":"removeCls"](this.fixedLayoutCls)}});Ext.define("Ext.viewport.Default",{extend:"Ext.Container",xtype:"viewport",PORTRAIT:"portrait",LANDSCAPE:"landscape",requires:["Ext.LoadMask"],config:{autoMaximize:false,autoBlurInput:true,preventPanning:true,preventZooming:true,autoRender:true,layout:"card",width:"100%",height:"100%"},isReady:false,isViewport:true,isMaximizing:false,id:"ext-viewport",isInputRegex:/^(input|textarea|select|a)$/i,focusedElement:null,fullscreenItemCls:Ext.baseCSSPrefix+"fullscreen",constructor:function(a){var b=Ext.Function.bind;this.doPreventPanning=b(this.doPreventPanning,this);this.doPreventZooming=b(this.doPreventZooming,this);this.doBlurInput=b(this.doBlurInput,this);this.maximizeOnEvents=["ready","orientationchange"];this.orientation=this.determineOrientation();this.windowWidth=this.getWindowWidth();this.windowHeight=this.getWindowHeight();this.windowOuterHeight=this.getWindowOuterHeight();if(!this.stretchHeights){this.stretchHeights={}}this.callParent([a]);if(this.supportsOrientation()){this.addWindowListener("orientationchange",b(this.onOrientationChange,this))}else{this.addWindowListener("resize",b(this.onResize,this))}document.addEventListener("focus",b(this.onElementFocus,this),true);document.addEventListener("blur",b(this.onElementBlur,this),true);Ext.onDocumentReady(this.onDomReady,this);this.on("ready",this.onReady,this,{single:true});this.getEventDispatcher().addListener("component","*","fullscreen","onItemFullscreenChange",this);return this},onDomReady:function(){this.isReady=true;this.updateSize();this.fireEvent("ready",this)},onReady:function(){if(this.getAutoRender()){this.render()}},onElementFocus:function(a){this.focusedElement=a.target},onElementBlur:function(){this.focusedElement=null},render:function(){if(!this.rendered){var a=Ext.getBody(),b=Ext.baseCSSPrefix,h=[],d=Ext.os,g=d.name.toLowerCase(),f=Ext.browser.name.toLowerCase(),e=d.version.getMajor(),c=this.getOrientation();this.renderTo(a);h.push(b+d.deviceType.toLowerCase());if(d.is.iPad){h.push(b+"ipad")}h.push(b+g);h.push(b+f);if(e){h.push(b+g+"-"+e)}if(d.is.BlackBerry){h.push(b+"bb")}if(Ext.browser.is.Standalone){h.push(b+"standalone")}h.push(b+c);a.addCls(h)}},applyAutoBlurInput:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doBlurInput,false)}else{this.removeWindowListener(b,this.doBlurInput,false)}return a},applyAutoMaximize:function(a){if(a){this.on("ready","doAutoMaximizeOnReady",this,{single:true});this.on("orientationchange","doAutoMaximizeOnOrientationChange",this)}else{this.un("ready","doAutoMaximizeOnReady",this);this.un("orientationchange","doAutoMaximizeOnOrientationChange",this)}return a},applyPreventPanning:function(a){if(a){this.addWindowListener("touchmove",this.doPreventPanning,false)}else{this.removeWindowListener("touchmove",this.doPreventPanning,false)}return a},applyPreventZooming:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doPreventZooming,false)}else{this.removeWindowListener(b,this.doPreventZooming,false)}return a},doAutoMaximizeOnReady:function(){var a=arguments[arguments.length-1];a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();a.resume();this.fireEvent("ready",this)},this,{single:true});this.maximize()},doAutoMaximizeOnOrientationChange:function(){var a=arguments[arguments.length-1],b=a.firingArguments;a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();b[1]=this.windowWidth;b[2]=this.windowHeight;a.resume()},this,{single:true});this.maximize()},doBlurInput:function(b){var a=b.target,c=this.focusedElement;if(c&&!this.isInputRegex.test(a.tagName)){delete this.focusedElement;c.blur()}},doPreventPanning:function(a){a.preventDefault()},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}this.mixins.observable.doAddListener.apply(this,arguments)},supportsOrientation:function(){return Ext.feature.has.Orientation},onResize:function(){var c=this.windowWidth,f=this.windowHeight,e=this.getWindowWidth(),a=this.getWindowHeight(),d=this.getOrientation(),b=this.determineOrientation();if((c!==e||f!==a)&&d!==b){this.fireOrientationChangeEvent(b,d)}},onOrientationChange:function(){var b=this.getOrientation(),a=this.determineOrientation();if(a!==b){this.fireOrientationChangeEvent(a,b)}},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.orientation=b;this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getOrientation:function(){return this.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},determineOrientation:function(){var b=this.PORTRAIT,a=this.LANDSCAPE;if(this.supportsOrientation()){if(this.getWindowOrientation()%180===0){return b}return a}else{if(this.getWindowHeight()>=this.getWindowWidth()){return b}return a}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)}});Ext.define("Ext.viewport.Android",{extend:"Ext.viewport.Default",constructor:function(){this.on("orientationchange","doFireOrientationChangeEvent",this,{prepend:true});this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});return this.callParent(arguments)},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},doFireOrientationChangeEvent:function(){var a=arguments[arguments.length-1];this.orientationChanging=true;a.pause();this.waitUntil(function(){return this.getWindowOuterHeight()!==this.windowOuterHeight},function(){this.windowOuterHeight=this.getWindowOuterHeight();this.updateSize();a.firingArguments[1]=this.windowWidth;a.firingArguments[2]=this.windowHeight;a.resume();this.orientationChanging=false},function(){});return this},applyAutoMaximize:function(a){this.callParent(arguments);this.on("add","fixSize",this,{single:true});if(!a){this.on("ready","fixSize",this,{single:true});this.onAfter("orientationchange","doFixSize",this)}else{this.un("ready","fixSize",this);this.unAfter("orientationchange","doFixSize",this)}},fixSize:function(){this.doFixSize()},doFixSize:function(){this.setHeight(this.getWindowHeight())},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.orientation,a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}},fixSize:function(){var d=this.getOrientation(),f=window.outerHeight,g=window.outerWidth,e;if(d==="landscape"&&(f=g)){e=this.getActualWindowOuterHeight()}else{e=this.getWindowHeight()}this.waitUntil(function(){return e>this.getWindowHeight()},this.doFixSize,this.doFixSize,50,1000)}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn})}});Ext.define("Ext.viewport.Ios",{extend:"Ext.viewport.Default",isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.orientation,d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){return window.screen[this.orientation===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}});Ext.define("Ext.viewport.Viewport",{requires:["Ext.viewport.Ios","Ext.viewport.Android"],constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d="Android";break;case"iOS":d="Ios";break;default:d="Default"}a=Ext.create("Ext.viewport."+d,b);return a}});Ext.define("Ext.event.recognizer.Swipe",{extend:"Ext.event.recognizer.SingleTouch",handledEvents:["swipe"],inheritableStatics:{MAX_OFFSET_EXCEEDED:16,MAX_DURATION_EXCEEDED:17,DISTANCE_NOT_ENOUGH:18},config:{minDistance:80,maxOffset:35,maxDuration:1000},onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.isHorizontal=true;this.isVertical=true;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(f){var h=f.changedTouches[0],b=h.pageX,g=h.pageY,c=Math.abs(b-this.startX),a=Math.abs(g-this.startY),d=f.time;if(d-this.startTime>this.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isVertical&&c>this.getMaxOffset()){this.isVertical=false}if(this.isHorizontal&&a>this.getMaxOffset()){this.isHorizontal=false}if(!this.isHorizontal&&!this.isVertical){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(i){if(this.onTouchMove(i)===false){return false}var h=i.changedTouches[0],l=h.pageX,j=h.pageY,g=l-this.startX,f=j-this.startY,c=Math.abs(g),b=Math.abs(f),m=this.getMinDistance(),d=i.time-this.startTime,k,a;if(this.isVertical&&bc){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),c;if(h= 0 - Code = Code + CodeIncrement - if BitLength(i) <> LastBitLength then - LastBitLength=BitLength(i) - CodeIncrement = 1 shifted left (16 - LastBitLength) - ShannonCode(i) = Code - i <- i - 1 - end loop - -3) Reverse the order of all the bits in the above ShannonCode() - vector, so that the most significant bit becomes the least - significant bit. For example, the value 0x1234 (hex) would - become 0x2C48 (hex). - -4) Restore the order of Shannon-Fano codes as originally stored - within the file. - -Example: - - This example will show the encoding of a Shannon-Fano tree - of size 8. Notice that the actual Shannon-Fano trees used - for Imploding are either 64 or 256 entries in size. - -Example: 0x02, 0x42, 0x01, 0x13 - - The first byte indicates 3 values in this table. Decoding the - bytes: - 0x42 = 5 codes of 3 bits long - 0x01 = 1 code of 2 bits long - 0x13 = 2 codes of 4 bits long - - This would generate the original bit length array of: - (3, 3, 3, 3, 3, 2, 4, 4) - - There are 8 codes in this table for the values 0 thru 7. Using - the algorithm to obtain the Shannon-Fano codes produces: - - Reversed Order Original -Val Sorted Constructed Code Value Restored Length ---- ------ ----------------- -------- -------- ------ -0: 2 1100000000000000 11 101 3 -1: 3 1010000000000000 101 001 3 -2: 3 1000000000000000 001 110 3 -3: 3 0110000000000000 110 010 3 -4: 3 0100000000000000 010 100 3 -5: 3 0010000000000000 100 11 2 -6: 4 0001000000000000 1000 1000 4 -7: 4 0000000000000000 0000 0000 4 - -The values in the Val, Order Restored and Original Length columns -now represent the Shannon-Fano encoding tree that can be used for -decoding the Shannon-Fano encoded data. How to parse the -variable length Shannon-Fano values from the data stream is beyond -the scope of this document. (See the references listed at the end of -this document for more information.) However, traditional decoding -schemes used for Huffman variable length decoding, such as the -Greenlaw algorithm, can be successfully applied. - -The compressed data stream begins immediately after the -compressed Shannon-Fano data. The compressed data stream can be -interpreted as follows: - -loop until done - read 1 bit from input stream. - - if this bit is non-zero then (encoded data is literal data) - if Literal Shannon-Fano tree is present - read and decode character using Literal Shannon-Fano tree. - otherwise - read 8 bits from input stream. - copy character to the output stream. - otherwise (encoded data is sliding dictionary match) - if 8K dictionary size - read 7 bits for offset Distance (lower 7 bits of offset). - otherwise - read 6 bits for offset Distance (lower 6 bits of offset). - - using the Distance Shannon-Fano tree, read and decode the - upper 6 bits of the Distance value. - - using the Length Shannon-Fano tree, read and decode - the Length value. - - Length <- Length + Minimum Match Length - - if Length = 63 + Minimum Match Length - read 8 bits from the input stream, - add this value to Length. - - move backwards Distance+1 bytes in the output stream, and - copy Length characters from this position to the output - stream. (if this position is before the start of the output - stream, then assume that all the data before the start of - the output stream is filled with zeros). -end loop - -Tokenizing - Method 7 ---------------------- - -This method is not used by PKZIP. - -Deflating - Method 8 --------------------- - -The Deflate algorithm is similar to the Implode algorithm using -a sliding dictionary of up to 32K with secondary compression -from Huffman/Shannon-Fano codes. - -The compressed data is stored in blocks with a header describing -the block and the Huffman codes used in the data block. The header -format is as follows: - - Bit 0: Last Block bit This bit is set to 1 if this is the last - compressed block in the data. - Bits 1-2: Block type - 00 (0) - Block is stored - All stored data is byte aligned. - Skip bits until next byte, then next word = block - length, followed by the ones compliment of the block - length word. Remaining data in block is the stored - data. - - 01 (1) - Use fixed Huffman codes for literal and distance codes. - Lit Code Bits Dist Code Bits - --------- ---- --------- ---- - 0 - 143 8 0 - 31 5 - 144 - 255 9 - 256 - 279 7 - 280 - 287 8 - - Literal codes 286-287 and distance codes 30-31 are - never used but participate in the huffman construction. - - 10 (2) - Dynamic Huffman codes. (See expanding Huffman codes) - - 11 (3) - Reserved - Flag a "Error in compressed data" if seen. - -Expanding Huffman Codes ------------------------ -If the data block is stored with dynamic Huffman codes, the Huffman -codes are sent in the following compressed format: - - 5 Bits: # of Literal codes sent - 256 (256 - 286) - All other codes are never sent. - 5 Bits: # of Dist codes - 1 (1 - 32) - 4 Bits: # of Bit Length codes - 3 (3 - 19) - -The Huffman codes are sent as bit lengths and the codes are built as -described in the implode algorithm. The bit lengths themselves are -compressed with Huffman codes. There are 19 bit length codes: - - 0 - 15: Represent bit lengths of 0 - 15 - 16: Copy the previous bit length 3 - 6 times. - The next 2 bits indicate repeat length (0 = 3, ... ,3 = 6) - Example: Codes 8, 16 (+2 bits 11), 16 (+2 bits 10) will - expand to 12 bit lengths of 8 (1 + 6 + 5) - 17: Repeat a bit length of 0 for 3 - 10 times. (3 bits of length) - 18: Repeat a bit length of 0 for 11 - 138 times (7 bits of length) - -The lengths of the bit length codes are sent packed 3 bits per value -(0 - 7) in the following order: - - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - -The Huffman codes should be built as described in the Implode algorithm -except codes are assigned starting at the shortest bit length, i.e. the -shortest code should be all 0's rather than all 1's. Also, codes with -a bit length of zero do not participate in the tree construction. The -codes are then used to decode the bit lengths for the literal and -distance tables. - -The bit lengths for the literal tables are sent first with the number -of entries sent described by the 5 bits sent earlier. There are up -to 286 literal characters; the first 256 represent the respective 8 -bit character, code 256 represents the End-Of-Block code, the remaining -29 codes represent copy lengths of 3 thru 258. There are up to 30 -distance codes representing distances from 1 thru 32k as described -below. - - Length Codes - ------------ - Extra Extra Extra Extra - Code Bits Length Code Bits Lengths Code Bits Lengths Code Bits Length(s) - ---- ---- ------ ---- ---- ------- ---- ---- ------- ---- ---- --------- - 257 0 3 265 1 11,12 273 3 35-42 281 5 131-162 - 258 0 4 266 1 13,14 274 3 43-50 282 5 163-194 - 259 0 5 267 1 15,16 275 3 51-58 283 5 195-226 - 260 0 6 268 1 17,18 276 3 59-66 284 5 227-257 - 261 0 7 269 2 19-22 277 4 67-82 285 0 258 - 262 0 8 270 2 23-26 278 4 83-98 - 263 0 9 271 2 27-30 279 4 99-114 - 264 0 10 272 2 31-34 280 4 115-130 - - Distance Codes - -------------- - Extra Extra Extra Extra - Code Bits Dist Code Bits Dist Code Bits Distance Code Bits Distance - ---- ---- ---- ---- ---- ------ ---- ---- -------- ---- ---- -------- - 0 0 1 8 3 17-24 16 7 257-384 24 11 4097-6144 - 1 0 2 9 3 25-32 17 7 385-512 25 11 6145-8192 - 2 0 3 10 4 33-48 18 8 513-768 26 12 8193-12288 - 3 0 4 11 4 49-64 19 8 769-1024 27 12 12289-16384 - 4 1 5,6 12 5 65-96 20 9 1025-1536 28 13 16385-24576 - 5 1 7,8 13 5 97-128 21 9 1537-2048 29 13 24577-32768 - 6 2 9-12 14 6 129-192 22 10 2049-3072 - 7 2 13-16 15 6 193-256 23 10 3073-4096 - -The compressed data stream begins immediately after the -compressed header data. The compressed data stream can be -interpreted as follows: - -do - read header from input stream. - - if stored block - skip bits until byte aligned - read count and 1's compliment of count - copy count bytes data block - otherwise - loop until end of block code sent - decode literal character from input stream - if literal < 256 - copy character to the output stream - otherwise - if literal = end of block - break from loop - otherwise - decode distance from input stream - - move backwards distance bytes in the output stream, and - copy length characters from this position to the output - stream. - end loop -while not last block - -if data descriptor exists - skip bits until byte aligned - read crc and sizes -endif - -Enhanced Deflating - Method 9 ------------------------------ - -The Enhanced Deflating algorithm is similar to Deflate but -uses a sliding dictionary of up to 64K. Deflate64(tm) is supported -by the Deflate extractor. - -BZIP2 - Method 12 ------------------ - -BZIP2 is an open-source data compression algorithm developed by -Julian Seward. Information and source code for this algorithm -can be found on the internet. - -LZMA - Method 14 (EFS) ----------------------- - -LZMA is a block-oriented, general purpose data compression algorithm -developed and maintained by Igor Pavlov. It is a derivative of LZ77 -that utilizes Markov chains and a range coder. Information and -source code for this algorithm can be found on the internet. Consult -with the author of this algorithm for information on terms or -restrictions on use. - -Support for LZMA within the ZIP format is defined as follows: - -The Compression method field within the ZIP Local and Central -Header records will be set to the value 14 to indicate data was -compressed using LZMA. - -The Version needed to extract field within the ZIP Local and -Central Header records will be set to 6.3 to indicate the -minimum ZIP format version supporting this feature. - -File data compressed using the LZMA algorithm must be placed -immediately following the Local Header for the file. If a -standard ZIP encryption header is required, it will follow -the Local Header and will precede the LZMA compressed file -data segment. The location of LZMA compressed data segment -within the ZIP format will be as shown: - - [local header file 1] - [encryption header file 1] - [LZMA compressed data segment for file 1] - [data descriptor 1] - [local header file 2] - -The encryption header and data descriptor records may -be conditionally present. The LZMA Compressed Data Segment -will consist of an LZMA Properties Header followed by the -LZMA Compressed Data as shown: - - [LZMA properties header for file 1] - [LZMA compressed data for file 1] - -The LZMA Compressed Data will be stored as provided by the -LZMA compression library. Compressed size, uncompressed -size and other file characteristics about the file being -compressed must be stored in standard ZIP storage format. - -The LZMA Properties Header will store specific data required to -decompress the LZMA compressed Data. This data is set by the -LZMA compression engine using the function WriteCoderProperties() -as documented within the LZMA SDK. - -Storage fields for the property information within the LZMA -Properties Header are as follows: - - LZMA Version Information 2 bytes - LZMA Properties Size 2 bytes - LZMA Properties Data variable, defined by "LZMA Properties Size" - -LZMA Version Information - this field identifies which version of - the LZMA SDK was used to compress a file. The first byte will - store the major version number of the LZMA SDK and the second - byte will store the minor number. - -LZMA Properties Size - this field defines the size of the remaining - property data. Typically this size should be determined by the - version of the SDK. This size field is included as a convenience - and to help avoid any ambiguity should it arise in the future due - to changes in this compression algorithm. - -LZMA Property Data - this variable sized field records the required - values for the decompressor as defined by the LZMA SDK. The - data stored in this field should be obtained using the - WriteCoderProperties() in the version of the SDK defined by - the "LZMA Version Information" field. - -The layout of the "LZMA Properties Data" field is a function of the -LZMA compression algorithm. It is possible that this layout may be -changed by the author over time. The data layout in version 4.32 -of the LZMA SDK defines a 5 byte array that uses 4 bytes to store -the dictionary size in little-endian order. This is preceded by a -single packed byte as the first element of the array that contains -the following fields: - - PosStateBits - LiteralPosStateBits - LiteralContextBits - -Refer to the LZMA documentation for a more detailed explanation of -these fields. - -Data compressed with method 14, LZMA, may include an end-of-stream -(EOS) marker ending the compressed data stream. This marker is not -required, but its use is highly recommended to facilitate processing -and implementers should include the EOS marker whenever possible. -When the EOS marker is used, general purpose bit 1 must be set. If -general purpose bit 1 is not set, the EOS marker is not present. - -WavPack - Method 97 -------------------- - -Information describing the use of compression method 97 is -provided by WinZIP International, LLC. This method relies on the -open source WavPack audio compression utility developed by David Bryant. -Information on WavPack is available at www.wavpack.com. Please consult -with the author of this algorithm for information on terms and -restrictions on use. - -WavPack data for a file begins immediately after the end of the -local header data. This data is the output from WavPack compression -routines. Within the ZIP file, the use of WavPack compression is -indicated by setting the compression method field to a value of 97 -in both the local header and the central directory header. The Version -needed to extract and version made by fields use the same values as are -used for data compressed using the Deflate algorithm. - -An implementation note for storing digital sample data when using -WavPack compression within ZIP files is that all of the bytes of -the sample data should be compressed. This includes any unused -bits up to the byte boundary. An example is a 2 byte sample that -uses only 12 bits for the sample data with 4 unused bits. If only -12 bits are passed as the sample size to the WavPack routines, the 4 -unused bits will be set to 0 on extraction regardless of their original -state. To avoid this, the full 16 bits of the sample data size -should be provided. - -PPMd - Method 98 ----------------- - -PPMd is a data compression algorithm developed by Dmitry Shkarin -which includes a carryless rangecoder developed by Dmitry Subbotin. -This algorithm is based on predictive phrase matching on multiple -order contexts. Information and source code for this algorithm -can be found on the internet. Consult with the author of this -algorithm for information on terms or restrictions on use. - -Support for PPMd within the ZIP format currently is provided only -for version I, revision 1 of the algorithm. Storage requirements -for using this algorithm are as follows: - -Parameters needed to control the algorithm are stored in the two -bytes immediately preceding the compressed data. These bytes are -used to store the following fields: - -Model order - sets the maximum model order, default is 8, possible - values are from 2 to 16 inclusive - -Sub-allocator size - sets the size of sub-allocator in MB, default is 50, - possible values are from 1MB to 256MB inclusive - -Model restoration method - sets the method used to restart context - model at memory insufficiency, values are: - - 0 - restarts model from scratch - default - 1 - cut off model - decreases performance by as much as 2x - 2 - freeze context tree - not recommended - -An example for packing these fields into the 2 byte storage field is -illustrated below. These values are stored in Intel low-byte/high-byte -order. - -wPPMd = (Model order - 1) + - ((Sub-allocator size - 1) << 4) + - (Model restoration method << 12) - - -VII. Traditional PKWARE Encryption ----------------------------------- - -The following information discusses the decryption steps -required to support traditional PKWARE encryption. This -form of encryption is considered weak by today's standards -and its use is recommended only for situations with -low security needs or for compatibility with older .ZIP -applications. - -Decryption ----------- - -PKWARE is grateful to Mr. Roger Schlafly for his expert contribution -towards the development of PKWARE's traditional encryption. - -PKZIP encrypts the compressed data stream. Encrypted files must -be decrypted before they can be extracted. - -Each encrypted file has an extra 12 bytes stored at the start of -the data area defining the encryption header for that file. The -encryption header is originally set to random values, and then -itself encrypted, using three, 32-bit keys. The key values are -initialized using the supplied encryption password. After each byte -is encrypted, the keys are then updated using pseudo-random number -generation techniques in combination with the same CRC-32 algorithm -used in PKZIP and described elsewhere in this document. - -The following is the basic steps required to decrypt a file: - -1) Initialize the three 32-bit keys with the password. -2) Read and decrypt the 12-byte encryption header, further - initializing the encryption keys. -3) Read and decrypt the compressed data stream using the - encryption keys. - -Step 1 - Initializing the encryption keys ------------------------------------------ - -Key(0) <- 305419896 -Key(1) <- 591751049 -Key(2) <- 878082192 - -loop for i <- 0 to length(password)-1 - update_keys(password(i)) -end loop - -Where update_keys() is defined as: - -update_keys(char): - Key(0) <- crc32(key(0),char) - Key(1) <- Key(1) + (Key(0) & 000000ffH) - Key(1) <- Key(1) * 134775813 + 1 - Key(2) <- crc32(key(2),key(1) >> 24) -end update_keys - -Where crc32(old_crc,char) is a routine that given a CRC value and a -character, returns an updated CRC value after applying the CRC-32 -algorithm described elsewhere in this document. - -Step 2 - Decrypting the encryption header ------------------------------------------ - -The purpose of this step is to further initialize the encryption -keys, based on random data, to render a plaintext attack on the -data ineffective. - -Read the 12-byte encryption header into Buffer, in locations -Buffer(0) thru Buffer(11). - -loop for i <- 0 to 11 - C <- buffer(i) ^ decrypt_byte() - update_keys(C) - buffer(i) <- C -end loop - -Where decrypt_byte() is defined as: - -unsigned char decrypt_byte() - local unsigned short temp - temp <- Key(2) | 2 - decrypt_byte <- (temp * (temp ^ 1)) >> 8 -end decrypt_byte - -After the header is decrypted, the last 1 or 2 bytes in Buffer -should be the high-order word/byte of the CRC for the file being -decrypted, stored in Intel low-byte/high-byte order. Versions of -PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is -used on versions after 2.0. This can be used to test if the password -supplied is correct or not. - -Step 3 - Decrypting the compressed data stream ----------------------------------------------- - -The compressed data stream can be decrypted as follows: - -loop until done - read a character into C - Temp <- C ^ decrypt_byte() - update_keys(temp) - output Temp -end loop - - -VIII. Strong Encryption Specification -------------------------------------- - -The Strong Encryption technology defined in this specification is -covered under a pending patent application. The use or implementation -in a product of certain technological aspects set forth in the current -APPNOTE, including those with regard to strong encryption, patching, -or extended tape operations requires a license from PKWARE. Portions -of this Strong Encryption technology are available for use at no charge. -Contact PKWARE for licensing terms and conditions. Refer to section II -of this APPNOTE (Contacting PKWARE) for information on how to -contact PKWARE. - -Version 5.x of this specification introduced support for strong -encryption algorithms. These algorithms can be used with either -a password or an X.509v3 digital certificate to encrypt each file. -This format specification supports either password or certificate -based encryption to meet the security needs of today, to enable -interoperability between users within both PKI and non-PKI -environments, and to ensure interoperability between different -computing platforms that are running a ZIP program. - -Password based encryption is the most common form of encryption -people are familiar with. However, inherent weaknesses with -passwords (e.g. susceptibility to dictionary/brute force attack) -as well as password management and support issues make certificate -based encryption a more secure and scalable option. Industry -efforts and support are defining and moving towards more advanced -security solutions built around X.509v3 digital certificates and -Public Key Infrastructures(PKI) because of the greater scalability, -administrative options, and more robust security over traditional -password based encryption. - -Most standard encryption algorithms are supported with this -specification. Reference implementations for many of these -algorithms are available from either commercial or open source -distributors. Readily available cryptographic toolkits make -implementation of the encryption features straight-forward. -This document is not intended to provide a treatise on data -encryption principles or theory. Its purpose is to document the -data structures required for implementing interoperable data -encryption within the .ZIP format. It is strongly recommended that -you have a good understanding of data encryption before reading -further. - -The algorithms introduced in Version 5.0 of this specification -include: - - RC2 40 bit, 64 bit, and 128 bit - RC4 40 bit, 64 bit, and 128 bit - DES - 3DES 112 bit and 168 bit - -Version 5.1 adds support for the following: - - AES 128 bit, 192 bit, and 256 bit - - -Version 6.1 introduces encryption data changes to support -interoperability with Smartcard and USB Token certificate storage -methods which do not support the OAEP strengthening standard. - -Version 6.2 introduces support for encrypting metadata by compressing -and encrypting the central directory data structure to reduce information -leakage. Information leakage can occur in legacy ZIP applications -through exposure of information about a file even though that file is -stored encrypted. The information exposed consists of file -characteristics stored within the records and fields defined by this -specification. This includes data such as a files name, its original -size, timestamp and CRC32 value. - -Version 6.3 introduces support for encrypting data using the Blowfish -and Twofish algorithms. These are symmetric block ciphers developed -by Bruce Schneier. Blowfish supports using a variable length key from -32 to 448 bits. Block size is 64 bits. Implementations should use 16 -rounds and the only mode supported within ZIP files is CBC. Twofish -supports key sizes 128, 192 and 256 bits. Block size is 128 bits. -Implementations should use 16 rounds and the only mode supported within -ZIP files is CBC. Information and source code for both Blowfish and -Twofish algorithms can be found on the internet. Consult with the author -of these algorithms for information on terms or restrictions on use. - -Central Directory Encryption provides greater protection against -information leakage by encrypting the Central Directory structure and -by masking key values that are replicated in the unencrypted Local -Header. ZIP compatible programs that cannot interpret an encrypted -Central Directory structure cannot rely on the data in the corresponding -Local Header for decompression information. - -Extra Field records that may contain information about a file that should -not be exposed should not be stored in the Local Header and should only -be written to the Central Directory where they can be encrypted. This -design currently does not support streaming. Information in the End of -Central Directory record, the Zip64 End of Central Directory Locator, -and the Zip64 End of Central Directory records are not encrypted. Access -to view data on files within a ZIP file with an encrypted Central Directory -requires the appropriate password or private key for decryption prior to -viewing any files, or any information about the files, in the archive. - -Older ZIP compatible programs not familiar with the Central Directory -Encryption feature will no longer be able to recognize the Central -Directory and may assume the ZIP file is corrupt. Programs that -attempt streaming access using Local Headers will see invalid -information for each file. Central Directory Encryption need not be -used for every ZIP file. Its use is recommended for greater security. -ZIP files not using Central Directory Encryption should operate as -in the past. - -This strong encryption feature specification is intended to provide for -scalable, cross-platform encryption needs ranging from simple password -encryption to authenticated public/private key encryption. - -Encryption provides data confidentiality and privacy. It is -recommended that you combine X.509 digital signing with encryption -to add authentication and non-repudiation. - - -Single Password Symmetric Encryption Method: -------------------------------------------- - -The Single Password Symmetric Encryption Method using strong -encryption algorithms operates similarly to the traditional -PKWARE encryption defined in this format. Additional data -structures are added to support the processing needs of the -strong algorithms. - -The Strong Encryption data structures are: - -1. General Purpose Bits - Bits 0 and 6 of the General Purpose bit -flag in both local and central header records. Both bits set -indicates strong encryption. Bit 13, when set indicates the Central -Directory is encrypted and that selected fields in the Local Header -are masked to hide their actual value. - - -2. Extra Field 0x0017 in central header only. - - Fields to consider in this record are: - - Format - the data format identifier for this record. The only - value allowed at this time is the integer value 2. - - AlgId - integer identifier of the encryption algorithm from the - following range - - 0x6601 - DES - 0x6602 - RC2 (version needed to extract < 5.2) - 0x6603 - 3DES 168 - 0x6609 - 3DES 112 - 0x660E - AES 128 - 0x660F - AES 192 - 0x6610 - AES 256 - 0x6702 - RC2 (version needed to extract >= 5.2) - 0x6720 - Blowfish - 0x6721 - Twofish - 0x6801 - RC4 - 0xFFFF - Unknown algorithm - - Bitlen - Explicit bit length of key - - 32 - 448 bits - - Flags - Processing flags needed for decryption - - 0x0001 - Password is required to decrypt - 0x0002 - Certificates only - 0x0003 - Password or certificate required to decrypt - - Values > 0x0003 reserved for certificate processing - - -3. Decryption header record preceding compressed file data. - - -Decryption Header: - - Value Size Description - ----- ---- ----------- - IVSize 2 bytes Size of initialization vector (IV) - IVData IVSize Initialization vector for this file - Size 4 bytes Size of remaining decryption header data - Format 2 bytes Format definition for this record - AlgID 2 bytes Encryption algorithm identifier - Bitlen 2 bytes Bit length of encryption key - Flags 2 bytes Processing flags - ErdSize 2 bytes Size of Encrypted Random Data - ErdData ErdSize Encrypted Random Data - Reserved1 4 bytes Reserved certificate processing data - Reserved2 (var) Reserved for certificate processing data - VSize 2 bytes Size of password validation data - VData VSize-4 Password validation data - VCRC32 4 bytes Standard ZIP CRC32 of password validation data - - IVData - The size of the IV should match the algorithm block size. - The IVData can be completely random data. If the size of - the randomly generated data does not match the block size - it should be complemented with zero's or truncated as - necessary. If IVSize is 0,then IV = CRC32 + Uncompressed - File Size (as a 64 bit little-endian, unsigned integer value). - - Format - the data format identifier for this record. The only - value allowed at this time is the integer value 3. - - AlgId - integer identifier of the encryption algorithm from the - following range - - 0x6601 - DES - 0x6602 - RC2 (version needed to extract < 5.2) - 0x6603 - 3DES 168 - 0x6609 - 3DES 112 - 0x660E - AES 128 - 0x660F - AES 192 - 0x6610 - AES 256 - 0x6702 - RC2 (version needed to extract >= 5.2) - 0x6720 - Blowfish - 0x6721 - Twofish - 0x6801 - RC4 - 0xFFFF - Unknown algorithm - - Bitlen - Explicit bit length of key - - 32 - 448 bits - - Flags - Processing flags needed for decryption - - 0x0001 - Password is required to decrypt - 0x0002 - Certificates only - 0x0003 - Password or certificate required to decrypt - - Values > 0x0003 reserved for certificate processing - - ErdData - Encrypted random data is used to store random data that - is used to generate a file session key for encrypting - each file. SHA1 is used to calculate hash data used to - derive keys. File session keys are derived from a master - session key generated from the user-supplied password. - If the Flags field in the decryption header contains - the value 0x4000, then the ErdData field must be - decrypted using 3DES. If the value 0x4000 is not set, - then the ErdData field must be decrypted using AlgId. - - - Reserved1 - Reserved for certificate processing, if value is - zero, then Reserved2 data is absent. See the explanation - under the Certificate Processing Method for details on - this data structure. - - Reserved2 - If present, the size of the Reserved2 data structure - is located by skipping the first 4 bytes of this field - and using the next 2 bytes as the remaining size. See - the explanation under the Certificate Processing Method - for details on this data structure. - - VSize - This size value will always include the 4 bytes of the - VCRC32 data and will be greater than 4 bytes. - - VData - Random data for password validation. This data is VSize - in length and VSize must be a multiple of the encryption - block size. VCRC32 is a checksum value of VData. - VData and VCRC32 are stored encrypted and start the - stream of encrypted data for a file. - - -4. Useful Tips - -Strong Encryption is always applied to a file after compression. The -block oriented algorithms all operate in Cypher Block Chaining (CBC) -mode. The block size used for AES encryption is 16. All other block -algorithms use a block size of 8. Two ID's are defined for RC2 to -account for a discrepancy found in the implementation of the RC2 -algorithm in the cryptographic library on Windows XP SP1 and all -earlier versions of Windows. It is recommended that zero length files -not be encrypted, however programs should be prepared to extract them -if they are found within a ZIP file. - -A pseudo-code representation of the encryption process is as follows: - -Password = GetUserPassword() -MasterSessionKey = DeriveKey(SHA1(Password)) -RD = CryptographicStrengthRandomData() -For Each File - IV = CryptographicStrengthRandomData() - VData = CryptographicStrengthRandomData() - VCRC32 = CRC32(VData) - FileSessionKey = DeriveKey(SHA1(IV + RD) - ErdData = Encrypt(RD,MasterSessionKey,IV) - Encrypt(VData + VCRC32 + FileData, FileSessionKey,IV) -Done - -The function names and parameter requirements will depend on -the choice of the cryptographic toolkit selected. Almost any -toolkit supporting the reference implementations for each -algorithm can be used. The RSA BSAFE(r), OpenSSL, and Microsoft -CryptoAPI libraries are all known to work well. - - -Single Password - Central Directory Encryption: ------------------------------------------------ - -Central Directory Encryption is achieved within the .ZIP format by -encrypting the Central Directory structure. This encapsulates the metadata -most often used for processing .ZIP files. Additional metadata is stored for -redundancy in the Local Header for each file. The process of concealing -metadata by encrypting the Central Directory does not protect the data within -the Local Header. To avoid information leakage from the exposed metadata -in the Local Header, the fields containing information about a file are masked. - -Local Header: - -Masking replaces the true content of the fields for a file in the Local -Header with false information. When masked, the Local Header is not -suitable for streaming access and the options for data recovery of damaged -archives is reduced. Extra Data fields that may contain confidential -data should not be stored within the Local Header. The value set into -the Version needed to extract field should be the correct value needed to -extract the file without regard to Central Directory Encryption. The fields -within the Local Header targeted for masking when the Central Directory is -encrypted are: - - Field Name Mask Value - ------------------ --------------------------- - compression method 0 - last mod file time 0 - last mod file date 0 - crc-32 0 - compressed size 0 - uncompressed size 0 - file name (variable size) Base 16 value from the - range 1 - 0xFFFFFFFFFFFFFFFF - represented as a string whose - size will be set into the - file name length field - -The Base 16 value assigned as a masked file name is simply a sequentially -incremented value for each file starting with 1 for the first file. -Modifications to a ZIP file may cause different values to be stored for -each file. For compatibility, the file name field in the Local Header -should never be left blank. As of Version 6.2 of this specification, -the Compression Method and Compressed Size fields are not yet masked. -Fields having a value of 0xFFFF or 0xFFFFFFFF for the ZIP64 format -should not be masked. - -Encrypting the Central Directory: - -Encryption of the Central Directory does not include encryption of the -Central Directory Signature data, the Zip64 End of Central Directory -record, the Zip64 End of Central Directory Locator, or the End -of Central Directory record. The ZIP file comment data is never -encrypted. - -Before encrypting the Central Directory, it may optionally be compressed. -Compression is not required, but for storage efficiency it is assumed -this structure will be compressed before encrypting. Similarly, this -specification supports compressing the Central Directory without -requiring that it also be encrypted. Early implementations of this -feature will assume the encryption method applied to files matches the -encryption applied to the Central Directory. - -Encryption of the Central Directory is done in a manner similar to -that of file encryption. The encrypted data is preceded by a -decryption header. The decryption header is known as the Archive -Decryption Header. The fields of this record are identical to -the decryption header preceding each encrypted file. The location -of the Archive Decryption Header is determined by the value in the -Start of the Central Directory field in the Zip64 End of Central -Directory record. When the Central Directory is encrypted, the -Zip64 End of Central Directory record will always be present. - -The layout of the Zip64 End of Central Directory record for all -versions starting with 6.2 of this specification will follow the -Version 2 format. The Version 2 format is as follows: - -The leading fixed size fields within the Version 1 format for this -record remain unchanged. The record signature for both Version 1 -and Version 2 will be 0x06064b50. Immediately following the last -byte of the field known as the Offset of Start of Central -Directory With Respect to the Starting Disk Number will begin the -new fields defining Version 2 of this record. - -New fields for Version 2: - -Note: all fields stored in Intel low-byte/high-byte order. - - Value Size Description - ----- ---- ----------- - Compression Method 2 bytes Method used to compress the - Central Directory - Compressed Size 8 bytes Size of the compressed data - Original Size 8 bytes Original uncompressed size - AlgId 2 bytes Encryption algorithm ID - BitLen 2 bytes Encryption key length - Flags 2 bytes Encryption flags - HashID 2 bytes Hash algorithm identifier - Hash Length 2 bytes Length of hash data - Hash Data (variable) Hash data - -The Compression Method accepts the same range of values as the -corresponding field in the Central Header. - -The Compressed Size and Original Size values will not include the -data of the Central Directory Signature which is compressed or -encrypted. - -The AlgId, BitLen, and Flags fields accept the same range of values -the corresponding fields within the 0x0017 record. - -Hash ID identifies the algorithm used to hash the Central Directory -data. This data does not have to be hashed, in which case the -values for both the HashID and Hash Length will be 0. Possible -values for HashID are: - - Value Algorithm - ------ --------- - 0x0000 none - 0x0001 CRC32 - 0x8003 MD5 - 0x8004 SHA1 - 0x8007 RIPEMD160 - 0x800C SHA256 - 0x800D SHA384 - 0x800E SHA512 - -When the Central Directory data is signed, the same hash algorithm -used to hash the Central Directory for signing should be used. -This is recommended for processing efficiency, however, it is -permissible for any of the above algorithms to be used independent -of the signing process. - -The Hash Data will contain the hash data for the Central Directory. -The length of this data will vary depending on the algorithm used. - -The Version Needed to Extract should be set to 62. - -The value for the Total Number of Entries on the Current Disk will -be 0. These records will no longer support random access when -encrypting the Central Directory. - -When the Central Directory is compressed and/or encrypted, the -End of Central Directory record will store the value 0xFFFFFFFF -as the value for the Total Number of Entries in the Central -Directory. The value stored in the Total Number of Entries in -the Central Directory on this Disk field will be 0. The actual -values will be stored in the equivalent fields of the Zip64 -End of Central Directory record. - -Decrypting and decompressing the Central Directory is accomplished -in the same manner as decrypting and decompressing a file. - -Certificate Processing Method: ------------------------------ - -The Certificate Processing Method of for ZIP file encryption -defines the following additional data fields: - -1. Certificate Flag Values - -Additional processing flags that can be present in the Flags field of both -the 0x0017 field of the central directory Extra Field and the Decryption -header record preceding compressed file data are: - - 0x0007 - reserved for future use - 0x000F - reserved for future use - 0x0100 - Indicates non-OAEP key wrapping was used. If this - this field is set, the version needed to extract must - be at least 61. This means OAEP key wrapping is not - used when generating a Master Session Key using - ErdData. - 0x4000 - ErdData must be decrypted using 3DES-168, otherwise use the - same algorithm used for encrypting the file contents. - 0x8000 - reserved for future use - - -2. CertData - Extra Field 0x0017 record certificate data structure - -The data structure used to store certificate data within the section -of the Extra Field defined by the CertData field of the 0x0017 -record are as shown: - - Value Size Description - ----- ---- ----------- - RCount 4 bytes Number of recipients. - HashAlg 2 bytes Hash algorithm identifier - HSize 2 bytes Hash size - SRList (var) Simple list of recipients hashed public keys - - - RCount This defines the number intended recipients whose - public keys were used for encryption. This identifies - the number of elements in the SRList. - - HashAlg This defines the hash algorithm used to calculate - the public key hash of each public key used - for encryption. This field currently supports - only the following value for SHA-1 - - 0x8004 - SHA1 - - HSize This defines the size of a hashed public key. - - SRList This is a variable length list of the hashed - public keys for each intended recipient. Each - element in this list is HSize. The total size of - SRList is determined using RCount * HSize. - - -3. Reserved1 - Certificate Decryption Header Reserved1 Data: - - Value Size Description - ----- ---- ----------- - RCount 4 bytes Number of recipients. - - RCount This defines the number intended recipients whose - public keys were used for encryption. This defines - the number of elements in the REList field defined below. - - -4. Reserved2 - Certificate Decryption Header Reserved2 Data Structures: - - - Value Size Description - ----- ---- ----------- - HashAlg 2 bytes Hash algorithm identifier - HSize 2 bytes Hash size - REList (var) List of recipient data elements - - - HashAlg This defines the hash algorithm used to calculate - the public key hash of each public key used - for encryption. This field currently supports - only the following value for SHA-1 - - 0x8004 - SHA1 - - HSize This defines the size of a hashed public key - defined in REHData. - - REList This is a variable length of list of recipient data. - Each element in this list consists of a Recipient - Element data structure as follows: - - - Recipient Element (REList) Data Structure: - - Value Size Description - ----- ---- ----------- - RESize 2 bytes Size of REHData + REKData - REHData HSize Hash of recipients public key - REKData (var) Simple key blob - - - RESize This defines the size of an individual REList - element. This value is the combined size of the - REHData field + REKData field. REHData is defined by - HSize. REKData is variable and can be calculated - for each REList element using RESize and HSize. - - REHData Hashed public key for this recipient. - - REKData Simple Key Blob. The format of this data structure - is identical to that defined in the Microsoft - CryptoAPI and generated using the CryptExportKey() - function. The version of the Simple Key Blob - supported at this time is 0x02 as defined by - Microsoft. - -Certificate Processing - Central Directory Encryption: ------------------------------------------------------- - -Central Directory Encryption using Digital Certificates will -operate in a manner similar to that of Single Password Central -Directory Encryption. This record will only be present when there -is data to place into it. Currently, data is placed into this -record when digital certificates are used for either encrypting -or signing the files within a ZIP file. When only password -encryption is used with no certificate encryption or digital -signing, this record is not currently needed. When present, this -record will appear before the start of the actual Central Directory -data structure and will be located immediately after the Archive -Decryption Header if the Central Directory is encrypted. - -The Archive Extra Data record will be used to store the following -information. Additional data may be added in future versions. - -Extra Data Fields: - -0x0014 - PKCS#7 Store for X.509 Certificates -0x0016 - X.509 Certificate ID and Signature for central directory -0x0019 - PKCS#7 Encryption Recipient Certificate List - -The 0x0014 and 0x0016 Extra Data records that otherwise would be -located in the first record of the Central Directory for digital -certificate processing. When encrypting or compressing the Central -Directory, the 0x0014 and 0x0016 records must be located in the -Archive Extra Data record and they should not remain in the first -Central Directory record. The Archive Extra Data record will also -be used to store the 0x0019 data. - -When present, the size of the Archive Extra Data record will be -included in the size of the Central Directory. The data of the -Archive Extra Data record will also be compressed and encrypted -along with the Central Directory data structure. - -Certificate Processing Differences: - -The Certificate Processing Method of encryption differs from the -Single Password Symmetric Encryption Method as follows. Instead -of using a user-defined password to generate a master session key, -cryptographically random data is used. The key material is then -wrapped using standard key-wrapping techniques. This key material -is wrapped using the public key of each recipient that will need -to decrypt the file using their corresponding private key. - -This specification currently assumes digital certificates will follow -the X.509 V3 format for 1024 bit and higher RSA format digital -certificates. Implementation of this Certificate Processing Method -requires supporting logic for key access and management. This logic -is outside the scope of this specification. - -OAEP Processing with Certificate-based Encryption: - -OAEP stands for Optimal Asymmetric Encryption Padding. It is a -strengthening technique used for small encoded items such as decryption -keys. This is commonly applied in cryptographic key-wrapping techniques -and is supported by PKCS #1. Versions 5.0 and 6.0 of this specification -were designed to support OAEP key-wrapping for certificate-based -decryption keys for additional security. - -Support for private keys stored on Smartcards or Tokens introduced -a conflict with this OAEP logic. Most card and token products do -not support the additional strengthening applied to OAEP key-wrapped -data. In order to resolve this conflict, versions 6.1 and above of this -specification will no longer support OAEP when encrypting using -digital certificates. - -Versions of PKZIP available during initial development of the -certificate processing method set a value of 61 into the -version needed to extract field for a file. This indicates that -non-OAEP key wrapping is used. This affects certificate encryption -only, and password encryption functions should not be affected by -this value. This means values of 61 may be found on files encrypted -with certificates only, or on files encrypted with both password -encryption and certificate encryption. Files encrypted with both -methods can safely be decrypted using the password methods documented. - -IX. Change Process ------------------- - -In order for the .ZIP file format to remain a viable definition, this -specification should be considered as open for periodic review and -revision. Although this format was originally designed with a -certain level of extensibility, not all changes in technology -(present or future) were or will be necessarily considered in its -design. If your application requires new definitions to the -extensible sections in this format, or if you would like to -submit new data structures, please forward your request to -zipformat@pkware.com. All submissions will be reviewed by the -ZIP File Specification Committee for possible inclusion into -future versions of this specification. Periodic revisions -to this specification will be published to ensure interoperability. -We encourage comments and feedback that may help improve clarity -or content. - -X. Incorporating PKWARE Proprietary Technology into Your Product ----------------------------------------------------------------- - -PKWARE is committed to the interoperability and advancement of the -.ZIP format. PKWARE offers a free license for certain technological -aspects described above under certain restrictions and conditions. -However, the use or implementation in a product of certain technological -aspects set forth in the current APPNOTE, including those with regard to -strong encryption, patching, or extended tape operations requires a -license from PKWARE. Please contact PKWARE with regard to acquiring -a license. - -XI. Acknowledgements ---------------------- - -In addition to the above mentioned contributors to PKZIP and PKUNZIP, -I would like to extend special thanks to Robert Mahoney for suggesting -the extension .ZIP for this software. - -XII. References ---------------- - - Fiala, Edward R., and Greene, Daniel H., "Data compression with - finite windows", Communications of the ACM, Volume 32, Number 4, - April 1989, pages 490-505. - - Held, Gilbert, "Data Compression, Techniques and Applications, - Hardware and Software Considerations", John Wiley & Sons, 1987. - - Huffman, D.A., "A method for the construction of minimum-redundancy - codes", Proceedings of the IRE, Volume 40, Number 9, September 1952, - pages 1098-1101. - - Nelson, Mark, "LZW Data Compression", Dr. Dobbs Journal, Volume 14, - Number 10, October 1989, pages 29-37. - - Nelson, Mark, "The Data Compression Book", M&T Books, 1991. - - Storer, James A., "Data Compression, Methods and Theory", - Computer Science Press, 1988 - - Welch, Terry, "A Technique for High-Performance Data Compression", - IEEE Computer, Volume 17, Number 6, June 1984, pages 8-19. - - Ziv, J. and Lempel, A., "A universal algorithm for sequential data - compression", Communications of the ACM, Volume 30, Number 6, - June 1987, pages 520-540. - - Ziv, J. and Lempel, A., "Compression of individual sequences via - variable-rate coding", IEEE Transactions on Information Theory, - Volume 24, Number 5, September 1978, pages 530-536. - - -APPENDIX A - AS/400 Extra Field (0x0065) Attribute Definitions --------------------------------------------------------------- - -Field Definition Structure: - - a. field length including length 2 bytes - b. field code 2 bytes - c. data x bytes - -Field Code Description - 4001 Source type i.e. CLP etc - 4002 The text description of the library - 4003 The text description of the file - 4004 The text description of the member - 4005 x'F0' or 0 is PF-DTA, x'F1' or 1 is PF_SRC - 4007 Database Type Code 1 byte - 4008 Database file and fields definition - 4009 GZIP file type 2 bytes - 400B IFS code page 2 bytes - 400C IFS Creation Time 4 bytes - 400D IFS Access Time 4 bytes - 400E IFS Modification time 4 bytes - 005C Length of the records in the file 2 bytes - 0068 GZIP two words 8 bytes - -APPENDIX B - z/OS Extra Field (0x0065) Attribute Definitions ------------------------------------------------------------- - -Field Definition Structure: - - a. field length including length 2 bytes - b. field code 2 bytes - c. data x bytes - -Field Code Description - 0001 File Type 2 bytes - 0002 NonVSAM Record Format 1 byte - 0003 Reserved - 0004 NonVSAM Block Size 2 bytes Big Endian - 0005 Primary Space Allocation 3 bytes Big Endian - 0006 Secondary Space Allocation 3 bytes Big Endian - 0007 Space Allocation Type1 byte flag - 0008 Modification Date Retired with PKZIP 5.0 + - 0009 Expiration Date Retired with PKZIP 5.0 + - 000A PDS Directory Block Allocation 3 bytes Big Endian binary value - 000B NonVSAM Volume List variable - 000C UNIT Reference Retired with PKZIP 5.0 + - 000D DF/SMS Management Class 8 bytes EBCDIC Text Value - 000E DF/SMS Storage Class 8 bytes EBCDIC Text Value - 000F DF/SMS Data Class 8 bytes EBCDIC Text Value - 0010 PDS/PDSE Member Info. 30 bytes - 0011 VSAM sub-filetype 2 bytes - 0012 VSAM LRECL 13 bytes EBCDIC "(num_avg num_max)" - 0013 VSAM Cluster Name Retired with PKZIP 5.0 + - 0014 VSAM KSDS Key Information 13 bytes EBCDIC "(num_length num_position)" - 0015 VSAM Average LRECL 5 bytes EBCDIC num_value padded with blanks - 0016 VSAM Maximum LRECL 5 bytes EBCDIC num_value padded with blanks - 0017 VSAM KSDS Key Length 5 bytes EBCDIC num_value padded with blanks - 0018 VSAM KSDS Key Position 5 bytes EBCDIC num_value padded with blanks - 0019 VSAM Data Name 1-44 bytes EBCDIC text string - 001A VSAM KSDS Index Name 1-44 bytes EBCDIC text string - 001B VSAM Catalog Name 1-44 bytes EBCDIC text string - 001C VSAM Data Space Type 9 bytes EBCDIC text string - 001D VSAM Data Space Primary 9 bytes EBCDIC num_value left-justified - 001E VSAM Data Space Secondary 9 bytes EBCDIC num_value left-justified - 001F VSAM Data Volume List variable EBCDIC text list of 6-character Volume IDs - 0020 VSAM Data Buffer Space 8 bytes EBCDIC num_value left-justified - 0021 VSAM Data CISIZE 5 bytes EBCDIC num_value left-justified - 0022 VSAM Erase Flag 1 byte flag - 0023 VSAM Free CI % 3 bytes EBCDIC num_value left-justified - 0024 VSAM Free CA % 3 bytes EBCDIC num_value left-justified - 0025 VSAM Index Volume List variable EBCDIC text list of 6-character Volume IDs - 0026 VSAM Ordered Flag 1 byte flag - 0027 VSAM REUSE Flag 1 byte flag - 0028 VSAM SPANNED Flag 1 byte flag - 0029 VSAM Recovery Flag 1 byte flag - 002A VSAM WRITECHK Flag 1 byte flag - 002B VSAM Cluster/Data SHROPTS 3 bytes EBCDIC "n,y" - 002C VSAM Index SHROPTS 3 bytes EBCDIC "n,y" - 002D VSAM Index Space Type 9 bytes EBCDIC text string - 002E VSAM Index Space Primary 9 bytes EBCDIC num_value left-justified - 002F VSAM Index Space Secondary 9 bytes EBCDIC num_value left-justified - 0030 VSAM Index CISIZE 5 bytes EBCDIC num_value left-justified - 0031 VSAM Index IMBED 1 byte flag - 0032 VSAM Index Ordered Flag 1 byte flag - 0033 VSAM REPLICATE Flag 1 byte flag - 0034 VSAM Index REUSE Flag 1 byte flag - 0035 VSAM Index WRITECHK Flag 1 byte flag Retired with PKZIP 5.0 + - 0036 VSAM Owner 8 bytes EBCDIC text string - 0037 VSAM Index Owner 8 bytes EBCDIC text string - 0038 Reserved - 0039 Reserved - 003A Reserved - 003B Reserved - 003C Reserved - 003D Reserved - 003E Reserved - 003F Reserved - 0040 Reserved - 0041 Reserved - 0042 Reserved - 0043 Reserved - 0044 Reserved - 0045 Reserved - 0046 Reserved - 0047 Reserved - 0048 Reserved - 0049 Reserved - 004A Reserved - 004B Reserved - 004C Reserved - 004D Reserved - 004E Reserved - 004F Reserved - 0050 Reserved - 0051 Reserved - 0052 Reserved - 0053 Reserved - 0054 Reserved - 0055 Reserved - 0056 Reserved - 0057 Reserved - 0058 PDS/PDSE Member TTR Info. 6 bytes Big Endian - 0059 PDS 1st LMOD Text TTR 3 bytes Big Endian - 005A PDS LMOD EP Rec # 4 bytes Big Endian - 005B Reserved - 005C Max Length of records 2 bytes Big Endian - 005D PDSE Flag 1 byte flag - 005E Reserved - 005F Reserved - 0060 Reserved - 0061 Reserved - 0062 Reserved - 0063 Reserved - 0064 Reserved - 0065 Last Date Referenced 4 bytes Packed Hex "yyyymmdd" - 0066 Date Created 4 bytes Packed Hex "yyyymmdd" - 0068 GZIP two words 8 bytes - 0071 Extended NOTE Location 12 bytes Big Endian - 0072 Archive device UNIT 6 bytes EBCDIC - 0073 Archive 1st Volume 6 bytes EBCDIC - 0074 Archive 1st VOL File Seq# 2 bytes Binary - -APPENDIX C - Zip64 Extensible Data Sector Mappings (EFS) --------------------------------------------------------- - - -Z390 Extra Field: - - The following is the general layout of the attributes for the - ZIP 64 "extra" block for extended tape operations. Portions of - this extended tape processing technology is covered under a - pending patent application. The use or implementation in a - product of certain technological aspects set forth in the - current APPNOTE, including those with regard to strong encryption, - patching or extended tape operations, requires a license from - PKWARE. Please contact PKWARE with regard to acquiring a license. - - - Note: some fields stored in Big Endian format. All text is - in EBCDIC format unless otherwise specified. - - Value Size Description - ----- ---- ----------- - (Z390) 0x0065 2 bytes Tag for this "extra" block type - Size 4 bytes Size for the following data block - Tag 4 bytes EBCDIC "Z390" - Length71 2 bytes Big Endian - Subcode71 2 bytes Enote type code - FMEPos 1 byte - Length72 2 bytes Big Endian - Subcode72 2 bytes Unit type code - Unit 1 byte Unit - Length73 2 bytes Big Endian - Subcode73 2 bytes Volume1 type code - FirstVol 1 byte Volume - Length74 2 bytes Big Endian - Subcode74 2 bytes FirstVol file sequence - FileSeq 2 bytes Sequence - -APPENDIX D - Language Encoding (EFS) ------------------------------------- - -The ZIP format has historically supported only the original IBM PC character -encoding set, commonly referred to as IBM Code Page 437. This limits storing -file name characters to only those within the original MS-DOS range of values -and does not properly support file names in other character encodings, or -languages. To address this limitation, this specification will support the -following change. - -If general purpose bit 11 is unset, the file name and comment should conform -to the original ZIP character encoding. If general purpose bit 11 is set, the -filename and comment must support The Unicode Standard, Version 4.1.0 or -greater using the character encoding form defined by the UTF-8 storage -specification. The Unicode Standard is published by the The Unicode -Consortium (www.unicode.org). UTF-8 encoded data stored within ZIP files -is expected to not include a byte order mark (BOM). - -Applications may choose to supplement this file name storage through the use -of the 0x0008 Extra Field. Storage for this optional field is currently -undefined, however it will be used to allow storing extended information -on source or target encoding that may further assist applications with file -name, or file content encoding tasks. Please contact PKWARE with any -requirements on how this field should be used. - -The 0x0008 Extra Field storage may be used with either setting for general -purpose bit 11. Examples of the intended usage for this field is to store -whether "modified-UTF-8" (JAVA) is used, or UTF-8-MAC. Similarly, other -commonly used character encoding (code page) designations can be indicated -through this field. Formalized values for use of the 0x0008 record remain -undefined at this time. The definition for the layout of the 0x0008 field -will be published when available. Use of the 0x0008 Extra Field provides -for storing data within a ZIP file in an encoding other than IBM Code -Page 437 or UTF-8. - -General purpose bit 11 will not imply any encoding of file content or -password. Values defining character encoding for file content or -password must be stored within the 0x0008 Extended Language Encoding -Extra Field. - -Ed Gordon of the Info-ZIP group has defined a pair of "extra field" records -that can be used to store UTF-8 file name and file comment fields. These -records can be used for cases when the general purpose bit 11 method -for storing UTF-8 data in the standard file name and comment fields is -not desirable. A common case for this alternate method is if backward -compatibility with older programs is required. - -Definitions for the record structure of these fields are included above -in the section on 3rd party mappings for "extra field" records. These -records are identified by Header ID's 0x6375 (Info-ZIP Unicode Comment -Extra Field) and 0x7075 (Info-ZIP Unicode Path Extra Field). - -The choice of which storage method to use when writing a ZIP file is left -to the implementation. Developers should expect that a ZIP file may -contain either method and should provide support for reading data in -either format. Use of general purpose bit 11 reduces storage requirements -for file name data by not requiring additional "extra field" data for -each file, but can result in older ZIP programs not being able to extract -files. Use of the 0x6375 and 0x7075 records will result in a ZIP file -that should always be readable by older ZIP programs, but requires more -storage per file to write file name and/or file comment fields. - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt b/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt deleted file mode 100644 index 247ff5c625..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt +++ /dev/null @@ -1,201 +0,0 @@ -string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" - WRONGCMAKEDIR) -if(WRONGCMAKEDIR) - message(FATAL_ERROR "You should point CMake to the parent directory.") -endif(WRONGCMAKEDIR) - -set(TESTJSFILES tests/core/ZipTests.js - tests/core/Base64Tests.js - tests/core/CursorTests.js - tests/core/PointWalkerTests.js - tests/core/RuntimeTests.js - tests/gui/CaretTests.js - tests/gui/SelectionMoverTests.js - tests/gui/XMLEditTests.js - tests/xmldom/OperationalTransformDOMTests.js - tests/xmldom/XPathTests.js - tests/tests.js -) - -add_custom_target(jslintcheck ALL - COMMAND ${NODE} lib/runtime.js tools/runjslint.js - ${LIBJSFILES} ${TESTJSFILES} - DEPENDS NodeJS - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - SOURCES ${LIBJSFILES} ${TESTJSFILES} -) - -if (Java_JAVA_EXECUTABLE) - # nonStandardJsDocs is not used because we use @licstart @licend and @source - set(SHARED_CLOSURE_ARGS --warning_level VERBOSE --jscomp_error accessControls --jscomp_error ambiguousFunctionDecl --jscomp_error checkRegExp --jscomp_error checkTypes --jscomp_error checkVars --jscomp_error constantProperty --jscomp_error deprecated --jscomp_error externsValidation --jscomp_error fileoverviewTags --jscomp_error globalThis --jscomp_error invalidCasts --jscomp_error missingProperties --jscomp_error strictModuleDepCheck --jscomp_error typeInvalidation --jscomp_error undefinedVars --jscomp_error unknownDefines --jscomp_error uselessCode --jscomp_error visibility --jscomp_off nonStandardJsDocs --summary_detail_level 3) - - foreach(JSFILE ${LIBJSFILES}) - set(LIB_CLOSURE_ARGS ${LIB_CLOSURE_ARGS} - --js ${CMAKE_CURRENT_SOURCE_DIR}/${JSFILE}) - endforeach(JSFILE ${LIBJSFILES}) - - foreach(JSFILE ${TESTJSFILES}) - set(TEST_CLOSURE_ARGS ${TEST_CLOSURE_ARGS} - --js ${CMAKE_CURRENT_SOURCE_DIR}/${JSFILE}) - endforeach(JSFILE ${TESTJSFILES}) - - add_custom_command( - OUTPUT simplecompiled.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} ${TEST_CLOSURE_ARGS} - --compilation_level WHITESPACE_ONLY - --formatting PRETTY_PRINT - --js_output_file simplecompiled.js - DEPENDS ClosureCompiler ${LIBJSFILES} ${TESTJSFILES} - ) - - add_custom_command( - OUTPUT compiled.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - --define IS_COMPILED_CODE=true - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} ${TEST_CLOSURE_ARGS} - --compilation_level ADVANCED_OPTIMIZATIONS - --formatting PRETTY_PRINT - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - --js_output_file compiled.js - DEPENDS ClosureCompiler ${LIBJSFILES} ${TESTJSFILES} tools/externs.js - ) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/webodf.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - --define IS_COMPILED_CODE=true - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} - --compilation_level SIMPLE_OPTIMIZATIONS - --formatting PRINT_INPUT_DELIMITER - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - --js_output_file ${CMAKE_CURRENT_BINARY_DIR}/webodf.js - DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js - ) - add_custom_target(webodf.js - SOURCES ${CMAKE_CURRENT_BINARY_DIR}/webodf.js - ) - - # too hardcore for now... - # add_custom_command( - # OUTPUT webodf-experimental.js - # COMMAND ${Java_JAVA_EXECUTABLE} - # ARGS -jar ${CLOSURE_JAR} - # --define IS_COMPILED_CODE=true - # ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} - # --js ${CMAKE_CURRENT_SOURCE_DIR}/lib/export.js - # --compilation_level ADVANCED_OPTIMIZATIONS - # --formatting PRINT_INPUT_DELIMITER - # --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - # --js_output_file webodf-experimental.js - # DEPENDS ClosureCompiler ${LIBJSFILES} lib/export.js tools/externs.js - # ) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - --define IS_COMPILED_CODE=true - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} - --compilation_level WHITESPACE_ONLY - --formatting PRETTY_PRINT - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - --js_output_file ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js - DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js - ) - add_custom_target(webodf-debug.js - SOURCES ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js - ) - - add_custom_command( - OUTPUT odfedit.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - --define IS_COMPILED_CODE=true - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} - --js ${CMAKE_CURRENT_SOURCE_DIR}/odfedit.js - --compilation_level ADVANCED_OPTIMIZATIONS - --formatting PRETTY_PRINT - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/extjsexterns.js - --js_output_file odfedit.js - DEPENDS ClosureCompiler ${LIBJSFILES} ${APPJSFILES} tools/externs.js tools/extjsexterns.js odfedit.js - ) - - add_custom_command( - OUTPUT gui.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${CLOSURE_JAR} - --define IS_COMPILED_CODE=true - ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} - --js ${CMAKE_CURRENT_SOURCE_DIR}/filelister.js - --js ${CMAKE_CURRENT_SOURCE_DIR}/gui.js - --compilation_level ADVANCED_OPTIMIZATIONS - --formatting PRETTY_PRINT - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js - --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/extjsexterns.js - --js_output_file gui.js - DEPENDS ClosureCompiler ${LIBJSFILES} ${APPJSFILES} tools/externs.js tools/extjsexterns.js filelister.js gui.js - ) - - add_custom_target(syntaxcheck ALL - DEPENDS simplecompiled.js webodf.js webodf-debug.js compiled.js - ) - - add_custom_target(rhinotest - COMMAND ${Java_JAVA_EXECUTABLE} -jar ${RHINO} - -debug lib/runtime.js tests/tests.js - DEPENDS Rhino - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - SOURCES ${LIBJSFILES} - ) - add_custom_target(simplerhinotest - COMMAND ${Java_JAVA_EXECUTABLE} -jar ${RHINO} - ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js - DEPENDS Rhino simplecompiled.js - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests - ) - add_custom_command( - OUTPUT docs/index.html - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -jar ${JSDOCDIR}/jsrun.jar - ${JSDOCDIR}/app/run.js -d=${CMAKE_CURRENT_BINARY_DIR}/docs - -t=${JSDOCDIR}/templates/jsdoc ${LIBJSFILES} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${LIBJSFILES} JsDoc - ) - add_custom_target(doc DEPENDS docs/index.html) - add_custom_target(simplenodetest ALL - COMMAND ${NODE} ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js - DEPENDS NodeJS simplecompiled.js - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests - ) - -endif (Java_JAVA_EXECUTABLE) - -add_custom_target(nodetest ALL - COMMAND ${NODE} lib/runtime.js tests/tests.js - DEPENDS NodeJS - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - SOURCES ${LIBJSFILES} -) -if (QT4_FOUND) - add_custom_target(qtjsruntimetest ALL - COMMAND ${CMAKE_BINARY_DIR}/programs/qtjsruntime/qtjsruntime ../lib/runtime.js tests.js - DEPENDS qtjsruntime jslintcheck - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests - SOURCES ${LIBJSFILES} - ) -endif (QT4_FOUND) -add_custom_command( - OUTPUT instrumented/index.html - COMMAND ${JSCOVERAGE} - ARGS --exclude=extjs --exclude=extjs/.git ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/instrumented - DEPENDS ${LIBJSFILES} jslintcheck JSCoverage -) -add_custom_target(instrumented ALL DEPENDS instrumented/index.html) -# vim:expandtab diff --git a/apps/files_odfviewer/src/webodf/webodf/README b/apps/files_odfviewer/src/webodf/webodf/README deleted file mode 100644 index a4dde2fee7..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/README +++ /dev/null @@ -1,43 +0,0 @@ -This directory contains the javacript code to WebODF as well as applications that use it. The applications are browser applications, commandline applications and unit tests. - -lib/ -lib/core/ Parts of WebODF that also work on JavaScript runtimes without a - document window. -lib/gui/ Parts of WebODF that require a domtree - -The library should be able to run in a number of different runtimes. Currently these are: - - a webbrowser - - node.js - - rhino -A common API is implemented for these three environments in the files lib/browser.js, lib/node.js and lib/rhino.js respectively. - - - -Requirements on the code - -There are several requirements that need to met before code can be considered for inclusion in WebODF. Most requirements can be checked automatically, a few have to be checked by hand. A contribution must: - - be contributed under the appropriate license - - be javascript - - not give any warnings in a JSLint check - - be unchanged when passed through jsbeautifier - - compile with the closure compiler - - must pass all the unit tests that were passed before - - as separate js files in the currenlty used Node.JS implementation - - as a single compiled file in the currenlty used Node.JS implementation - - as separate js files in the currenlty used Rhino implementation - - as a single compiled file Rhino implementation - - must have equal or greater code coverage for the each of the test runs - -The automatic checks can be performed by running a dedicated command that reports in an xml file. This report is compared to the previous report. - -runtests.js is the command that creates a report. - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/compare.html b/apps/files_odfviewer/src/webodf/webodf/compare.html deleted file mode 100644 index 0cf1cc80af..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/compare.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - -
    - - diff --git a/apps/files_odfviewer/src/webodf/webodf/compare.js b/apps/files_odfviewer/src/webodf/webodf/compare.js deleted file mode 100644 index 16bf5e333f..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/compare.js +++ /dev/null @@ -1,45 +0,0 @@ -/*global runtime: true, odf: true*/ -/*jslint white: false*/ -function getURIParameters(window) { - "use strict"; - var params = {}, - query = window.location.search.substring(1), - parms = query.split('&'), - i, - pos, - key, - val; - for (i = 0; i < parms.length; i += 1) { - pos = parms[i].indexOf('='); - if (pos > 0) { - key = parms[i].substring(0, pos); - val = parms[i].substring(pos + 1); - params[key] = val; - } - } - return params; -} -function init(window, document) { - "use strict"; - runtime.loadClass("odf.OdfCanvas"); - var params = getURIParameters(window), - odfelement = document.getElementById("odf"), - odfcanvas = new odf.OdfCanvas(odfelement); - if (!params.odf) { - return; - } - odfcanvas.addListener("statereadychange", function () { - var s = odfelement.style, - bgzoom = "100% auto", - pos; - s.backgroundImage = "url(" + params.bg + ")"; - s.backgroundRepeat = "no-repeat"; - if (params.bgzoom) { - bgzoom = params.bgzoom + "% auto"; - } - s.backgroundSize = bgzoom; - pos = (params.x || "0") + "px " + (params.y || "0") + "px"; - s.backgroundPosition = pos; - }); - odfcanvas.load(params.odf); -} diff --git a/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt b/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt deleted file mode 100644 index 866b29de77..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt +++ /dev/null @@ -1,69 +0,0 @@ -Found this in a mozilla forum. -http://forums.mozillazine.org/viewtopic.php?f=27&t=313496&start=0# - -Another implementation under MIT license can be found here: -http://www.codeproject.com/KB/scripting/Javascript_binaryenc.aspx - - //listener for the converted data - var listener = - { - onDataAvailable : function(request, context, inputStream, offset, count) - { - //write the data - var output = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); - - //outputFile is a file which will contain the gunzipped data - if(!outputFile.exists()) - output.init(outputFile, 0x02 | 0x08, 0644, 0); - - else - output.init(outputFile, 0x02 | 0x10, 0644, 0); - - var scriptable = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); - scriptable.init(inputStream); - - var data = scriptable.read(inputStream.available()); - output.write(data, data.length); - - output.close(); - }, - - onStartRequest : function(request, context) - { - }, - - onStopRequest : function(request, context) - { - } - }; - - //fake uri needed to create a channel - var uri = Components.classes["@mozilla.org/network/simple-uri;1"].createInstance(Components.interfaces.nsIURI); - uri.scheme = "http://gunzip"; - - //fake channel needed to create a request - var chan = Components.classes["@mozilla.org/network/input-stream-channel;1"].createInstance(Components.interfaces.nsIInputStreamChannel); - chan.setURI(uri); - chan.contentLength = decrypted.length; - chan.contentType = "gzip"; - chan.contentStream = null; - - var request = chan.QueryInterface(Components.interfaces.nsIRequest); - - // Attempt to gunzip - var conv = Components.classes["@mozilla.org/streamconv;1?from=gzip&to=uncompressed"].createInstance(Components.interfaces.nsIStreamConverter); - - conv.asyncConvertData("gzip", "uncompressed", listener, null); - - conv.onStartRequest(request, null); - - //input is an inputstream which contains the gzipped data - var avail = input.available(); - - //really do the conversion - conv.onDataAvailable(request, null, input, 0, avail); - - var status = {}; - conv.onStopRequest(request, null, status); - - input.close(); diff --git a/apps/files_odfviewer/src/webodf/webodf/embedodf.html b/apps/files_odfviewer/src/webodf/webodf/embedodf.html deleted file mode 100644 index 96bb25cc2b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/embedodf.html +++ /dev/null @@ -1,2 +0,0 @@ - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/filelister.js b/apps/files_odfviewer/src/webodf/webodf/filelister.js deleted file mode 100644 index 08f6cd3cb0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/filelister.js +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global XMLHttpRequest*/ -/*jslint regexp: true*/ -/** asynchroneous function that lists all files **/ -function listFiles(startdir, filepattern, fileCallback, doneCallback) { - "use strict"; - - var todoList = [], - doneList = [], - dirpattern = /\/$/, - hasWEBDAV = false; - - function getHref(responseElement) { - var n = responseElement.firstChild; - while (n && !(n.namespaceURI === 'DAV:' && n.localName === 'href')) { - n = n.nextSibling; - } - return n && n.firstChild && n.firstChild.nodeValue; - } - - function isDirectory(responseElement) { - var n = responseElement.firstChild; - while (n && - !(n.namespaceURI === 'DAV:' && n.localName === 'propstat')) { - n = n.nextSibling; - } - n = n && n.firstChild; - while (n && - !(n.namespaceURI === 'DAV:' && n.localName === 'prop')) { - n = n.nextSibling; - } - n = n && n.firstChild; - while (n && !(n.namespaceURI === 'DAV:' && - n.localName === 'resourcetype')) { - n = n.nextSibling; - } - n = n && n.firstChild; - while (n && - !(n.namespaceURI === 'DAV:' && n.localName === 'collection')) { - n = n.nextSibling; - } - return n; - } - - function processWebDavResponse(xml) { - if (!xml) { - throw new Error('No proper XML response.'); - } - - var refs = xml.getElementsByTagNameNS('DAV:', 'response'), - directories = [], - files = [], - i, - d, - href; - if (refs.length === 0) { - throw new Error('No proper XML response.'); - } - for (i = 0; i < refs.length; i += 1) { - href = getHref(refs[i]); - if (isDirectory(refs[i])) { - directories.push(href); - } else if (filepattern.test(href)) { - files.push(href); - } - } - for (i = 0; i < directories.length; i += 1) { - d = directories[i]; - if (doneList.indexOf(d) === -1 && todoList.indexOf(d) === -1) { - todoList.push(d); - } - } - fileCallback(directories, files); - } - - function processIndexHtmlResponse(base, text) { - // use regex because index.html is usually not valid xml - var re = /href="([^\/\?"][^"]*)"/ig, - matches, - files = [], - directories = [], - name, - d, - i; - while ((matches = re.exec(text)) !== null) { - name = matches[1]; - if (dirpattern.test(name)) { - directories.push(base + name); - } else if (filepattern.test(name)) { - files.push(base + name); - } - } - for (i = 0; i < directories.length; i += 1) { - d = directories[i]; - if (doneList.indexOf(d) === -1 && todoList.indexOf(d) === -1) { - todoList.push(d); - } - } - fileCallback(directories, files); - } - - function getNextFileListWithIndexHtml() { - var url = todoList.shift(), - req; - while (url && typeof url !== 'string') { - url = todoList.shift(); - } - if (!url) { - if (doneCallback) { - doneCallback(); - } - return; - } - req = new XMLHttpRequest(); - req.open('GET', url, true); - req.onreadystatechange = function (evt) { - if (req.readyState !== 4) { - return; - } - if (req.status >= 200 && req.status < 300) { - processIndexHtmlResponse(url, req.responseText); - } - getNextFileListWithIndexHtml(); - }; - req.send(null); - - doneList.push(url); - } - - function getNextFileListWithWebDav() { - var url = todoList.shift(), - req; - if (!url) { - if (doneCallback) { - doneCallback(); - } - return; - } - - req = new XMLHttpRequest(); - req.open('PROPFIND', url, true); - req.onreadystatechange = function (evt) { - if (req.readyState !== 4) { - return; - } - if (req.status >= 200 && req.status < 300) { - try { - processWebDavResponse(req.responseXML); - hasWEBDAV = true; - } catch (e) { - } - } - if (hasWEBDAV) { - getNextFileListWithWebDav(); - } else { - todoList.push(url); - doneList = []; - getNextFileListWithIndexHtml(); - } - }; - req.setRequestHeader('Depth', '1'); - req.send(null); - - doneList.push(url); - } - - todoList.push(startdir); - getNextFileListWithWebDav(); -} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile b/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile deleted file mode 100644 index 291eef04b6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - /tmp/flex/bin/mxmlc PUT.as diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as deleted file mode 100644 index 451d8a0fd0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as +++ /dev/null @@ -1,18 +0,0 @@ -package { - import flash.display.Sprite; - import flash.display.LoaderInfo; - import flash.external.ExternalInterface; - public class PUT extends Sprite { - public function PUT() { - ExternalInterface.addCallback("put", this.put); - var callback:String = LoaderInfo(root.loaderInfo).parameters["readyCallback"]; - ExternalInterface.call(callback); - } - public function put(host:String, port:uint, path:String, - data:String, callbackFunctionName:String, - callbackId:String):void { - new Request(host, port, path, data, - callbackFunctionName, callbackId); - } - } -} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf deleted file mode 100644 index 466d0a1316..0000000000 Binary files a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as b/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as deleted file mode 100644 index 3217dde25d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as +++ /dev/null @@ -1,83 +0,0 @@ -package { - import flash.events.*; - import flash.external.ExternalInterface; - import flash.net.Socket; - import flash.utils.ByteArray; - import mx.utils.Base64Decoder; - import mx.utils.Base64Encoder; - internal class Request { - private var id:String; - private var header:String; - private var data:ByteArray; - private var callbackName:String; - private var socket:Socket; - public function Request(host:String, port:uint, path:String, - data:String, callbackName:String, - callbackId:String) { - var atob:Base64Decoder = new Base64Decoder(); - atob.decode(data); - this.data = atob.toByteArray(); - this.header = - "PUT " + path + " HTTP/1.1\r\n" + - "Host: " + host + "\r\n" + - "Content-Length: " + this.data.length + "\r\n" + - "\r\n"; - this.callbackName = callbackName; - this.id = callbackId; - this.socket = new Socket(); - this.socket.timeout = 1000; - this.socket.addEventListener(Event.CONNECT, - connectHandler); - this.socket.addEventListener(IOErrorEvent.IO_ERROR, - ioErrorHandler); - this.socket.addEventListener( - SecurityErrorEvent.SECURITY_ERROR, - securityErrorHandler); - this.socket.addEventListener(Event.CLOSE, closeHandler); - this.socket.addEventListener(ProgressEvent.SOCKET_DATA, - dataHandler); - this.socket.connect(host, port); - } - private function connectHandler(connect:Event):void { - this.socket.writeBytes(toByteArray(this.header)); - this.socket.writeBytes(this.data); - this.socket.flush(); - this.header = null; - this.data.length = 0; - } - private function ioErrorHandler(ioError:IOErrorEvent):void { - ExternalInterface.call(this.callbackName, this.id, - null); - this.socket.close(); - } - private function securityErrorHandler( - securityError:SecurityErrorEvent):void { - ExternalInterface.call(this.callbackName, this.id, - null); - this.socket.close(); - } - private function closeHandler(close:Event):void { - ExternalInterface.call(this.callbackName, this.id, - null); - } - private function dataHandler(data:ProgressEvent):void { - // assume it went well, TODO: parse reply, handle error - this.socket.readBytes(this.data); - var btoa:Base64Encoder = new Base64Encoder(); - btoa.encodeBytes(this.data); - ExternalInterface.call(this.callbackName, this.id, - btoa.toString()); - this.data.length = 0; - this.socket.close(); - } - public function toByteArray(str:String):ByteArray { - var length:uint = str.length; - var i:uint = 0; - var data:ByteArray = new ByteArray(); - for (i; i < length; i++) { - data.writeByte(str.charCodeAt(i) & 0xff); - } - return data; - } - } -} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/test.html b/apps/files_odfviewer/src/webodf/webodf/flashput/test.html deleted file mode 100644 index 349f7680ba..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/flashput/test.html +++ /dev/null @@ -1,96 +0,0 @@ - - - hi - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/gui.js b/apps/files_odfviewer/src/webodf/webodf/gui.js deleted file mode 100644 index 5fce22f51e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/gui.js +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global Ext:true, runtime:true, core:true, listFiles:true*/ -runtime.loadClass("core.Zip"); -runtime.loadClass("core.Base64"); - -/** - * @param {Ext.data.Model} node - * @return {undefined} - */ -function addThumbnail(node) { - "use strict"; - var url = node.get('id'), zip; -/* - zip = new core.Zip(url, function (err, zipobject) { - zip = zipobject; - if (err) { - return; - } - zip.load('Thumbnails/thumbnail.png', function (err, data) { - if (data === null) { - return; - } - var url = 'data:;base64,' + - (new core.Base64()).convertUTF8ArrayToBase64(data), - el, spans, i, s; - el = node.getUI().getEl(); - if (el) { - spans = el.getElementsByTagName('span'); - for (i = 0; i < spans.length; i += 1) { - s = spans.item(i); - if (s.getAttribute('qtip')) { - s.setAttribute('qtip', node.attributes.qtip); - } - } - } else { - node.attributes.qtip += '
    '; - } - }); - }); -*/ -} - -/** - * @param {!string} url - * @param {!Ext.tab.Panel} panel - * @param {!string} title - * @return {undefined} - */ -function loadODF(url, panel, title) { - "use strict"; - var tab = panel.items.findBy(function (item) { - return item.url === url; - }), - newTab; - if (tab) { - panel.setActiveTab(tab); - return; - } - newTab = Ext.create('Ext.container.Container', { - title: title, - tabTip: url, - url: url, - closable: true, - autoEl: { - tag: 'iframe', - name: url, - src: 'odf.html#' + url, - frameBorder: 0, - style: { - border: '0 none' - } - }, - region: 'center' - }); - panel.add(newTab); - panel.setActiveTab(newTab); -} - -Ext.onReady(function () { - "use strict"; - var editButton, tabpanel, slider, tree, viewport; - - Ext.QuickTips.init(); - - /** - * @param {!Ext.Button} button - * @param {!boolean} pressed - * @return {undefined} - */ - function editToggle(button, pressed) { - var tab = tabpanel.getActiveTab(), o, odfcanvas = "odfcanvas"; - if (!tab) { - return; - } - tab.el.dom.contentDocument[odfcanvas].setEditable(pressed); - } - - /** - * @param {!Object} slider - * @param {!number} zoomlevel - * @param {!Object} thumb - * @return {undefined} - */ - function setZoom(slider, zoomlevel, thumb) { - var tab = tabpanel.getActiveTab(), - body; - if (!tab) { - return; - } - body = tab.el.dom.contentDocument.body; - zoomlevel = Math.pow(10, zoomlevel / 10.0); - body.style.zoom = zoomlevel; - body.style.MozTransform = 'scale(' + zoomlevel + ')'; - } - - /** - * @param {!Ext.data.NodeInterface} root - * @param {!string} uri - * @return {!Ext.data.NodeInterface} - */ - function getParentNode(root, uri) { - var parts = uri.split('/'), - node = root, - id = parts[0], - i, - n; - for (i = 1; i < parts.length - 1; i += 1) { - n = node.findChild('text', parts[i], false); - id += '/' + parts[i]; - if (!n) { - n = { - id: id, - text: parts[i], - qtip: uri, - cls: 'folder' - }; - n = node.appendChild(n); - } - node = n; - } - return node; - } - - /** - * @param {!Array.} directories - * @param {!Array.} files - * @return {undefined} - */ - function listFilesCallback(directories, files) { - var root = tree.getRootNode(), - i, - f, - parentNode, - qtip, - node; - for (i = 0; i < files.length; i += 1) { - f = files[i]; - parentNode = getParentNode(root, f); - qtip = f; - node = parentNode.appendChild({ - id: f, - qtip: qtip, - text: f.substr(f.lastIndexOf('/') + 1), - cls: 'file', - leaf: true, - editable: false - }); - f = /**@type{!Ext.data.Model}*/(node); - addThumbnail(f); - } - } - - /** - * @return {undefined} - */ - function listFilesDoneCallback() { - } - - editButton = new Ext.Button({ - enableToggle: true, - text: 'Editable', - listeners: { toggle: { fn: editToggle } } - }); - - slider = new Ext.Slider({ - width: 300, - minValue: -5, - maxValue: 5, - values: [0], - listeners: { changecomplete: { fn: setZoom } } - }); - - tabpanel = Ext.create('Ext.tab.Panel', { - tbar: [ 'Zoom: ', slider, editButton ], - region: 'center' - }); - - tree = Ext.create('Ext.tree.Panel', { - title: 'Documents', - region: 'west', - width: 200, - split: true, - autoScroll: true, - collapsible: true, - rootVisible: false, - enableTabScroll: true, - defaults: {autoScroll: true}, - listeners: { - itemclick: function (view, rec) { - if (rec.get('cls') === 'file') { - loadODF(rec.get('id'), tabpanel, rec.get('text')); - } else if (rec.get('cls') === 'folder') { - if (rec.isExpanded()) { - rec.collapse(); - } else { - rec.expand(); - } - } - } - }, - root: { nodeType: 'node' } - }); - - viewport = new Ext.Viewport({ - layout: 'border', - items: [ tabpanel, tree ] - }); - - // put data in the tree - listFiles('./demodocs/', /\.od[tps]$/i, listFilesCallback, - listFilesDoneCallback); -}); diff --git a/apps/files_odfviewer/src/webodf/webodf/httpserver.js b/apps/files_odfviewer/src/webodf/webodf/httpserver.js deleted file mode 100644 index 245ce9f3f7..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/httpserver.js +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global require: true, console: true, process: true, Buffer: true, - unescape: true */ -/* A Node.JS http server*/ -var http = require("http"), - url = require("url"), - path = require("path"), - fs = require("fs"), - lookForIndexHtml = true, - ipaddress = "127.0.0.1", - //ipaddress = "192.168.1.105", - port = 8124; - -function statFile(dir, filelist, position, callback) { - "use strict"; - if (position >= filelist.length) { - return callback(null, filelist); - } - fs.stat(dir + "/" + filelist[position], function (err, stats) { - if (stats && stats.isDirectory()) { - filelist[position] = filelist[position] + "/"; - } - statFile(dir, filelist, position + 1, callback); - }); -} - -function listFiles(dir, callback) { - "use strict"; - fs.readdir(dir, function (err, files) { - if (err) { - return callback(err); - } - statFile(dir, files, 0, callback); - }); -} - -http.createServer(function (request, response) { - "use strict"; - var uri = unescape(url.parse(request.url).pathname), - filename = path.join(process.cwd(), uri); - if (uri !== '/favicon.ico') { - console.log(request.method + " " + uri); - } - function put() { - var contentlength = parseInt(request.headers["content-length"], 10), - alldata = new Buffer(contentlength), - sum = 0; - request.on("data", function (data) { - data.copy(alldata, sum, 0); - sum += data.length; - }); - request.on("end", function () { - fs.writeFile(filename, alldata, "binary", function (err) { - if (err) { - response.writeHead(500); - response.write(err); - } else { - response.writeHead(200); - } - response.end(); - }); - }); - } - if (request.method === "PUT") { - put(request, response); - return; - } - if (request.method === "DELETE") { - fs.unlink(filename, function (err) { - if (err) { - response.writeHead(500); - } else { - response.writeHead(200); - } - response.end(); - }); - return; - } - function handleStat(err, stats, lookForIndexHtml) { - if (!err && stats.isFile()) { - fs.readFile(filename, "binary", function (err, file) { - if (err) { - response.writeHead(500, {"Content-Type": "text/plain"}); - if (request.method !== "HEAD") { - response.write(err + "\n"); - } - response.end(); - return; - } - var head = {"Content-Length": stats.size}; - if (filename.substr(-3) === ".js") { - head["Content-Type"] = "text/javascript"; - } else if (filename.substr(-4) === ".css") { - head["Content-Type"] = "text/css"; - } else if (filename.substr(-4) === ".odt" || - filename.substr(-5) === ".fodt") { - head["Content-Type"] = "application/vnd.oasis.opendocument.text"; - } else if (filename.substr(-4) === ".ods" || - filename.substr(-5) === ".fods") { - head["Content-Type"] = "application/vnd.oasis.opendocument.presentation"; - } else if (filename.substr(-4) === ".odp" || - filename.substr(-5) === ".fodp") { - head["Content-Type"] = "application/vnd.oasis.opendocument.spreadsheet"; - } - response.writeHead(200, head); - if (request.method !== "HEAD") { - response.write(file, "binary"); - } - response.end(); - }); - } else if (!err && stats.isDirectory()) { - if (lookForIndexHtml) { - fs.stat(filename + "/index.html", function (err, stats) { - if (err) { - fs.stat(filename, handleStat); - } else { - filename = filename + "/index.html"; - handleStat(err, stats); - } - }); - return; - } - if (uri.length === 0 || uri[uri.length - 1] !== "/") { - response.writeHead(301, {"Content-Type": "text/plain", - "Location": uri + "/"}); - if (request.method !== "HEAD") { - response.write("Moved permanently\n"); - } - response.end(); - return; - } - listFiles(filename, function (err, files) { - if (err) { - response.writeHead(500, {"Content-Type": "text/plain"}); - if (request.method !== "HEAD") { - response.write(err + "\n"); - } - response.end(); - return; - } - response.writeHead(200); - if (request.method !== "HEAD") { - files.sort(); - response.write(""); - response.write(""); - var i, l = files.length, file; - for (i = 0; i < l; i += 1) { - file = files[i]; - if (file.length > 0 && file[file.length - 1] === '/') { - file = encodeURIComponent(file.slice(0, file.length - 1)) + "/"; - } else { - file = encodeURIComponent(file); - } - response.write("\n"); - } - response.write("
    "); - file = files[i].replace("&", "&") - .replace("<", ">"); - response.write(file.replace("\"", "\\\"")); - response.write("
    \n"); - } - response.end(); - }); - } else { - if (uri !== '/favicon.ico') { - console.log("Not found: " + uri); - } - response.writeHead(404, {"Content-Type": "text/plain"}); - if (request.method !== "HEAD") { - response.write("404 Not Found\n"); - } - response.end(); - } - } - fs.stat(filename, function (err, stats) { - handleStat(err, stats, lookForIndexHtml); - }); -}).listen(port, ipaddress); - -console.log('Server running at ' + ipaddress + ':' + port + '/'); diff --git a/apps/files_odfviewer/src/webodf/webodf/index.html b/apps/files_odfviewer/src/webodf/webodf/index.html deleted file mode 100644 index 027a8a9b23..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - WebODF - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js deleted file mode 100644 index 358a8feee0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core*/ - -/** - * @constructor - */ -core.Async = function Async() { - "use strict"; - /** - * @param {!Array.<*>} items - * @param {function(*, !function(!string):undefined):undefined} f - * @param {function(?string)} callback - * @return {undefined} - */ - this.forEach = function (items, f, callback) { - var i, l = items.length, itemsDone = 0; - function end(err) { - if (itemsDone !== l) { - if (err) { - itemsDone = l; - callback(err); - } else { - itemsDone += 1; - if (itemsDone === l) { - callback(null); - } - } - } - } - for (i = 0; i < l; i += 1) { - f(items[i], end); - } - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js deleted file mode 100644 index 736f5bb531..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js +++ /dev/null @@ -1,362 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*jslint bitwise: true, regexp: true*/ -/*global core: true, runtime: true*/ -/* - * $Id: base64.js,v 0.9 2009/03/01 20:51:18 dankogai Exp dankogai $ - */ -/** - * @namespace - */ -core.Base64 = (function () { - "use strict"; - var b64chars - = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', - - b64charcodes = (function () { - var a = [], i, - codeA = 'A'.charCodeAt(0), - codea = 'a'.charCodeAt(0), - code0 = '0'.charCodeAt(0); - for (i = 0; i < 26; i += 1) { - a.push(codeA + i); - } - for (i = 0; i < 26; i += 1) { - a.push(codea + i); - } - for (i = 0; i < 10; i += 1) { - a.push(code0 + i); - } - a.push('+'.charCodeAt(0)); - a.push('/'.charCodeAt(0)); - return a; - }()), - - b64tab = (function (bin) { - var t = {}, i, l; - for (i = 0, l = bin.length; i < l; i += 1) { - t[bin.charAt(i)] = i; - } - return t; - }(b64chars)), - convertUTF16StringToBase64, - convertBase64ToUTF16String, - btoa, atob; - - /** - * @param {!string} s - * @return {!Array} - */ - function stringToArray(s) { - var a = [], i, l = s.length; - for (i = 0; i < l; i += 1) { - a[i] = s.charCodeAt(i) & 0xff; - } - return a; - } - - function convertUTF8ArrayToBase64(bin) { - var n, - b64 = "", - i, - l = bin.length - 2; - for (i = 0; i < l; i += 3) { - n = (bin[i] << 16) | (bin[i + 1] << 8) | bin[i + 2]; - b64 += b64chars[n >>> 18]; - b64 += b64chars[(n >>> 12) & 63]; - b64 += b64chars[(n >>> 6) & 63]; - b64 += b64chars[n & 63]; - } - if (i === l + 1) { // 1 byte left - n = bin[i] << 4; - b64 += b64chars[n >>> 6]; - b64 += b64chars[n & 63]; - b64 += "=="; - } else if (i === l) { // 2 bytes left - n = (bin[i] << 10) | (bin[i + 1] << 2); - b64 += b64chars[n >>> 12]; - b64 += b64chars[(n >>> 6) & 63]; - b64 += b64chars[n & 63]; - b64 += "="; - } - return b64; - } - - function convertBase64ToUTF8Array(b64) { - b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); - var bin = [], - padlen = b64.length % 4, - i, - l = b64.length, - n; - for (i = 0; i < l; i += 4) { - n = ((b64tab[b64.charAt(i)] || 0) << 18) | - ((b64tab[b64.charAt(i + 1)] || 0) << 12) | - ((b64tab[b64.charAt(i + 2)] || 0) << 6) | - ((b64tab[b64.charAt(i + 3)] || 0)); - bin.push( - (n >> 16), - ((n >> 8) & 0xff), - (n & 0xff) - ); - } - bin.length -= [0, 0, 2, 1][padlen]; - return bin; - } - - function convertUTF16ArrayToUTF8Array(uni) { - var bin = [], i, l = uni.length, n; - for (i = 0; i < l; i += 1) { - n = uni[i]; - if (n < 0x80) { - bin.push(n); - } else if (n < 0x800) { - bin.push( - 0xc0 | (n >>> 6), - 0x80 | (n & 0x3f) - ); - } else { - bin.push( - 0xe0 | ((n >>> 12) & 0x0f), - 0x80 | ((n >>> 6) & 0x3f), - 0x80 | (n & 0x3f) - ); - } - } - return bin; - } - - function convertUTF8ArrayToUTF16Array(bin) { - var uni = [], i, l = bin.length, - c0, c1, c2; - for (i = 0; i < l; i += 1) { - c0 = bin[i]; - if (c0 < 0x80) { - uni.push(c0); - } else { - i += 1; - c1 = bin[i]; - if (c0 < 0xe0) { - uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); - } else { - i += 1; - c2 = bin[i]; - uni.push(((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | - (c2 & 0x3f) - ); - } - } - } - return uni; - } - - function convertUTF8StringToBase64(bin) { - return convertUTF8ArrayToBase64(stringToArray(bin)); - } - - function convertBase64ToUTF8String(b64) { - return String.fromCharCode.apply(String, convertBase64ToUTF8Array(b64)); - } - - function convertUTF8StringToUTF16Array(bin) { - return convertUTF8ArrayToUTF16Array(stringToArray(bin)); - } - - function convertUTF8ArrayToUTF16String(bin) { - // this conversion is done in chunks to avoid a stack overflow in - // apply() - var b = convertUTF8ArrayToUTF16Array(bin), - r = "", - i = 0, - chunksize = 45000; - while (i < b.length) { - r += String.fromCharCode.apply(String, b.slice(i, i + chunksize)); - i += chunksize; - } - return r; - } - /** - * @param {!Array.|!string} bin - * @param {!number} i - * @param {!number} end - * @return {!string} - */ - function convertUTF8StringToUTF16String_internal(bin, i, end) { - var str = "", c0, c1, c2, j; - for (j = i; j < end; j += 1) { - c0 = bin.charCodeAt(j) & 0xff; - if (c0 < 0x80) { - str += String.fromCharCode(c0); - } else { - j += 1; - c1 = bin.charCodeAt(j) & 0xff; - if (c0 < 0xe0) { - str += String.fromCharCode(((c0 & 0x1f) << 6) | - (c1 & 0x3f)); - } else { - j += 1; - c2 = bin.charCodeAt(j) & 0xff; - str += String.fromCharCode(((c0 & 0x0f) << 12) | - ((c1 & 0x3f) << 6) | (c2 & 0x3f)); - } - } - } - return str; - } - - /** - * Convert a utf-8 array into a utf-16 string. - * The input array is treated as a list of values between 0 and 255. - * This function works with a callback and splits the work up in parts - * between which it yields to the main thread. - * After each part the progress is reported with the callback function that - * also passes a booleant that indicates if the job has finished. - * If the conversion should stop, the callback should return false. - * - * @param {!Array.|!string} bin - * @param {!function(!string, boolean):boolean} callback - * @return {undefined} - */ - function convertUTF8StringToUTF16String(bin, callback) { - var partsize = 100000, - numparts = bin.length / partsize, - str = "", - pos = 0; - if (bin.length < partsize) { - callback(convertUTF8StringToUTF16String_internal(bin, 0, - bin.length), true); - return; - } - // make a local copy if the input is a string, to avoid modification - if (typeof bin !== "string") { - bin = bin.slice(); - } - function f() { - var end = pos + partsize; - if (end > bin.length) { - end = bin.length; - } - str += convertUTF8StringToUTF16String_internal(bin, pos, end); - pos = end; - end = pos === bin.length; - if (callback(str, end) && !end) { - runtime.setTimeout(f, 0); - } - } - f(); - } - - function convertUTF16StringToUTF8Array(uni) { - return convertUTF16ArrayToUTF8Array(stringToArray(uni)); - } - - function convertUTF16ArrayToUTF8String(uni) { - return String.fromCharCode.apply(String, - convertUTF16ArrayToUTF8Array(uni)); - } - - function convertUTF16StringToUTF8String(uni) { - return String.fromCharCode.apply(String, - convertUTF16ArrayToUTF8Array(stringToArray(uni))); - } - - btoa = runtime.getWindow() && runtime.getWindow().btoa; - if (btoa) { - convertUTF16StringToBase64 = function (uni) { - return btoa(convertUTF16StringToUTF8String(uni)); - }; - } else { - btoa = convertUTF8StringToBase64; - convertUTF16StringToBase64 = function (uni) { - return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); - }; - } - atob = runtime.getWindow() && runtime.getWindow().atob; - if (atob) { - convertBase64ToUTF16String = function (b64) { - var b = atob(b64); - return convertUTF8StringToUTF16String_internal(b, 0, b.length); - }; - } else { - atob = convertBase64ToUTF8String; - convertBase64ToUTF16String = function (b64) { - return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); - }; - } - - /** - * @constructor - */ - function Base64() { - this.convertUTF8ArrayToBase64 = convertUTF8ArrayToBase64; - this.convertByteArrayToBase64 = convertUTF8ArrayToBase64; - this.convertBase64ToUTF8Array = convertBase64ToUTF8Array; - this.convertBase64ToByteArray = convertBase64ToUTF8Array; - this.convertUTF16ArrayToUTF8Array = convertUTF16ArrayToUTF8Array; - this.convertUTF16ArrayToByteArray = convertUTF16ArrayToUTF8Array; - this.convertUTF8ArrayToUTF16Array = convertUTF8ArrayToUTF16Array; - this.convertByteArrayToUTF16Array = convertUTF8ArrayToUTF16Array; - this.convertUTF8StringToBase64 = convertUTF8StringToBase64; - this.convertBase64ToUTF8String = convertBase64ToUTF8String; - this.convertUTF8StringToUTF16Array = convertUTF8StringToUTF16Array; - this.convertUTF8ArrayToUTF16String = convertUTF8ArrayToUTF16String; - this.convertByteArrayToUTF16String = convertUTF8ArrayToUTF16String; - this.convertUTF8StringToUTF16String = convertUTF8StringToUTF16String; - this.convertUTF16StringToUTF8Array = convertUTF16StringToUTF8Array; - this.convertUTF16StringToByteArray = convertUTF16StringToUTF8Array; - this.convertUTF16ArrayToUTF8String = convertUTF16ArrayToUTF8String; - this.convertUTF16StringToUTF8String = convertUTF16StringToUTF8String; - this.convertUTF16StringToBase64 = convertUTF16StringToBase64; - this.convertBase64ToUTF16String = convertBase64ToUTF16String; - this.fromBase64 = convertBase64ToUTF8String; - this.toBase64 = convertUTF8StringToBase64; - this.atob = atob; - this.btoa = btoa; - this.utob = convertUTF16StringToUTF8String; - this.btou = convertUTF8StringToUTF16String; - this.encode = convertUTF16StringToBase64; - this.encodeURI = function (u) { - return convertUTF16StringToBase64(u).replace(/[+\/]/g, - function (m0) { - return m0 === '+' ? '-' : '_'; - }).replace(/\\=+$/, ''); - }; - this.decode = function (a) { - return convertBase64ToUTF16String(a.replace(/[\-_]/g, - function (m0) { - return m0 === '-' ? '+' : '/'; - })); - }; - } - return Base64; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js deleted file mode 100644 index d8a9ddd73d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core*/ -/*jslint plusplus: true, bitwise: true */ -/** - * @constructor - * @param {!Runtime.ByteArray} data - */ -core.ByteArray = function ByteArray(data) { - "use strict"; - /** - * @type {!number} - */ - this.pos = 0; - /** - * @type {!Runtime.ByteArray} - */ - this.data = data; - /** - * @return {number} - */ - this.readUInt32LE = function () { - var data = this.data, - pos = (this.pos += 4); - return (data[--pos] << 24) | - (data[--pos] << 16) | - (data[--pos] << 8) | - data[--pos]; - }; - /** - * @return {number} - */ - this.readUInt16LE = function () { - var data = this.data, - pos = (this.pos += 2); - return (data[--pos] << 8) | data[--pos]; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js deleted file mode 100644 index a7838be3dc..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true*/ -/*jslint bitwise: true */ -/** - * @constructor - * @param {!string} encoding - */ -core.ByteArrayWriter = function ByteArrayWriter(encoding) { - "use strict"; - var self = this, - data = new runtime.ByteArray(0); - - /** - * @param {!core.ByteArrayWriter} writer - * @return {undefined} - */ - this.appendByteArrayWriter = function (writer) { - data = runtime.concatByteArrays(data, writer.getByteArray()); - }; - /** - * @param {!Runtime.ByteArray} array - * @return {undefined} - */ - this.appendByteArray = function (array) { - data = runtime.concatByteArrays(data, array); - }; - /** - * @param {!Array.} array - * @return {undefined} - */ - this.appendArray = function (array) { - data = runtime.concatByteArrays(data, - runtime.byteArrayFromArray(array)); - }; - /** - * @param {!number} value - * @return {undefined} - */ - this.appendUInt16LE = function (value) { - self.appendArray([value & 0xff, (value >> 8) & 0xff]); - }; - /** - * @param {!number} value - * @return {undefined} - */ - this.appendUInt32LE = function (value) { - self.appendArray([value & 0xff, (value >> 8) & 0xff, - (value >> 16) & 0xff, (value >> 24) & 0xff]); - }; - /** - * @param {!string} string - * @return {undefined} - */ - this.appendString = function (string) { - data = runtime.concatByteArrays(data, - runtime.byteArrayFromString(string, encoding)); - }; - /** - * @return {!number} - */ - this.getLength = function () { - return data.length; - }; - /** - * @return {!Runtime.ByteArray} - */ - this.getByteArray = function () { - return data; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js deleted file mode 100644 index d8f7965388..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, Node: true*/ -/** - * @class - * A cursor is a dom node that visually represents a cursor in a DOM tree. - * It should stay synchronized with the selection in the document. When - * there is only one collapsed selection range, a cursor should be shown at - * that point. - * - * Putting the cursor in the DOM tree modifies the DOM, so care should be taken - * to keep the selection consistent. If e.g. a selection is drawn over the - * cursor, and the cursor is updated to the selection, the cursor is removed - * from the DOM because the selection is not collapsed. This means that the - * offsets of the selection may have to be changed. - * - * When the selection is collapsed, the cursor is placed after the point of the - * selection and the selection will stay valid. However, if the cursor was - * placed in the DOM tree and was counted in the offset, the offset in the - * selection should be decreased by one. - * - * Even when the selection allows for a cursor, it might be desireable to hide - * the cursor by not letting it be part of the DOM. - * - * @constructor - * @param {Selection} selection The selection to which the cursor corresponds - * @param {Document} document The document in which the cursor is placed - */ -core.Cursor = function Cursor(selection, document) { - "use strict"; - var cursorns, - cursorNode; - cursorns = 'urn:webodf:names:cursor'; - cursorNode = document.createElementNS(cursorns, 'cursor'); - - function putCursorIntoTextNode(container, offset) { - var len, ref, textnode, parent; - parent = container.parentNode; - if (offset === 0) { - parent.insertBefore(cursorNode, container); - } else if (offset === container.length) { - parent.appendChild(cursorNode); - } else { - len = container.length; - ref = container.nextSibling; - textnode = document.createTextNode( - container.substringData(offset, len) - ); - container.deleteData(offset, len); - if (ref) { - parent.insertBefore(textnode, ref); - } else { - parent.appendChild(textnode); - } - parent.insertBefore(cursorNode, textnode); - } - } - function putCursorIntoContainer(container, offset) { - var node; - node = container.firstChild; - while (node && offset) { - node = node.nextSibling; - offset -= 1; - } - container.insertBefore(cursorNode, node); - } - function getPotentialParentOrNode(parent, node) { - var n = node; - while (n && n !== parent) { - n = n.parentNode; - } - return n || node; - } - function removeCursorFromSelectionRange(range, cursorpos) { - var cursorParent, start, end; - cursorParent = cursorNode.parentNode; - start = getPotentialParentOrNode(cursorNode, range.startContainer); - end = getPotentialParentOrNode(cursorNode, range.endContainer); - if (start === cursorNode) { - range.setStart(cursorParent, cursorpos); - } else if (start === cursorParent && - range.startOffset > cursorpos) { - range.setStart(cursorParent, range.startOffset - 1); - } - if (range.endContainer === cursorNode) { - range.setEnd(cursorParent, cursorpos); - } else if (range.endContainer === cursorParent && - range.endOffset > cursorpos) { - range.setEnd(cursorParent, range.endOffset - 1); - } - } - function adaptRangeToMergedText(range, prev, textnodetomerge, cursorpos) { - var diff = prev.length - textnodetomerge.length; - if (range.startContainer === textnodetomerge) { - range.setStart(prev, diff + range.startOffset); - } else if (range.startContainer === prev.parentNode && - range.startOffset === cursorpos) { - range.setStart(prev, diff); - } - if (range.endContainer === textnodetomerge) { - range.setEnd(prev, diff + range.endOffset); - } else if (range.endContainer === prev.parentNode && - range.endOffset === cursorpos) { - range.setEnd(prev, diff); - } - } - function removeCursor() { - // if the cursor is part of a selection, the selection must be adapted - var i, cursorpos, node, textnodetoremove, range; - // if the cursor has no parent, it is already not part of the document - // tree - if (!cursorNode.parentNode) { - return; - } - // find the position of the cursor in its parent - cursorpos = 0; - node = cursorNode.parentNode.firstChild; - while (node && node !== cursorNode) { - cursorpos += 1; - node = node.nextSibling; - } - // Check if removing the node will result in a merge of texts. - // This will happen if the cursor is between two text nodes. - // The text of the text node after the cursor is put in the text node - // before the cursor. The latter node is removed after the selection - // has been adapted. - if (cursorNode.previousSibling && - cursorNode.previousSibling.nodeType === 3 && // TEXT_NODE - cursorNode.nextSibling && - cursorNode.nextSibling.nodeType === 3) { // TEXT_NODE - textnodetoremove = cursorNode.nextSibling; - cursorNode.previousSibling.appendData(textnodetoremove.nodeValue); - } - // remove the node from the selections - for (i = 0; i < selection.rangeCount; i += 1) { - removeCursorFromSelectionRange(selection.getRangeAt(i), cursorpos); - } - // merge the texts that surround the cursor - if (textnodetoremove) { - for (i = 0; i < selection.rangeCount; i += 1) { - adaptRangeToMergedText(selection.getRangeAt(i), - cursorNode.previousSibling, textnodetoremove, cursorpos); - } - textnodetoremove.parentNode.removeChild(textnodetoremove); - } - cursorNode.parentNode.removeChild(cursorNode); - } - // put the cursor at a particular position - function putCursor(container, offset) { - if (container.nodeType === 3) { // TEXT_NODE - putCursorIntoTextNode(container, offset); - } else if (container.nodeType !== 9) { // DOCUMENT_NODE - putCursorIntoContainer(container, offset); - } - } - /** - * Obtain the node representing the cursor. - * @return {Element} - */ - this.getNode = function () { - return cursorNode; - }; - /** - * Synchronize the cursor with the current selection. - * If there is a single collapsed selection range, the cursor will be placed - * there. If not, the cursor will be removed from the document tree. - * @return {undefined} - */ - this.updateToSelection = function () { - var range; - removeCursor(); - if (selection.focusNode) { - putCursor(selection.focusNode, selection.focusOffset); - } - }; - /** - * Remove the cursor from the document tree. - * @return {undefined} - */ - this.remove = function () { - removeCursor(); - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js deleted file mode 100644 index b3e422ef59..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js +++ /dev/null @@ -1,6403 +0,0 @@ -// jslint.js -// 2012-04-15 - -// Copyright (c) 2002 Douglas Crockford (www.JSLint.com) - -// 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 shall be used for Good, not Evil. - -// 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. - -// WARNING: JSLint will hurt your feelings. - -// JSLINT is a global function. It takes two parameters. - -// var myResult = JSLINT(source, option); - -// The first parameter is either a string or an array of strings. If it is a -// string, it will be split on '\n' or '\r'. If it is an array of strings, it -// is assumed that each string represents one line. The source can be a -// JavaScript text, or HTML text, or a JSON text, or a CSS text. - -// The second parameter is an optional object of options that control the -// operation of JSLINT. Most of the options are booleans: They are all -// optional and have a default value of false. One of the options, predef, -// can be an array of names, which will be used to declare global variables, -// or an object whose keys are used as global names, with a boolean value -// that determines if they are assignable. - -// If it checks out, JSLINT returns true. Otherwise, it returns false. - -// If false, you can inspect JSLINT.errors to find out the problems. -// JSLINT.errors is an array of objects containing these properties: - -// { -// line : The line (relative to 0) at which the lint was found -// character : The character (relative to 0) at which the lint was found -// reason : The problem -// evidence : The text line in which the problem occurred -// raw : The raw message before the details were inserted -// a : The first detail -// b : The second detail -// c : The third detail -// d : The fourth detail -// } - -// If a stopping error was found, a null will be the last element of the -// JSLINT.errors array. A stopping error means that JSLint was not confident -// enough to continue. It does not necessarily mean that the error was -// especially heinous. - -// You can request a Function Report, which shows all of the functions -// and the parameters and vars that they use. This can be used to find -// implied global variables and other problems. The report is in HTML and -// can be inserted in an HTML . - -// var myReport = JSLINT.report(errors_only); - -// If errors_only is true, then the report will be limited to only errors. - -// You can request a data structure that contains JSLint's results. - -// var myData = JSLINT.data(); - -// It returns a structure with this form: - -// { -// errors: [ -// { -// line: NUMBER, -// character: NUMBER, -// reason: STRING, -// evidence: STRING -// } -// ], -// functions: [ -// { -// name: STRING, -// line: NUMBER, -// last: NUMBER, -// params: [ -// { -// string: STRING -// } -// ], -// closure: [ -// STRING -// ], -// var: [ -// STRING -// ], -// exception: [ -// STRING -// ], -// outer: [ -// STRING -// ], -// unused: [ -// STRING -// ], -// undef: [ -// STRING -// ], -// global: [ -// STRING -// ], -// label: [ -// STRING -// ] -// } -// ], -// globals: [ -// STRING -// ], -// member: { -// STRING: NUMBER -// }, -// urls: [ -// STRING -// ], -// json: BOOLEAN -// } - -// Empty arrays will not be included. - -// You can obtain the parse tree that JSLint constructed while parsing. The -// latest tree is kept in JSLINT.tree. A nice stringication can be produced -// with - -// JSON.stringify(JSLINT.tree, [ -// 'string', 'arity', 'name', 'first', -// 'second', 'third', 'block', 'else' -// ], 4)); - -// JSLint provides three directives. They look like slashstar comments, and -// allow for setting options, declaring global variables, and establishing a -// set of allowed property names. - -// These directives respect function scope. - -// The jslint directive is a special comment that can set one or more options. -// The current option set is - -// anon true, if the space may be omitted in anonymous function declarations -// bitwise true, if bitwise operators should be allowed -// browser true, if the standard browser globals should be predefined -// cap true, if upper case HTML should be allowed -// 'continue' true, if the continuation statement should be tolerated -// css true, if CSS workarounds should be tolerated -// debug true, if debugger statements should be allowed -// devel true, if logging should be allowed (console, alert, etc.) -// eqeq true, if == should be allowed -// es5 true, if ES5 syntax should be allowed -// evil true, if eval should be allowed -// forin true, if for in statements need not filter -// fragment true, if HTML fragments should be allowed -// indent the indentation factor -// maxerr the maximum number of errors to allow -// maxlen the maximum length of a source line -// newcap true, if constructor names capitalization is ignored -// node true, if Node.js globals should be predefined -// nomen true, if names may have dangling _ -// on true, if HTML event handlers should be allowed -// passfail true, if the scan should stop on first error -// plusplus true, if increment/decrement should be allowed -// properties true, if all property names must be declared with /*properties*/ -// regexp true, if the . should be allowed in regexp literals -// rhino true, if the Rhino environment globals should be predefined -// undef true, if variables can be declared out of order -// unparam true, if unused parameters should be tolerated -// sloppy true, if the 'use strict'; pragma is optional -// stupid true, if really stupid practices are tolerated -// sub true, if all forms of subscript notation are tolerated -// vars true, if multiple var statements per function should be allowed -// white true, if sloppy whitespace is tolerated -// widget true if the Yahoo Widgets globals should be predefined -// windows true, if MS Windows-specific globals should be predefined - -// For example: - -/*jslint - evil: true, nomen: true, regexp: true -*/ - -// The properties directive declares an exclusive list of property names. -// Any properties named in the program that are not in the list will -// produce a warning. - -// For example: - -/*properties - '\b', '\t', '\n', '\f', '\r', '!', '!=', '!==', '"', '%', '\'', - '(arguments)', '(begin)', '(breakage)', '(context)', '(error)', - '(identifier)', '(line)', '(loopage)', '(name)', '(params)', '(scope)', - '(token)', '(vars)', '(verb)', '*', '+', '-', '/', '<', '<=', '==', - '===', '>', '>=', ADSAFE, Array, Date, Function, Object, '\\', a, - a_label, a_not_allowed, a_not_defined, a_scope, abbr, acronym, address, - adsafe, adsafe_a, adsafe_autocomplete, adsafe_bad_id, adsafe_div, - adsafe_fragment, adsafe_go, adsafe_html, adsafe_id, adsafe_id_go, adsafe_lib, - adsafe_lib_second, adsafe_missing_id, adsafe_name_a, adsafe_placement, - adsafe_prefix_a, adsafe_script, adsafe_source, adsafe_subscript_a, - adsafe_tag, all, already_defined, and, anon, applet, apply, approved, area, - arity, article, aside, assign, assign_exception, - assignment_function_expression, at, attribute_case_a, audio, autocomplete, - avoid_a, b, background, 'background-attachment', 'background-color', - 'background-image', 'background-position', 'background-repeat', - bad_assignment, bad_color_a, bad_constructor, bad_entity, bad_html, bad_id_a, - bad_in_a, bad_invocation, bad_name_a, bad_new, bad_number, bad_operand, - bad_style, bad_type, bad_url_a, bad_wrap, base, bdo, big, bitwise, block, - blockquote, body, border, 'border-bottom', 'border-bottom-color', - 'border-bottom-left-radius', 'border-bottom-right-radius', - 'border-bottom-style', 'border-bottom-width', 'border-collapse', - 'border-color', 'border-left', 'border-left-color', 'border-left-style', - 'border-left-width', 'border-radius', 'border-right', 'border-right-color', - 'border-right-style', 'border-right-width', 'border-spacing', 'border-style', - 'border-top', 'border-top-color', 'border-top-left-radius', - 'border-top-right-radius', 'border-top-style', 'border-top-width', - 'border-width', bottom, br, braille, browser, button, c, call, canvas, cap, - caption, 'caption-side', center, charAt, charCodeAt, character, cite, clear, - clip, closure, cm, code, col, colgroup, color, combine_var, command, - conditional_assignment, confusing_a, confusing_regexp, constructor_name_a, - content, continue, control_a, 'counter-increment', 'counter-reset', create, - css, cursor, d, dangerous_comment, dangling_a, data, datalist, dd, debug, - del, deleted, details, devel, dfn, dialog, dir, direction, display, disrupt, - div, dl, dt, duplicate_a, edge, edition, else, em, embed, embossed, empty, - 'empty-cells', empty_block, empty_case, empty_class, entityify, eqeq, errors, - es5, eval, evidence, evil, ex, exception, exec, expected_a, - expected_a_at_b_c, expected_a_b, expected_a_b_from_c_d, expected_at_a, - expected_attribute_a, expected_attribute_value_a, expected_class_a, - expected_fraction_a, expected_id_a, expected_identifier_a, - expected_identifier_a_reserved, expected_lang_a, expected_linear_a, - expected_media_a, expected_name_a, expected_nonstandard_style_attribute, - expected_number_a, expected_operator_a, expected_percent_a, - expected_positive_a, expected_pseudo_a, expected_selector_a, - expected_small_a, expected_space_a_b, expected_string_a, - expected_style_attribute, expected_style_pattern, expected_tagname_a, - expected_type_a, f, fieldset, figure, filter, first, flag, float, floor, - font, 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', - 'font-style', 'font-variant', 'font-weight', footer, forEach, for_if, forin, - form, fragment, frame, frameset, from, fromCharCode, fud, funct, function, - function_block, function_eval, function_loop, function_statement, - function_strict, functions, global, globals, h1, h2, h3, h4, h5, h6, - handheld, hasOwnProperty, head, header, height, hgroup, hr, - 'hta:application', html, html_confusion_a, html_handlers, i, id, identifier, - identifier_function, iframe, img, immed, implied_evil, in, indent, indexOf, - infix_in, init, input, ins, insecure_a, isAlpha, isArray, isDigit, isNaN, - join, jslint, json, kbd, keygen, keys, label, labeled, lang, lbp, - leading_decimal_a, led, left, legend, length, 'letter-spacing', li, lib, - line, 'line-height', link, 'list-style', 'list-style-image', - 'list-style-position', 'list-style-type', map, margin, 'margin-bottom', - 'margin-left', 'margin-right', 'margin-top', mark, 'marker-offset', match, - 'max-height', 'max-width', maxerr, maxlen, member, menu, message, meta, - meter, 'min-height', 'min-width', missing_a, missing_a_after_b, - missing_option, missing_property, missing_space_a_b, missing_url, - missing_use_strict, mixed, mm, mode, move_invocation, move_var, n, name, - name_function, nav, nested_comment, newcap, node, noframes, nomen, noscript, - not, not_a_constructor, not_a_defined, not_a_function, not_a_label, - not_a_scope, not_greater, nud, number, object, octal_a, ol, on, opacity, - open, optgroup, option, outer, outline, 'outline-color', 'outline-style', - 'outline-width', output, overflow, 'overflow-x', 'overflow-y', p, padding, - 'padding-bottom', 'padding-left', 'padding-right', 'padding-top', - 'page-break-after', 'page-break-before', param, parameter_a_get_b, - parameter_arguments_a, parameter_set_a, params, paren, parent, passfail, pc, - plusplus, pop, position, postscript, pre, predef, print, progress, - projection, properties, prototype, pt, push, px, q, quote, quotes, r, radix, - range, raw, read_only, reason, redefinition_a, regexp, replace, report, - reserved, reserved_a, rhino, right, rp, rt, ruby, safe, samp, scanned_a_b, - screen, script, search, second, section, select, shift, slash_equal, slice, - sloppy, small, sort, source, span, speech, split, src, statement_block, - stopping, strange_loop, strict, string, strong, stupid, style, styleproperty, - sub, subscript, substr, sup, supplant, sync_a, t, table, 'table-layout', - tag_a_in_b, tbody, td, test, 'text-align', 'text-decoration', 'text-indent', - 'text-shadow', 'text-transform', textarea, tfoot, th, thead, third, thru, - time, title, toLowerCase, toString, toUpperCase, token, too_long, too_many, - top, tr, trailing_decimal_a, tree, tt, tty, tv, type, u, ul, unclosed, - unclosed_comment, unclosed_regexp, undef, undefined, unescaped_a, - unexpected_a, unexpected_char_a_b, unexpected_comment, unexpected_else, - unexpected_label_a, unexpected_property_a, unexpected_space_a_b, - 'unicode-bidi', unnecessary_initialize, unnecessary_use, unparam, - unreachable_a_b, unrecognized_style_attribute_a, unrecognized_tag_a, unsafe, - unused, url, urls, use_array, use_braces, use_charAt, use_object, use_or, - use_param, used_before_a, var, var_a_not, vars, 'vertical-align', video, - visibility, was, weird_assignment, weird_condition, weird_new, weird_program, - weird_relation, weird_ternary, white, 'white-space', widget, width, windows, - 'word-spacing', 'word-wrap', wrap, wrap_immediate, wrap_regexp, - write_is_wrong, writeable, 'z-index' -*/ - -// The global directive is used to declare global variables that can -// be accessed by the program. If a declaration is true, then the variable -// is writeable. Otherwise, it is read-only. - -// We build the application inside a function so that we produce only a single -// global variable. That function will be invoked immediately, and its return -// value is the JSLINT function itself. That function is also an object that -// can contain data and other functions. - -var JSLINT = (function () { - 'use strict'; - - function array_to_object(array, value) { - -// Make an object from an array of keys and a common value. - - var i, length = array.length, object = {}; - for (i = 0; i < length; i += 1) { - object[array[i]] = value; - } - return object; - } - - - var adsafe_id, // The widget's ADsafe id. - adsafe_may, // The widget may load approved scripts. - adsafe_top, // At the top of the widget script. - adsafe_went, // ADSAFE.go has been called. - allowed_option = { - anon : true, - bitwise : true, - browser : true, - cap : true, - 'continue': true, - css : true, - debug : true, - devel : true, - eqeq : true, - es5 : true, - evil : true, - forin : true, - fragment : true, - indent : 10, - maxerr : 1000, - maxlen : 256, - newcap : true, - node : true, - nomen : true, - on : true, - passfail : true, - plusplus : true, - properties: true, - regexp : true, - rhino : true, - undef : true, - unparam : true, - sloppy : true, - stupid : true, - sub : true, - vars : true, - white : true, - widget : true, - windows : true - }, - anonname, // The guessed name for anonymous functions. - approved, // ADsafe approved urls. - -// These are operators that should not be used with the ! operator. - - bang = { - '<' : true, - '<=' : true, - '==' : true, - '===': true, - '!==': true, - '!=' : true, - '>' : true, - '>=' : true, - '+' : true, - '-' : true, - '*' : true, - '/' : true, - '%' : true - }, - -// These are property names that should not be permitted in the safe subset. - - banned = array_to_object([ - 'arguments', 'callee', 'caller', 'constructor', 'eval', 'prototype', - 'stack', 'unwatch', 'valueOf', 'watch' - ], true), - begin, // The root token - -// browser contains a set of global names that are commonly provided by a -// web browser environment. - - browser = array_to_object([ - 'clearInterval', 'clearTimeout', 'document', 'event', 'FormData', - 'frames', 'history', 'Image', 'localStorage', 'location', 'name', - 'navigator', 'Option', 'parent', 'screen', 'sessionStorage', - 'setInterval', 'setTimeout', 'Storage', 'window', 'XMLHttpRequest' - ], false), - -// bundle contains the text messages. - - bundle = { - a_label: "'{a}' is a statement label.", - a_not_allowed: "'{a}' is not allowed.", - a_not_defined: "'{a}' is not defined.", - a_scope: "'{a}' used out of scope.", - adsafe_a: "ADsafe violation: '{a}'.", - adsafe_autocomplete: "ADsafe autocomplete violation.", - adsafe_bad_id: "ADSAFE violation: bad id.", - adsafe_div: "ADsafe violation: Wrap the widget in a div.", - adsafe_fragment: "ADSAFE: Use the fragment option.", - adsafe_go: "ADsafe violation: Misformed ADSAFE.go.", - adsafe_html: "Currently, ADsafe does not operate on whole HTML " + - "documents. It operates on
    fragments and .js files.", - adsafe_id: "ADsafe violation: id does not match.", - adsafe_id_go: "ADsafe violation: Missing ADSAFE.id or ADSAFE.go.", - adsafe_lib: "ADsafe lib violation.", - adsafe_lib_second: "ADsafe: The second argument to lib must be a function.", - adsafe_missing_id: "ADSAFE violation: missing ID_.", - adsafe_name_a: "ADsafe name violation: '{a}'.", - adsafe_placement: "ADsafe script placement violation.", - adsafe_prefix_a: "ADsafe violation: An id must have a '{a}' prefix", - adsafe_script: "ADsafe script violation.", - adsafe_source: "ADsafe unapproved script source.", - adsafe_subscript_a: "ADsafe subscript '{a}'.", - adsafe_tag: "ADsafe violation: Disallowed tag '{a}'.", - already_defined: "'{a}' is already defined.", - and: "The '&&' subexpression should be wrapped in parens.", - assign_exception: "Do not assign to the exception parameter.", - assignment_function_expression: "Expected an assignment or " + - "function call and instead saw an expression.", - attribute_case_a: "Attribute '{a}' not all lower case.", - avoid_a: "Avoid '{a}'.", - bad_assignment: "Bad assignment.", - bad_color_a: "Bad hex color '{a}'.", - bad_constructor: "Bad constructor.", - bad_entity: "Bad entity.", - bad_html: "Bad HTML string", - bad_id_a: "Bad id: '{a}'.", - bad_in_a: "Bad for in variable '{a}'.", - bad_invocation: "Bad invocation.", - bad_name_a: "Bad name: '{a}'.", - bad_new: "Do not use 'new' for side effects.", - bad_number: "Bad number '{a}'.", - bad_operand: "Bad operand.", - bad_style: "Bad style.", - bad_type: "Bad type.", - bad_url_a: "Bad url '{a}'.", - bad_wrap: "Do not wrap function literals in parens unless they " + - "are to be immediately invoked.", - combine_var: "Combine this with the previous 'var' statement.", - conditional_assignment: "Expected a conditional expression and " + - "instead saw an assignment.", - confusing_a: "Confusing use of '{a}'.", - confusing_regexp: "Confusing regular expression.", - constructor_name_a: "A constructor name '{a}' should start with " + - "an uppercase letter.", - control_a: "Unexpected control character '{a}'.", - css: "A css file should begin with @charset 'UTF-8';", - dangling_a: "Unexpected dangling '_' in '{a}'.", - dangerous_comment: "Dangerous comment.", - deleted: "Only properties should be deleted.", - duplicate_a: "Duplicate '{a}'.", - empty_block: "Empty block.", - empty_case: "Empty case.", - empty_class: "Empty class.", - es5: "This is an ES5 feature.", - evil: "eval is evil.", - expected_a: "Expected '{a}'.", - expected_a_b: "Expected '{a}' and instead saw '{b}'.", - expected_a_b_from_c_d: "Expected '{a}' to match '{b}' from line " + - "{c} and instead saw '{d}'.", - expected_at_a: "Expected an at-rule, and instead saw @{a}.", - expected_a_at_b_c: "Expected '{a}' at column {b}, not column {c}.", - expected_attribute_a: "Expected an attribute, and instead saw [{a}].", - expected_attribute_value_a: "Expected an attribute value and " + - "instead saw '{a}'.", - expected_class_a: "Expected a class, and instead saw .{a}.", - expected_fraction_a: "Expected a number between 0 and 1 and " + - "instead saw '{a}'", - expected_id_a: "Expected an id, and instead saw #{a}.", - expected_identifier_a: "Expected an identifier and instead saw '{a}'.", - expected_identifier_a_reserved: "Expected an identifier and " + - "instead saw '{a}' (a reserved word).", - expected_linear_a: "Expected a linear unit and instead saw '{a}'.", - expected_lang_a: "Expected a lang code, and instead saw :{a}.", - expected_media_a: "Expected a CSS media type, and instead saw '{a}'.", - expected_name_a: "Expected a name and instead saw '{a}'.", - expected_nonstandard_style_attribute: "Expected a non-standard " + - "style attribute and instead saw '{a}'.", - expected_number_a: "Expected a number and instead saw '{a}'.", - expected_operator_a: "Expected an operator and instead saw '{a}'.", - expected_percent_a: "Expected a percentage and instead saw '{a}'", - expected_positive_a: "Expected a positive number and instead saw '{a}'", - expected_pseudo_a: "Expected a pseudo, and instead saw :{a}.", - expected_selector_a: "Expected a CSS selector, and instead saw {a}.", - expected_small_a: "Expected a small positive integer and instead saw '{a}'", - expected_space_a_b: "Expected exactly one space between '{a}' and '{b}'.", - expected_string_a: "Expected a string and instead saw {a}.", - expected_style_attribute: "Excepted a style attribute, and instead saw '{a}'.", - expected_style_pattern: "Expected a style pattern, and instead saw '{a}'.", - expected_tagname_a: "Expected a tagName, and instead saw {a}.", - expected_type_a: "Expected a type, and instead saw {a}.", - for_if: "The body of a for in should be wrapped in an if " + - "statement to filter unwanted properties from the prototype.", - function_block: "Function statements should not be placed in blocks. " + - "Use a function expression or move the statement to the top of " + - "the outer function.", - function_eval: "The Function constructor is eval.", - function_loop: "Don't make functions within a loop.", - function_statement: "Function statements are not invocable. " + - "Wrap the whole function invocation in parens.", - function_strict: "Use the function form of 'use strict'.", - html_confusion_a: "HTML confusion in regular expression '<{a}'.", - html_handlers: "Avoid HTML event handlers.", - identifier_function: "Expected an identifier in an assignment " + - "and instead saw a function invocation.", - implied_evil: "Implied eval is evil. Pass a function instead of a string.", - infix_in: "Unexpected 'in'. Compare with undefined, or use the " + - "hasOwnProperty method instead.", - insecure_a: "Insecure '{a}'.", - isNaN: "Use the isNaN function to compare with NaN.", - lang: "lang is deprecated.", - leading_decimal_a: "A leading decimal point can be confused with a dot: '.{a}'.", - missing_a: "Missing '{a}'.", - missing_a_after_b: "Missing '{a}' after '{b}'.", - missing_option: "Missing option value.", - missing_property: "Missing property name.", - missing_space_a_b: "Missing space between '{a}' and '{b}'.", - missing_url: "Missing url.", - missing_use_strict: "Missing 'use strict' statement.", - mixed: "Mixed spaces and tabs.", - move_invocation: "Move the invocation into the parens that " + - "contain the function.", - move_var: "Move 'var' declarations to the top of the function.", - name_function: "Missing name in function statement.", - nested_comment: "Nested comment.", - not: "Nested not.", - not_a_constructor: "Do not use {a} as a constructor.", - not_a_defined: "'{a}' has not been fully defined yet.", - not_a_function: "'{a}' is not a function.", - not_a_label: "'{a}' is not a label.", - not_a_scope: "'{a}' is out of scope.", - not_greater: "'{a}' should not be greater than '{b}'.", - octal_a: "Don't use octal: '{a}'. Use '\\u....' instead.", - parameter_arguments_a: "Do not mutate parameter '{a}' when using 'arguments'.", - parameter_a_get_b: "Unexpected parameter '{a}' in get {b} function.", - parameter_set_a: "Expected parameter (value) in set {a} function.", - radix: "Missing radix parameter.", - read_only: "Read only.", - redefinition_a: "Redefinition of '{a}'.", - reserved_a: "Reserved name '{a}'.", - scanned_a_b: "{a} ({b}% scanned).", - slash_equal: "A regular expression literal can be confused with '/='.", - statement_block: "Expected to see a statement and instead saw a block.", - stopping: "Stopping. ", - strange_loop: "Strange loop.", - strict: "Strict violation.", - subscript: "['{a}'] is better written in dot notation.", - sync_a: "Unexpected sync method: '{a}'.", - tag_a_in_b: "A '<{a}>' must be within '<{b}>'.", - too_long: "Line too long.", - too_many: "Too many errors.", - trailing_decimal_a: "A trailing decimal point can be confused " + - "with a dot: '.{a}'.", - type: "type is unnecessary.", - unclosed: "Unclosed string.", - unclosed_comment: "Unclosed comment.", - unclosed_regexp: "Unclosed regular expression.", - unescaped_a: "Unescaped '{a}'.", - unexpected_a: "Unexpected '{a}'.", - unexpected_char_a_b: "Unexpected character '{a}' in {b}.", - unexpected_comment: "Unexpected comment.", - unexpected_else: "Unexpected 'else' after 'return'.", - unexpected_label_a: "Unexpected label '{a}'.", - unexpected_property_a: "Unexpected /*property*/ '{a}'.", - unexpected_space_a_b: "Unexpected space between '{a}' and '{b}'.", - unnecessary_initialize: "It is not necessary to initialize '{a}' " + - "to 'undefined'.", - unnecessary_use: "Unnecessary 'use strict'.", - unreachable_a_b: "Unreachable '{a}' after '{b}'.", - unrecognized_style_attribute_a: "Unrecognized style attribute '{a}'.", - unrecognized_tag_a: "Unrecognized tag '<{a}>'.", - unsafe: "Unsafe character.", - url: "JavaScript URL.", - use_array: "Use the array literal notation [].", - use_braces: "Spaces are hard to count. Use {{a}}.", - use_charAt: "Use the charAt method.", - use_object: "Use the object literal notation {}.", - use_or: "Use the || operator.", - use_param: "Use a named parameter.", - used_before_a: "'{a}' was used before it was defined.", - var_a_not: "Variable {a} was not declared correctly.", - weird_assignment: "Weird assignment.", - weird_condition: "Weird condition.", - weird_new: "Weird construction. Delete 'new'.", - weird_program: "Weird program.", - weird_relation: "Weird relation.", - weird_ternary: "Weird ternary.", - wrap_immediate: "Wrap an immediate function invocation in parentheses " + - "to assist the reader in understanding that the expression " + - "is the result of a function, and not the function itself.", - wrap_regexp: "Wrap the /regexp/ literal in parens to " + - "disambiguate the slash operator.", - write_is_wrong: "document.write can be a form of eval." - }, - comments_off, - css_attribute_data, - css_any, - - css_colorData = array_to_object([ - "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", - "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", - "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", - "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", - "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", - "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", - "darkred", "darksalmon", "darkseagreen", "darkslateblue", - "darkslategray", "darkturquoise", "darkviolet", "deeppink", - "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", - "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", - "goldenrod", "gray", "green", "greenyellow", "honeydew", "hotpink", - "indianred", "indigo", "ivory", "khaki", "lavender", - "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", - "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgreen", - "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", - "lightslategray", "lightsteelblue", "lightyellow", "lime", - "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", - "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", - "mediumslateblue", "mediumspringgreen", "mediumturquoise", - "mediumvioletred", "midnightblue", "mintcream", "mistyrose", - "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", - "orange", "orangered", "orchid", "palegoldenrod", "palegreen", - "paleturquoise", "palevioletred", "papayawhip", "peachpuff", - "peru", "pink", "plum", "powderblue", "purple", "red", "rosybrown", - "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", - "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", - "snow", "springgreen", "steelblue", "tan", "teal", "thistle", - "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", - "yellow", "yellowgreen", - - "activeborder", "activecaption", "appworkspace", "background", - "buttonface", "buttonhighlight", "buttonshadow", "buttontext", - "captiontext", "graytext", "highlight", "highlighttext", - "inactiveborder", "inactivecaption", "inactivecaptiontext", - "infobackground", "infotext", "menu", "menutext", "scrollbar", - "threeddarkshadow", "threedface", "threedhighlight", - "threedlightshadow", "threedshadow", "window", "windowframe", - "windowtext" - ], true), - - css_border_style, - css_break, - - css_lengthData = { - '%': true, - 'cm': true, - 'em': true, - 'ex': true, - 'in': true, - 'mm': true, - 'pc': true, - 'pt': true, - 'px': true - }, - - css_media, - css_overflow, - - descapes = { - 'b': '\b', - 't': '\t', - 'n': '\n', - 'f': '\f', - 'r': '\r', - '"': '"', - '/': '/', - '\\': '\\', - '!': '!' - }, - - devel = array_to_object([ - 'alert', 'confirm', 'console', 'Debug', 'opera', 'prompt', 'WSH' - ], false), - directive, - escapes = { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\'': '\\\'', - '"' : '\\"', - '/' : '\\/', - '\\': '\\\\' - }, - - funct, // The current function, including the labels used in - // the function, as well as (breakage), - // (context), (loopage), (name), (params), (token), - // (vars), (verb) - - functionicity = [ - 'closure', 'exception', 'global', 'label', 'outer', 'undef', - 'unused', 'var' - ], - - functions, // All of the functions - global_funct, // The global body - global_scope, // The global scope - html_tag = { - a: {}, - abbr: {}, - acronym: {}, - address: {}, - applet: {}, - area: {empty: true, parent: ' map '}, - article: {}, - aside: {}, - audio: {}, - b: {}, - base: {empty: true, parent: ' head '}, - bdo: {}, - big: {}, - blockquote: {}, - body: {parent: ' html noframes '}, - br: {empty: true}, - button: {}, - canvas: {parent: ' body p div th td '}, - caption: {parent: ' table '}, - center: {}, - cite: {}, - code: {}, - col: {empty: true, parent: ' table colgroup '}, - colgroup: {parent: ' table '}, - command: {parent: ' menu '}, - datalist: {}, - dd: {parent: ' dl '}, - del: {}, - details: {}, - dialog: {}, - dfn: {}, - dir: {}, - div: {}, - dl: {}, - dt: {parent: ' dl '}, - em: {}, - embed: {}, - fieldset: {}, - figure: {}, - font: {}, - footer: {}, - form: {}, - frame: {empty: true, parent: ' frameset '}, - frameset: {parent: ' html frameset '}, - h1: {}, - h2: {}, - h3: {}, - h4: {}, - h5: {}, - h6: {}, - head: {parent: ' html '}, - header: {}, - hgroup: {}, - hr: {empty: true}, - 'hta:application': - {empty: true, parent: ' head '}, - html: {parent: '*'}, - i: {}, - iframe: {}, - img: {empty: true}, - input: {empty: true}, - ins: {}, - kbd: {}, - keygen: {}, - label: {}, - legend: {parent: ' details fieldset figure '}, - li: {parent: ' dir menu ol ul '}, - link: {empty: true, parent: ' head '}, - map: {}, - mark: {}, - menu: {}, - meta: {empty: true, parent: ' head noframes noscript '}, - meter: {}, - nav: {}, - noframes: {parent: ' html body '}, - noscript: {parent: ' body head noframes '}, - object: {}, - ol: {}, - optgroup: {parent: ' select '}, - option: {parent: ' optgroup select '}, - output: {}, - p: {}, - param: {empty: true, parent: ' applet object '}, - pre: {}, - progress: {}, - q: {}, - rp: {}, - rt: {}, - ruby: {}, - samp: {}, - script: {empty: true, parent: ' body div frame head iframe p pre span '}, - section: {}, - select: {}, - small: {}, - span: {}, - source: {}, - strong: {}, - style: {parent: ' head ', empty: true}, - sub: {}, - sup: {}, - table: {}, - tbody: {parent: ' table '}, - td: {parent: ' tr '}, - textarea: {}, - tfoot: {parent: ' table '}, - th: {parent: ' tr '}, - thead: {parent: ' table '}, - time: {}, - title: {parent: ' head '}, - tr: {parent: ' table tbody thead tfoot '}, - tt: {}, - u: {}, - ul: {}, - 'var': {}, - video: {} - }, - - ids, // HTML ids - in_block, - indent, - itself, // JSLint itself - json_mode, - lex, // the tokenizer - lines, - lookahead, - node = array_to_object([ - 'Buffer', 'clearInterval', 'clearTimeout', 'console', 'exports', - 'global', 'module', 'process', 'querystring', 'require', - 'setInterval', 'setTimeout', '__dirname', '__filename' - ], false), - node_js, - numbery = array_to_object(['indexOf', 'lastIndexOf', 'search'], true), - next_token, - option, - predefined, // Global variables defined by option - prereg, - prev_token, - property, - regexp_flag = array_to_object(['g', 'i', 'm'], true), - return_this = function return_this() { - return this; - }, - rhino = array_to_object([ - 'defineClass', 'deserialize', 'gc', 'help', 'load', 'loadClass', - 'print', 'quit', 'readFile', 'readUrl', 'runCommand', 'seal', - 'serialize', 'spawn', 'sync', 'toint32', 'version' - ], false), - - scope, // An object containing an object for each variable in scope - semicolon_coda = array_to_object([';', '"', '\'', ')'], true), - src, - stack, - -// standard contains the global names that are provided by the -// ECMAScript standard. - - standard = array_to_object([ - 'Array', 'Boolean', 'Date', 'decodeURI', 'decodeURIComponent', - 'encodeURI', 'encodeURIComponent', 'Error', 'eval', 'EvalError', - 'Function', 'isFinite', 'isNaN', 'JSON', 'Math', 'Number', - 'Object', 'parseInt', 'parseFloat', 'RangeError', 'ReferenceError', - 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError' - ], false), - - strict_mode, - syntax = {}, - tab, - token, - urls, - var_mode, - warnings, - -// widget contains the global names which are provided to a Yahoo -// (fna Konfabulator) widget. - - widget = array_to_object([ - 'alert', 'animator', 'appleScript', 'beep', 'bytesToUIString', - 'Canvas', 'chooseColor', 'chooseFile', 'chooseFolder', - 'closeWidget', 'COM', 'convertPathToHFS', 'convertPathToPlatform', - 'CustomAnimation', 'escape', 'FadeAnimation', 'filesystem', 'Flash', - 'focusWidget', 'form', 'FormField', 'Frame', 'HotKey', 'Image', - 'include', 'isApplicationRunning', 'iTunes', 'konfabulatorVersion', - 'log', 'md5', 'MenuItem', 'MoveAnimation', 'openURL', 'play', - 'Point', 'popupMenu', 'preferenceGroups', 'preferences', 'print', - 'prompt', 'random', 'Rectangle', 'reloadWidget', 'ResizeAnimation', - 'resolvePath', 'resumeUpdates', 'RotateAnimation', 'runCommand', - 'runCommandInBg', 'saveAs', 'savePreferences', 'screen', - 'ScrollBar', 'showWidgetPreferences', 'sleep', 'speak', 'Style', - 'suppressUpdates', 'system', 'tellWidget', 'Text', 'TextArea', - 'Timer', 'unescape', 'updateNow', 'URL', 'Web', 'widget', 'Window', - 'XMLDOM', 'XMLHttpRequest', 'yahooCheckLogin', 'yahooLogin', - 'yahooLogout' - ], true), - - windows = array_to_object([ - 'ActiveXObject', 'CScript', 'Debug', 'Enumerator', 'System', - 'VBArray', 'WScript', 'WSH' - ], false), - -// xmode is used to adapt to the exceptions in html parsing. -// It can have these states: -// '' .js script file -// 'html' -// 'outer' -// 'script' -// 'style' -// 'scriptstring' -// 'styleproperty' - - xmode, - xquote, - -// Regular expressions. Some of these are stupidly long. - -// unsafe comment or string - ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i, -// carriage return, carriage return linefeed, or linefeed - crlfx = /\r\n?|\n/, -// unsafe characters that are silently deleted by one or more browsers - cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, -// query characters for ids - dx = /[\[\]\/\\"'*<>.&:(){}+=#]/, -// html token - hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-:]*|[0-9]+|--)/, -// identifier - ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/, -// javascript url - jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i, -// star slash - lx = /\*\/|\/\*/, -// characters in strings that need escapement - nx = /[\u0000-\u001f'\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, -// outer html token - ox = /[>&]|<[\/!]?|--/, -// attributes characters - qx = /[^a-zA-Z0-9+\-_\/. ]/, -// style - sx = /^\s*([{}:#%.=,>+\[\]@()"';]|[*$\^~]=|[a-zA-Z_][a-zA-Z0-9_\-]*|[0-9]+|<\/|\/\*)/, - ssx = /^\s*([@#!"'};:\-%.=,+\[\]()*_]|[a-zA-Z][a-zA-Z0-9._\-]*|\/\*?|\d+(?:\.\d+)?|<\/)/, -// token - tx = /^\s*([(){}\[\]\?.,:;'"~#@`]|={1,3}|\/(\*(jslint|properties|property|members?|globals?)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|[\^%]=?|&[&=]?|\|[|=]?|>{1,3}=?|<(?:[\/=!]|\!(\[|--)?|<=?)?|\!={0,2}|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+(?:[xX][0-9a-fA-F]+|\.[0-9]*)?(?:[eE][+\-]?[0-9]+)?)/, -// url badness - ux = /&|\+|\u00AD|\.\.|\/\*|%[^;]|base64|url|expression|data|mailto|script/i, - - rx = { - outer: hx, - html: hx, - style: sx, - styleproperty: ssx - }; - - - function F() {} // Used by Object.create - -// Provide critical ES5 functions to ES3. - - if (typeof Array.prototype.filter !== 'function') { - Array.prototype.filter = function (f) { - var i, length = this.length, result = [], value; - for (i = 0; i < length; i += 1) { - try { - value = this[i]; - if (f(value)) { - result.push(value); - } - } catch (ignore) { - } - } - return result; - }; - } - - if (typeof Array.prototype.forEach !== 'function') { - Array.prototype.forEach = function (f) { - var i, length = this.length; - for (i = 0; i < length; i += 1) { - try { - f(this[i]); - } catch (ignore) { - } - } - }; - } - - if (typeof Array.isArray !== 'function') { - Array.isArray = function (o) { - return Object.prototype.toString.apply(o) === '[object Array]'; - }; - } - - if (!Object.prototype.hasOwnProperty.call(Object, 'create')) { - Object.create = function (o) { - F.prototype = o; - return new F(); - }; - } - - if (typeof Object.keys !== 'function') { - Object.keys = function (o) { - var array = [], key; - for (key in o) { - if (Object.prototype.hasOwnProperty.call(o, key)) { - array.push(key); - } - } - return array; - }; - } - - if (typeof String.prototype.entityify !== 'function') { - String.prototype.entityify = function () { - return this - .replace(/&/g, '&') - .replace(//g, '>'); - }; - } - - if (typeof String.prototype.isAlpha !== 'function') { - String.prototype.isAlpha = function () { - return (this >= 'a' && this <= 'z\uffff') || - (this >= 'A' && this <= 'Z\uffff'); - }; - } - - if (typeof String.prototype.isDigit !== 'function') { - String.prototype.isDigit = function () { - return (this >= '0' && this <= '9'); - }; - } - - if (typeof String.prototype.supplant !== 'function') { - String.prototype.supplant = function (o) { - return this.replace(/\{([^{}]*)\}/g, function (a, b) { - var replacement = o[b]; - return typeof replacement === 'string' || - typeof replacement === 'number' ? replacement : a; - }); - }; - } - - - function sanitize(a) { - -// Escapify a troublesome character. - - return escapes[a] || - '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4); - } - - - function add_to_predefined(group) { - Object.keys(group).forEach(function (name) { - predefined[name] = group[name]; - }); - } - - - function assume() { - if (!option.safe) { - if (option.rhino) { - add_to_predefined(rhino); - option.rhino = false; - } - if (option.devel) { - add_to_predefined(devel); - option.devel = false; - } - if (option.browser) { - add_to_predefined(browser); - option.browser = false; - } - if (option.windows) { - add_to_predefined(windows); - option.windows = false; - } - if (option.node) { - add_to_predefined(node); - option.node = false; - node_js = true; - } - if (option.widget) { - add_to_predefined(widget); - option.widget = false; - } - } - } - - -// Produce an error warning. - - function artifact(tok) { - if (!tok) { - tok = next_token; - } - return tok.number || tok.string; - } - - function quit(message, line, character) { - throw { - name: 'JSLintError', - line: line, - character: character, - message: bundle.scanned_a_b.supplant({ - a: message, - b: Math.floor((line / lines.length) * 100) - }) - }; - } - - function warn(message, offender, a, b, c, d) { - var character, line, warning; - offender = offender || next_token; // ~~ - line = offender.line || 0; - character = offender.from || 0; - warning = { - id: '(error)', - raw: bundle[message] || message, - evidence: lines[line - 1] || '', - line: line, - character: character, - a: a || (offender.id === '(number)' - ? String(offender.number) - : offender.string), - b: b, - c: c, - d: d - }; - warning.reason = warning.raw.supplant(warning); - JSLINT.errors.push(warning); - if (option.passfail) { - quit(bundle.stopping, line, character); - } - warnings += 1; - if (warnings >= option.maxerr) { - quit(bundle.too_many, line, character); - } - return warning; - } - - function warn_at(message, line, character, a, b, c, d) { - return warn(message, { - line: line, - from: character - }, a, b, c, d); - } - - function stop(message, offender, a, b, c, d) { - var warning = warn(message, offender, a, b, c, d); - quit(bundle.stopping, warning.line, warning.character); - } - - function stop_at(message, line, character, a, b, c, d) { - return stop(message, { - line: line, - from: character - }, a, b, c, d); - } - - function expected_at(at) { - if (!option.white && next_token.from !== at) { - warn('expected_a_at_b_c', next_token, '', at, - next_token.from); - } - } - - function aint(it, name, expected) { - if (it[name] !== expected) { - warn('expected_a_b', it, expected, it[name]); - return true; - } - return false; - } - - -// lexical analysis and token construction - - lex = (function lex() { - var character, c, from, length, line, pos, source_row; - -// Private lex methods - - function next_line() { - var at; - if (line >= lines.length) { - return false; - } - character = 1; - source_row = lines[line]; - line += 1; - at = source_row.search(/ \t/); - if (at >= 0) { - warn_at('mixed', line, at + 1); - } - source_row = source_row.replace(/\t/g, tab); - at = source_row.search(cx); - if (at >= 0) { - warn_at('unsafe', line, at); - } - if (option.maxlen && option.maxlen < source_row.length) { - warn_at('too_long', line, source_row.length); - } - return true; - } - -// Produce a token object. The token inherits from a syntax symbol. - - function it(type, value) { - var id, the_token; - if (type === '(string)' || type === '(range)') { - if (jx.test(value)) { - warn_at('url', line, from); - } - } - the_token = Object.create(syntax[( - type === '(punctuator)' || (type === '(identifier)' && - Object.prototype.hasOwnProperty.call(syntax, value)) - ? value - : type - )] || syntax['(error)']); - if (type === '(identifier)') { - the_token.identifier = true; - if (value === '__iterator__' || value === '__proto__') { - stop_at('reserved_a', line, from, value); - } else if (!option.nomen && - (value.charAt(0) === '_' || - value.charAt(value.length - 1) === '_')) { - warn_at('dangling_a', line, from, value); - } - } - if (type === '(number)') { - the_token.number = +value; - } else if (value !== undefined) { - the_token.string = String(value); - } - the_token.line = line; - the_token.from = from; - the_token.thru = character; - id = the_token.id; - prereg = id && ( - ('(,=:[!&|?{};'.indexOf(id.charAt(id.length - 1)) >= 0) || - id === 'return' || id === 'case' - ); - return the_token; - } - - function match(x) { - var exec = x.exec(source_row), first; - if (exec) { - length = exec[0].length; - first = exec[1]; - c = first.charAt(0); - source_row = source_row.slice(length); - from = character + length - first.length; - character += length; - return first; - } - } - - function string(x) { - var c, pos = 0, r = '', result; - - function hex(n) { - var i = parseInt(source_row.substr(pos + 1, n), 16); - pos += n; - if (i >= 32 && i <= 126 && - i !== 34 && i !== 92 && i !== 39) { - warn_at('unexpected_a', line, character, '\\'); - } - character += n; - c = String.fromCharCode(i); - } - - if (json_mode && x !== '"') { - warn_at('expected_a', line, character, '"'); - } - - if (xquote === x || (xmode === 'scriptstring' && !xquote)) { - return it('(punctuator)', x); - } - - for (;;) { - while (pos >= source_row.length) { - pos = 0; - if (xmode !== 'html' || !next_line()) { - stop_at('unclosed', line, from); - } - } - c = source_row.charAt(pos); - if (c === x) { - character += 1; - source_row = source_row.slice(pos + 1); - result = it('(string)', r); - result.quote = x; - return result; - } - if (c < ' ') { - if (c === '\n' || c === '\r') { - break; - } - warn_at('control_a', line, character + pos, - source_row.slice(0, pos)); - } else if (c === xquote) { - warn_at('bad_html', line, character + pos); - } else if (c === '<') { - if (option.safe && xmode === 'html') { - warn_at('adsafe_a', line, character + pos, c); - } else if (source_row.charAt(pos + 1) === '/' && (xmode || option.safe)) { - warn_at('expected_a_b', line, character, - '<\\/', '= '0' && c <= '7' ? 'octal_a' : 'unexpected_a', - line, character, '\\' + c); - } else { - c = descapes[c]; - } - } - } - } - r += c; - character += 1; - pos += 1; - } - } - - function number(snippet) { - var digit; - if (xmode !== 'style' && xmode !== 'styleproperty' && - source_row.charAt(0).isAlpha()) { - warn_at('expected_space_a_b', - line, character, c, source_row.charAt(0)); - } - if (c === '0') { - digit = snippet.charAt(1); - if (digit.isDigit()) { - if (token.id !== '.' && xmode !== 'styleproperty') { - warn_at('unexpected_a', line, character, snippet); - } - } else if (json_mode && (digit === 'x' || digit === 'X')) { - warn_at('unexpected_a', line, character, '0x'); - } - } - if (snippet.slice(snippet.length - 1) === '.') { - warn_at('trailing_decimal_a', line, character, snippet); - } - if (xmode !== 'style') { - digit = +snippet; - if (!isFinite(digit)) { - warn_at('bad_number', line, character, snippet); - } - snippet = digit; - } - return it('(number)', snippet); - } - - function comment(snippet) { - if (comments_off || src || (xmode && xmode !== 'script' && - xmode !== 'style' && xmode !== 'styleproperty')) { - warn_at('unexpected_comment', line, character); - } else if (xmode === 'script' && /<\//i.test(source_row)) { - warn_at('unexpected_a', line, character, '<\/'); - } else if (option.safe && ax.test(snippet)) { - warn_at('dangerous_comment', line, character); - } - } - - function regexp() { - var b, - bit, - captures = 0, - depth = 0, - flag = '', - high, - letter, - length = 0, - low, - potential, - quote, - result; - for (;;) { - b = true; - c = source_row.charAt(length); - length += 1; - switch (c) { - case '': - stop_at('unclosed_regexp', line, from); - return; - case '/': - if (depth > 0) { - warn_at('unescaped_a', line, from + length, '/'); - } - c = source_row.slice(0, length - 1); - potential = Object.create(regexp_flag); - for (;;) { - letter = source_row.charAt(length); - if (potential[letter] !== true) { - break; - } - potential[letter] = false; - length += 1; - flag += letter; - } - if (source_row.charAt(length).isAlpha()) { - stop_at('unexpected_a', line, from, source_row.charAt(length)); - } - character += length; - source_row = source_row.slice(length); - quote = source_row.charAt(0); - if (quote === '/' || quote === '*') { - stop_at('confusing_regexp', line, from); - } - result = it('(regexp)', c); - result.flag = flag; - return result; - case '\\': - c = source_row.charAt(length); - if (c < ' ') { - warn_at('control_a', line, from + length, String(c)); - } else if (c === '<') { - warn_at(bundle.unexpected_a, line, from + length, '\\'); - } - length += 1; - break; - case '(': - depth += 1; - b = false; - if (source_row.charAt(length) === '?') { - length += 1; - switch (source_row.charAt(length)) { - case ':': - case '=': - case '!': - length += 1; - break; - default: - warn_at(bundle.expected_a_b, line, from + length, - ':', source_row.charAt(length)); - } - } else { - captures += 1; - } - break; - case '|': - b = false; - break; - case ')': - if (depth === 0) { - warn_at('unescaped_a', line, from + length, ')'); - } else { - depth -= 1; - } - break; - case ' ': - pos = 1; - while (source_row.charAt(length) === ' ') { - length += 1; - pos += 1; - } - if (pos > 1) { - warn_at('use_braces', line, from + length, pos); - } - break; - case '[': - c = source_row.charAt(length); - if (c === '^') { - length += 1; - if (!option.regexp) { - warn_at('insecure_a', line, from + length, c); - } else if (source_row.charAt(length) === ']') { - stop_at('unescaped_a', line, from + length, '^'); - } - } - bit = false; - if (c === ']') { - warn_at('empty_class', line, from + length - 1); - bit = true; - } -klass: do { - c = source_row.charAt(length); - length += 1; - switch (c) { - case '[': - case '^': - warn_at('unescaped_a', line, from + length, c); - bit = true; - break; - case '-': - if (bit) { - bit = false; - } else { - warn_at('unescaped_a', line, from + length, '-'); - bit = true; - } - break; - case ']': - if (!bit) { - warn_at('unescaped_a', line, from + length - 1, '-'); - } - break klass; - case '\\': - c = source_row.charAt(length); - if (c < ' ') { - warn_at(bundle.control_a, line, from + length, String(c)); - } else if (c === '<') { - warn_at(bundle.unexpected_a, line, from + length, '\\'); - } - length += 1; - bit = true; - break; - case '/': - warn_at('unescaped_a', line, from + length - 1, '/'); - bit = true; - break; - case '<': - if (xmode === 'script') { - c = source_row.charAt(length); - if (c === '!' || c === '/') { - warn_at(bundle.html_confusion_a, line, - from + length, c); - } - } - bit = true; - break; - default: - bit = true; - } - } while (c); - break; - case '.': - if (!option.regexp) { - warn_at('insecure_a', line, from + length, c); - } - break; - case ']': - case '?': - case '{': - case '}': - case '+': - case '*': - warn_at('unescaped_a', line, from + length, c); - break; - case '<': - if (xmode === 'script') { - c = source_row.charAt(length); - if (c === '!' || c === '/') { - warn_at(bundle.html_confusion_a, line, from + length, c); - } - } - break; - } - if (b) { - switch (source_row.charAt(length)) { - case '?': - case '+': - case '*': - length += 1; - if (source_row.charAt(length) === '?') { - length += 1; - } - break; - case '{': - length += 1; - c = source_row.charAt(length); - if (c < '0' || c > '9') { - warn_at(bundle.expected_number_a, line, - from + length, c); - } - length += 1; - low = +c; - for (;;) { - c = source_row.charAt(length); - if (c < '0' || c > '9') { - break; - } - length += 1; - low = +c + (low * 10); - } - high = low; - if (c === ',') { - length += 1; - high = Infinity; - c = source_row.charAt(length); - if (c >= '0' && c <= '9') { - length += 1; - high = +c; - for (;;) { - c = source_row.charAt(length); - if (c < '0' || c > '9') { - break; - } - length += 1; - high = +c + (high * 10); - } - } - } - if (source_row.charAt(length) !== '}') { - warn_at(bundle.expected_a_b, line, from + length, - '}', c); - } else { - length += 1; - } - if (source_row.charAt(length) === '?') { - length += 1; - } - if (low > high) { - warn_at(bundle.not_greater, line, from + length, - low, high); - } - break; - } - } - } - c = source_row.slice(0, length - 1); - character += length; - source_row = source_row.slice(length); - return it('(regexp)', c); - } - -// Public lex methods - - return { - init: function (source) { - if (typeof source === 'string') { - lines = source.split(crlfx); - } else { - lines = source; - } - line = 0; - next_line(); - from = 1; - }, - - range: function (begin, end) { - var c, value = ''; - from = character; - if (source_row.charAt(0) !== begin) { - stop_at('expected_a_b', line, character, begin, - source_row.charAt(0)); - } - for (;;) { - source_row = source_row.slice(1); - character += 1; - c = source_row.charAt(0); - switch (c) { - case '': - stop_at('missing_a', line, character, c); - break; - case end: - source_row = source_row.slice(1); - character += 1; - return it('(range)', value); - case xquote: - case '\\': - warn_at('unexpected_a', line, character, c); - break; - } - value += c; - } - }, - -// token -- this is called by advance to get the next token. - - token: function () { - var c, i, snippet; - - for (;;) { - while (!source_row) { - if (!next_line()) { - return it('(end)'); - } - } - while (xmode === 'outer') { - i = source_row.search(ox); - if (i === 0) { - break; - } else if (i > 0) { - character += 1; - source_row = source_row.slice(i); - break; - } else { - if (!next_line()) { - return it('(end)', ''); - } - } - } - snippet = match(rx[xmode] || tx); - if (!snippet) { - if (source_row) { - if (source_row.charAt(0) === ' ') { - if (!option.white) { - warn_at('unexpected_a', line, character, - '(space)'); - } - character += 1; - source_row = ''; - } else { - stop_at('unexpected_a', line, character, - source_row.charAt(0)); - } - } - } else { - -// identifier - - c = snippet.charAt(0); - if (c.isAlpha() || c === '_' || c === '$') { - return it('(identifier)', snippet); - } - -// number - - if (c.isDigit()) { - return number(snippet); - } - switch (snippet) { - -// string - - case '"': - case "'": - return string(snippet); - -// // comment - - case '//': - comment(source_row); - source_row = ''; - break; - -// /* comment - - case '/*': - for (;;) { - i = source_row.search(lx); - if (i >= 0) { - break; - } - comment(source_row); - if (!next_line()) { - stop_at('unclosed_comment', line, character); - } - } - comment(source_row.slice(0, i)); - character += i + 2; - if (source_row.charAt(i) === '/') { - stop_at('nested_comment', line, character); - } - source_row = source_row.slice(i + 2); - break; - - case '': - break; -// / - case '/': - if (token.id === '/=') { - stop_at( - bundle.slash_equal, - line, - from - ); - } - return prereg - ? regexp() - : it('(punctuator)', snippet); - -// punctuator - - case ''); - } - character += 3; - source_row = source_row.slice(i + 3); - break; - case '#': - if (xmode === 'html' || xmode === 'styleproperty') { - for (;;) { - c = source_row.charAt(0); - if ((c < '0' || c > '9') && - (c < 'a' || c > 'f') && - (c < 'A' || c > 'F')) { - break; - } - character += 1; - source_row = source_row.slice(1); - snippet += c; - } - if (snippet.length !== 4 && snippet.length !== 7) { - warn_at('bad_color_a', line, - from + length, snippet); - } - return it('(color)', snippet); - } - return it('(punctuator)', snippet); - - default: - if (xmode === 'outer' && c === '&') { - character += 1; - source_row = source_row.slice(1); - for (;;) { - c = source_row.charAt(0); - character += 1; - source_row = source_row.slice(1); - if (c === ';') { - break; - } - if (!((c >= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - c === '#')) { - stop_at('bad_entity', line, from + length, - character); - } - } - break; - } - return it('(punctuator)', snippet); - } - } - } - } - }; - }()); - - - function add_label(token, kind, name) { - -// Define the symbol in the current function in the current scope. - - name = name || token.string; - -// Global variables cannot be created in the safe subset. If a global variable -// already exists, do nothing. If it is predefined, define it. - - if (funct === global_funct) { - if (option.safe) { - warn('adsafe_a', token, name); - } - if (typeof global_funct[name] !== 'string') { - token.writeable = typeof predefined[name] === 'boolean' - ? predefined[name] - : true; - token.funct = funct; - global_scope[name] = token; - } - if (kind === 'becoming') { - kind = 'var'; - } - -// Ordinary variables. - - } else { - -// Warn if the variable already exists. - - if (typeof funct[name] === 'string') { - if (funct[name] === 'undef') { - if (!option.undef) { - warn('used_before_a', token, name); - } - kind = 'var'; - } else { - warn('already_defined', token, name); - } - } else { - -// Add the symbol to the current function. - - token.funct = funct; - token.writeable = true; - scope[name] = token; - } - } - funct[name] = kind; - } - - - function peek(distance) { - -// Peek ahead to a future token. The distance is how far ahead to look. The -// default is the next token. - - var found, slot = 0; - - distance = distance || 0; - while (slot <= distance) { - found = lookahead[slot]; - if (!found) { - found = lookahead[slot] = lex.token(); - } - slot += 1; - } - return found; - } - - - function advance(id, match) { - -// Produce the next token, also looking for programming errors. - - if (indent) { - -// If indentation checking was requested, then inspect all of the line breakings. -// The var statement is tricky because the names might be aligned or not. We -// look at the first line break after the var to determine the programmer's -// intention. - - if (var_mode && next_token.line !== token.line) { - if ((var_mode !== indent || !next_token.edge) && - next_token.from === indent.at - - (next_token.edge ? option.indent : 0)) { - var dent = indent; - for (;;) { - dent.at -= option.indent; - if (dent === var_mode) { - break; - } - dent = dent.was; - } - dent.open = false; - } - var_mode = null; - } - if (next_token.id === '?' && indent.mode === ':' && - token.line !== next_token.line) { - indent.at -= option.indent; - } - if (indent.open) { - -// If the token is an edge. - - if (next_token.edge) { - if (next_token.edge === 'label') { - expected_at(1); - } else if (next_token.edge === 'case' || indent.mode === 'statement') { - expected_at(indent.at - option.indent); - } else if (indent.mode !== 'array' || next_token.line !== token.line) { - expected_at(indent.at); - } - -// If the token is not an edge, but is the first token on the line. - - } else if (next_token.line !== token.line) { - if (next_token.from < indent.at + (indent.mode === - 'expression' ? 0 : option.indent)) { - expected_at(indent.at + option.indent); - } - indent.wrap = true; - } - } else if (next_token.line !== token.line) { - if (next_token.edge) { - expected_at(indent.at); - } else { - indent.wrap = true; - if (indent.mode === 'statement' || indent.mode === 'var') { - expected_at(indent.at + option.indent); - } else if (next_token.from < indent.at + (indent.mode === - 'expression' ? 0 : option.indent)) { - expected_at(indent.at + option.indent); - } - } - } - } - - switch (token.id) { - case '(number)': - if (next_token.id === '.') { - warn('trailing_decimal_a'); - } - break; - case '-': - if (next_token.id === '-' || next_token.id === '--') { - warn('confusing_a'); - } - break; - case '+': - if (next_token.id === '+' || next_token.id === '++') { - warn('confusing_a'); - } - break; - } - if (token.id === '(string)' || token.identifier) { - anonname = token.string; - } - - if (id && next_token.id !== id) { - if (match) { - warn('expected_a_b_from_c_d', next_token, id, - match.id, match.line, artifact()); - } else if (!next_token.identifier || next_token.string !== id) { - warn('expected_a_b', next_token, id, artifact()); - } - } - prev_token = token; - token = next_token; - next_token = lookahead.shift() || lex.token(); - } - - - function advance_identifier(string) { - if (next_token.identifier && next_token.string === string) { - advance(); - } else { - warn('expected_a_b', next_token, string, artifact()); - } - } - - - function do_safe() { - if (option.adsafe) { - option.safe = true; - } - if (option.safe) { - option.browser = - option['continue'] = - option.css = - option.debug = - option.devel = - option.evil = - option.forin = - option.newcap = - option.nomen = - option.on = - option.rhino = - option.sloppy = - option.sub = - option.undef = - option.widget = - option.windows = false; - - - delete predefined.Array; - delete predefined.Date; - delete predefined.Function; - delete predefined.Object; - delete predefined['eval']; - - add_to_predefined({ - ADSAFE: false, - lib: false - }); - } - } - - - function do_globals() { - var name, writeable; - for (;;) { - if (next_token.id !== '(string)' && !next_token.identifier) { - return; - } - name = next_token.string; - advance(); - writeable = false; - if (next_token.id === ':') { - advance(':'); - switch (next_token.id) { - case 'true': - writeable = predefined[name] !== false; - advance('true'); - break; - case 'false': - advance('false'); - break; - default: - stop('unexpected_a'); - } - } - predefined[name] = writeable; - if (next_token.id !== ',') { - return; - } - advance(','); - } - } - - - function do_jslint() { - var name, value; - while (next_token.id === '(string)' || next_token.identifier) { - name = next_token.string; - if (!allowed_option[name]) { - stop('unexpected_a'); - } - advance(); - if (next_token.id !== ':') { - stop('expected_a_b', next_token, ':', artifact()); - } - advance(':'); - if (typeof allowed_option[name] === 'number') { - value = next_token.number; - if (value > allowed_option[name] || value <= 0 || - Math.floor(value) !== value) { - stop('expected_small_a'); - } - option[name] = value; - } else { - if (next_token.id === 'true') { - option[name] = true; - } else if (next_token.id === 'false') { - option[name] = false; - } else { - stop('unexpected_a'); - } - } - advance(); - if (next_token.id === ',') { - advance(','); - } - } - assume(); - } - - - function do_properties() { - var name; - option.properties = true; - for (;;) { - if (next_token.id !== '(string)' && !next_token.identifier) { - return; - } - name = next_token.string; - advance(); - if (next_token.id === ':') { - for (;;) { - advance(); - if (next_token.id !== '(string)' && !next_token.identifier) { - break; - } - } - } - property[name] = 0; - if (next_token.id !== ',') { - return; - } - advance(','); - } - } - - - directive = function directive() { - var command = this.id, - old_comments_off = comments_off, - old_indent = indent; - comments_off = true; - indent = null; - if (next_token.line === token.line && next_token.from === token.thru) { - warn('missing_space_a_b', next_token, artifact(token), artifact()); - } - if (lookahead.length > 0) { - warn('unexpected_a', this); - } - switch (command) { - case '/*properties': - case '/*property': - case '/*members': - case '/*member': - do_properties(); - break; - case '/*jslint': - if (option.safe) { - warn('adsafe_a', this); - } - do_jslint(); - break; - case '/*globals': - case '/*global': - if (option.safe) { - warn('adsafe_a', this); - } - do_globals(); - break; - default: - stop('unexpected_a', this); - } - comments_off = old_comments_off; - advance('*/'); - indent = old_indent; - }; - - -// Indentation intention - - function edge(mode) { - next_token.edge = indent ? indent.open && (mode || 'edge') : ''; - } - - - function step_in(mode) { - var open; - if (typeof mode === 'number') { - indent = { - at: +mode, - open: true, - was: indent - }; - } else if (!indent) { - indent = { - at: 1, - mode: 'statement', - open: true - }; - } else if (mode === 'statement') { - indent = { - at: indent.at, - open: true, - was: indent - }; - } else { - open = mode === 'var' || next_token.line !== token.line; - indent = { - at: (open || mode === 'control' - ? indent.at + option.indent - : indent.at) + (indent.wrap ? option.indent : 0), - mode: mode, - open: open, - was: indent - }; - if (mode === 'var' && open) { - var_mode = indent; - } - } - } - - function step_out(id, symbol) { - if (id) { - if (indent && indent.open) { - indent.at -= option.indent; - edge(); - } - advance(id, symbol); - } - if (indent) { - indent = indent.was; - } - } - -// Functions for conformance of whitespace. - - function one_space(left, right) { - left = left || token; - right = right || next_token; - if (right.id !== '(end)' && !option.white && - (token.line !== right.line || - token.thru + 1 !== right.from)) { - warn('expected_space_a_b', right, artifact(token), artifact(right)); - } - } - - function one_space_only(left, right) { - left = left || token; - right = right || next_token; - if (right.id !== '(end)' && (left.line !== right.line || - (!option.white && left.thru + 1 !== right.from))) { - warn('expected_space_a_b', right, artifact(left), artifact(right)); - } - } - - function no_space(left, right) { - left = left || token; - right = right || next_token; - if ((!option.white || xmode === 'styleproperty' || xmode === 'style') && - left.thru !== right.from && left.line === right.line) { - warn('unexpected_space_a_b', right, artifact(left), artifact(right)); - } - } - - function no_space_only(left, right) { - left = left || token; - right = right || next_token; - if (right.id !== '(end)' && (left.line !== right.line || - (!option.white && left.thru !== right.from))) { - warn('unexpected_space_a_b', right, artifact(left), artifact(right)); - } - } - - function spaces(left, right) { - if (!option.white) { - left = left || token; - right = right || next_token; - if (left.thru === right.from && left.line === right.line) { - warn('missing_space_a_b', right, artifact(left), artifact(right)); - } - } - } - - function comma() { - if (next_token.id !== ',') { - warn_at('expected_a_b', token.line, token.thru, ',', artifact()); - } else { - if (!option.white) { - no_space_only(); - } - advance(','); - spaces(); - } - } - - - function semicolon() { - if (next_token.id !== ';') { - warn_at('expected_a_b', token.line, token.thru, ';', artifact()); - } else { - if (!option.white) { - no_space_only(); - } - advance(';'); - if (semicolon_coda[next_token.id] !== true) { - spaces(); - } - } - } - - function use_strict() { - if (next_token.string === 'use strict') { - if (strict_mode) { - warn('unnecessary_use'); - } - edge(); - advance(); - semicolon(); - strict_mode = true; - option.undef = false; - return true; - } - return false; - } - - - function are_similar(a, b) { - if (a === b) { - return true; - } - if (Array.isArray(a)) { - if (Array.isArray(b) && a.length === b.length) { - var i; - for (i = 0; i < a.length; i += 1) { - if (!are_similar(a[i], b[i])) { - return false; - } - } - return true; - } - return false; - } - if (Array.isArray(b)) { - return false; - } - if (a.id === '(number)' && b.id === '(number)') { - return a.number === b.number; - } - if (a.arity === b.arity && a.string === b.string) { - switch (a.arity) { - case 'prefix': - case 'suffix': - case undefined: - return a.id === b.id && are_similar(a.first, b.first); - case 'infix': - return are_similar(a.first, b.first) && - are_similar(a.second, b.second); - case 'ternary': - return are_similar(a.first, b.first) && - are_similar(a.second, b.second) && - are_similar(a.third, b.third); - case 'function': - case 'regexp': - return false; - default: - return true; - } - } else { - if (a.id === '.' && b.id === '[' && b.arity === 'infix') { - return a.second.string === b.second.string && b.second.id === '(string)'; - } - if (a.id === '[' && a.arity === 'infix' && b.id === '.') { - return a.second.string === b.second.string && a.second.id === '(string)'; - } - } - return false; - } - - -// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it -// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is -// like .nud except that it is only used on the first token of a statement. -// Having .fud makes it much easier to define statement-oriented languages like -// JavaScript. I retained Pratt's nomenclature. - -// .nud Null denotation -// .fud First null denotation -// .led Left denotation -// lbp Left binding power -// rbp Right binding power - -// They are elements of the parsing method called Top Down Operator Precedence. - - function expression(rbp, initial) { - -// rbp is the right binding power. -// initial indicates that this is the first expression of a statement. - - var left; - if (next_token.id === '(end)') { - stop('unexpected_a', token, next_token.id); - } - advance(); - if (option.safe && scope[token.string] && - scope[token.string] === global_scope[token.string] && - (next_token.id !== '(' && next_token.id !== '.')) { - warn('adsafe_a', token); - } - if (initial) { - anonname = 'anonymous'; - funct['(verb)'] = token.string; - } - if (initial === true && token.fud) { - left = token.fud(); - } else { - if (token.nud) { - left = token.nud(); - } else { - if (next_token.id === '(number)' && token.id === '.') { - warn('leading_decimal_a', token, artifact()); - advance(); - return token; - } - stop('expected_identifier_a', token, token.id); - } - while (rbp < next_token.lbp) { - advance(); - if (token.led) { - left = token.led(left); - } else { - stop('expected_operator_a', token, token.id); - } - } - } - return left; - } - - -// Functional constructors for making the symbols that will be inherited by -// tokens. - - function symbol(s, p) { - var x = syntax[s]; - if (!x || typeof x !== 'object') { - syntax[s] = x = { - id: s, - lbp: p || 0, - string: s - }; - } - return x; - } - - function postscript(x) { - x.postscript = true; - return x; - } - - function ultimate(s) { - var x = symbol(s, 0); - x.from = 1; - x.thru = 1; - x.line = 0; - x.edge = 'edge'; - s.string = s; - return postscript(x); - } - - - function stmt(s, f) { - var x = symbol(s); - x.identifier = x.reserved = true; - x.fud = f; - return x; - } - - function labeled_stmt(s, f) { - var x = stmt(s, f); - x.labeled = true; - } - - function disrupt_stmt(s, f) { - var x = stmt(s, f); - x.disrupt = true; - } - - - function reserve_name(x) { - var c = x.id.charAt(0); - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { - x.identifier = x.reserved = true; - } - return x; - } - - - function prefix(s, f) { - var x = symbol(s, 150); - reserve_name(x); - x.nud = typeof f === 'function' - ? f - : function () { - if (s === 'typeof') { - one_space(); - } else { - no_space_only(); - } - this.first = expression(150); - this.arity = 'prefix'; - if (this.id === '++' || this.id === '--') { - if (!option.plusplus) { - warn('unexpected_a', this); - } else if ((!this.first.identifier || this.first.reserved) && - this.first.id !== '.' && this.first.id !== '[') { - warn('bad_operand', this); - } - } - return this; - }; - return x; - } - - - function type(s, t, nud) { - var x = symbol(s); - x.arity = t; - if (nud) { - x.nud = nud; - } - return x; - } - - - function reserve(s, f) { - var x = symbol(s); - x.identifier = x.reserved = true; - if (typeof f === 'function') { - x.nud = f; - } - return x; - } - - - function constant(name) { - var x = reserve(name); - x.string = name; - x.nud = return_this; - return x; - } - - - function reservevar(s, v) { - return reserve(s, function () { - if (typeof v === 'function') { - v(this); - } - return this; - }); - } - - - function infix(s, p, f, w) { - var x = symbol(s, p); - reserve_name(x); - x.led = function (left) { - this.arity = 'infix'; - if (!w) { - spaces(prev_token, token); - spaces(); - } - if (!option.bitwise && this.bitwise) { - warn('unexpected_a', this); - } - if (typeof f === 'function') { - return f(left, this); - } - this.first = left; - this.second = expression(p); - return this; - }; - return x; - } - - function expected_relation(node, message) { - if (node.assign) { - warn(message || bundle.conditional_assignment, node); - } - return node; - } - - function expected_condition(node, message) { - switch (node.id) { - case '[': - case '-': - if (node.arity !== 'infix') { - warn(message || bundle.weird_condition, node); - } - break; - case 'false': - case 'function': - case 'Infinity': - case 'NaN': - case 'null': - case 'true': - case 'undefined': - case 'void': - case '(number)': - case '(regexp)': - case '(string)': - case '{': - warn(message || bundle.weird_condition, node); - break; - case '(': - if (node.first.id === '.' && numbery[node.first.second.string] === true) { - warn(message || bundle.weird_condition, node); - } - break; - } - return node; - } - - function check_relation(node) { - switch (node.arity) { - case 'prefix': - switch (node.id) { - case '{': - case '[': - warn('unexpected_a', node); - break; - case '!': - warn('confusing_a', node); - break; - } - break; - case 'function': - case 'regexp': - warn('unexpected_a', node); - break; - default: - if (node.id === 'NaN') { - warn('isNaN', node); - } - } - return node; - } - - - function relation(s, eqeq) { - return infix(s, 100, function (left, that) { - check_relation(left); - if (eqeq && !option.eqeq) { - warn('expected_a_b', that, eqeq, that.id); - } - var right = expression(100); - if (are_similar(left, right) || - ((left.id === '(string)' || left.id === '(number)') && - (right.id === '(string)' || right.id === '(number)'))) { - warn('weird_relation', that); - } - that.first = left; - that.second = check_relation(right); - return that; - }); - } - - - function assignop(s, op) { - var x = infix(s, 20, function (left, that) { - var l; - that.first = left; - if (left.identifier) { - if (scope[left.string]) { - if (scope[left.string].writeable === false) { - warn('read_only', left); - } - } else { - stop('read_only'); - } - if (funct['(params)']) { - funct['(params)'].forEach(function (value) { - if (value.string === left.string) { - value.assign = true; - } - }); - } - } else if (option.safe) { - l = left; - do { - if (typeof predefined[l.string] === 'boolean') { - warn('adsafe_a', l); - } - l = l.first; - } while (l); - } - if (left === syntax['function']) { - warn('identifier_function', token); - } - if (left.id === '.' || left.id === '[') { - if (!left.first || left.first.string === 'arguments') { - warn('bad_assignment', that); - } - } else if (left.identifier) { - if (!left.reserved && funct[left.string] === 'exception') { - warn('assign_exception', left); - } - } else { - warn('bad_assignment', that); - } - that.second = expression(19); - if (that.id === '=' && are_similar(that.first, that.second)) { - warn('weird_assignment', that); - } - return that; - }); - x.assign = true; - if (op) { - if (syntax[op].bitwise) { - x.bitwise = true; - } - } - return x; - } - - - function bitwise(s, p) { - var x = infix(s, p, 'number'); - x.bitwise = true; - return x; - } - - - function suffix(s) { - var x = symbol(s, 150); - x.led = function (left) { - no_space_only(prev_token, token); - if (!option.plusplus) { - warn('unexpected_a', this); - } else if ((!left.identifier || left.reserved) && - left.id !== '.' && left.id !== '[') { - warn('bad_operand', this); - } - this.first = left; - this.arity = 'suffix'; - return this; - }; - return x; - } - - - function optional_identifier() { - if (next_token.identifier) { - advance(); - if (option.safe && banned[token.string]) { - warn('adsafe_a', token); - } else if (token.reserved && !option.es5) { - warn('expected_identifier_a_reserved', token); - } - return token.string; - } - } - - - function identifier() { - var i = optional_identifier(); - if (!i) { - stop(token.id === 'function' && next_token.id === '(' - ? 'name_function' - : 'expected_identifier_a'); - } - return i; - } - - - function statement() { - - var label, old_scope = scope, the_statement; - -// We don't like the empty statement. - - if (next_token.id === ';') { - warn('unexpected_a'); - semicolon(); - return; - } - -// Is this a labeled statement? - - if (next_token.identifier && !next_token.reserved && peek().id === ':') { - edge('label'); - label = next_token; - advance(); - advance(':'); - scope = Object.create(old_scope); - add_label(label, 'label'); - if (next_token.labeled !== true || funct === global_funct) { - stop('unexpected_label_a', label); - } else if (jx.test(label.string + ':')) { - warn('url', label); - } - next_token.label = label; - } - -// Parse the statement. - - if (token.id !== 'else') { - edge(); - } - step_in('statement'); - the_statement = expression(0, true); - if (the_statement) { - -// Look for the final semicolon. - - if (the_statement.arity === 'statement') { - if (the_statement.id === 'switch' || - (the_statement.block && the_statement.id !== 'do')) { - spaces(); - } else { - semicolon(); - } - } else { - -// If this is an expression statement, determine if it is acceptable. -// We do not like -// new Blah(); -// statments. If it is to be used at all, new should only be used to make -// objects, not side effects. The expression statements we do like do -// assignment or invocation or delete. - - if (the_statement.id === '(') { - if (the_statement.first.id === 'new') { - warn('bad_new'); - } - } else if (!the_statement.assign && - the_statement.id !== 'delete' && - the_statement.id !== '++' && - the_statement.id !== '--') { - warn('assignment_function_expression', token); - } - semicolon(); - } - } - step_out(); - scope = old_scope; - return the_statement; - } - - - function statements() { - var array = [], disruptor, the_statement; - -// A disrupt statement may not be followed by any other statement. -// If the last statement is disrupt, then the sequence is disrupt. - - while (next_token.postscript !== true) { - if (next_token.id === ';') { - warn('unexpected_a', next_token); - semicolon(); - } else { - if (next_token.string === 'use strict') { - if ((!node_js && xmode !== 'script') || funct !== global_funct || array.length > 0) { - warn('function_strict'); - } - use_strict(); - } - if (disruptor) { - warn('unreachable_a_b', next_token, next_token.string, - disruptor.string); - disruptor = null; - } - the_statement = statement(); - if (the_statement) { - array.push(the_statement); - if (the_statement.disrupt) { - disruptor = the_statement; - array.disrupt = true; - } - } - } - } - return array; - } - - - function block(ordinary) { - -// array block is array sequence of statements wrapped in braces. -// ordinary is false for function bodies and try blocks. -// ordinary is true for if statements, while, etc. - - var array, - curly = next_token, - old_in_block = in_block, - old_scope = scope, - old_strict_mode = strict_mode; - - in_block = ordinary; - scope = Object.create(scope); - spaces(); - if (next_token.id === '{') { - advance('{'); - step_in(); - if (!ordinary && !use_strict() && !old_strict_mode && - !option.sloppy && funct['(context)'] === global_funct) { - warn('missing_use_strict'); - } - array = statements(); - strict_mode = old_strict_mode; - step_out('}', curly); - } else if (!ordinary) { - stop('expected_a_b', next_token, '{', artifact()); - } else { - warn('expected_a_b', next_token, '{', artifact()); - array = [statement()]; - array.disrupt = array[0].disrupt; - } - funct['(verb)'] = null; - scope = old_scope; - in_block = old_in_block; - if (ordinary && array.length === 0) { - warn('empty_block'); - } - return array; - } - - - function tally_property(name) { - if (option.properties && typeof property[name] !== 'number') { - warn('unexpected_property_a', token, name); - } - if (typeof property[name] === 'number') { - property[name] += 1; - } else { - property[name] = 1; - } - } - - -// ECMAScript parser - - syntax['(identifier)'] = { - id: '(identifier)', - lbp: 0, - identifier: true, - nud: function () { - var name = this.string, - variable = scope[name], - site, - writeable; - -// If the variable is not in scope, then we may have an undeclared variable. -// Check the predefined list. If it was predefined, create the global -// variable. - - if (typeof variable !== 'object') { - writeable = predefined[name]; - if (typeof writeable === 'boolean') { - global_scope[name] = variable = { - string: name, - writeable: writeable, - funct: global_funct - }; - global_funct[name] = 'var'; - -// But if the variable is not in scope, and is not predefined, and if we are not -// in the global scope, then we have an undefined variable error. - - } else { - if (!option.undef) { - warn('used_before_a', token); - } - scope[name] = variable = { - string: name, - writeable: true, - funct: funct - }; - funct[name] = 'undef'; - } - - } - site = variable.funct; - -// The name is in scope and defined in the current function. - - if (funct === site) { - -// Change 'unused' to 'var', and reject labels. - - switch (funct[name]) { - case 'becoming': - warn('unexpected_a', token); - funct[name] = 'var'; - break; - case 'unused': - funct[name] = 'var'; - break; - case 'unparam': - funct[name] = 'parameter'; - break; - case 'unction': - funct[name] = 'function'; - break; - case 'label': - warn('a_label', token, name); - break; - } - -// If the name is already defined in the current -// function, but not as outer, then there is a scope error. - - } else { - switch (funct[name]) { - case 'closure': - case 'function': - case 'var': - case 'unused': - warn('a_scope', token, name); - break; - case 'label': - warn('a_label', token, name); - break; - case 'outer': - case 'global': - break; - default: - -// If the name is defined in an outer function, make an outer entry, and if -// it was unused, make it var. - - switch (site[name]) { - case 'becoming': - case 'closure': - case 'function': - case 'parameter': - case 'unction': - case 'unused': - case 'var': - site[name] = 'closure'; - funct[name] = site === global_funct - ? 'global' - : 'outer'; - break; - case 'unparam': - site[name] = 'parameter'; - funct[name] = 'outer'; - break; - case 'undef': - funct[name] = 'undef'; - break; - case 'label': - warn('a_label', token, name); - break; - } - } - } - return this; - }, - led: function () { - stop('expected_operator_a'); - } - }; - -// Build the syntax table by declaring the syntactic elements. - - type('(array)', 'array'); - type('(color)', 'color'); - type('(function)', 'function'); - type('(number)', 'number', return_this); - type('(object)', 'object'); - type('(string)', 'string', return_this); - type('(boolean)', 'boolean', return_this); - type('(range)', 'range'); - type('(regexp)', 'regexp', return_this); - - ultimate('(begin)'); - ultimate('(end)'); - ultimate('(error)'); - postscript(symbol(''); - postscript(symbol('}')); - symbol(')'); - symbol(']'); - postscript(symbol('"')); - postscript(symbol('\'')); - symbol(';'); - symbol(':'); - symbol(','); - symbol('#'); - symbol('@'); - symbol('*/'); - postscript(reserve('case')); - reserve('catch'); - postscript(reserve('default')); - reserve('else'); - reserve('finally'); - - reservevar('arguments', function (x) { - if (strict_mode && funct === global_funct) { - warn('strict', x); - } else if (option.safe) { - warn('adsafe_a', x); - } - funct['(arguments)'] = true; - }); - reservevar('eval', function (x) { - if (option.safe) { - warn('adsafe_a', x); - } - }); - constant('false', 'boolean'); - constant('Infinity', 'number'); - constant('NaN', 'number'); - constant('null', ''); - reservevar('this', function (x) { - if (option.safe) { - warn('adsafe_a', x); - } else if (strict_mode && funct['(token)'].arity === 'statement' && - funct['(name)'].charAt(0) > 'Z') { - warn('strict', x); - } - }); - constant('true', 'boolean'); - constant('undefined', ''); - - infix('?', 30, function (left, that) { - step_in('?'); - that.first = expected_condition(expected_relation(left)); - that.second = expression(0); - spaces(); - step_out(); - var colon = next_token; - advance(':'); - step_in(':'); - spaces(); - that.third = expression(10); - that.arity = 'ternary'; - if (are_similar(that.second, that.third)) { - warn('weird_ternary', colon); - } else if (are_similar(that.first, that.second)) { - warn('use_or', that); - } - step_out(); - return that; - }); - - infix('||', 40, function (left, that) { - function paren_check(that) { - if (that.id === '&&' && !that.paren) { - warn('and', that); - } - return that; - } - - that.first = paren_check(expected_condition(expected_relation(left))); - that.second = paren_check(expected_relation(expression(40))); - if (are_similar(that.first, that.second)) { - warn('weird_condition', that); - } - return that; - }); - - infix('&&', 50, function (left, that) { - that.first = expected_condition(expected_relation(left)); - that.second = expected_relation(expression(50)); - if (are_similar(that.first, that.second)) { - warn('weird_condition', that); - } - return that; - }); - - prefix('void', function () { - this.first = expression(0); - this.arity = 'prefix'; - if (option.es5) { - warn('expected_a_b', this, 'undefined', 'void'); - } else if (this.first.number !== 0) { - warn('expected_a_b', this.first, '0', artifact(this.first)); - } - return this; - }); - - bitwise('|', 70); - bitwise('^', 80); - bitwise('&', 90); - - relation('==', '==='); - relation('==='); - relation('!=', '!=='); - relation('!=='); - relation('<'); - relation('>'); - relation('<='); - relation('>='); - - bitwise('<<', 120); - bitwise('>>', 120); - bitwise('>>>', 120); - - infix('in', 120, function (left, that) { - warn('infix_in', that); - that.left = left; - that.right = expression(130); - return that; - }); - infix('instanceof', 120); - infix('+', 130, function (left, that) { - if (left.id === '(number)') { - if (left.number === 0) { - warn('unexpected_a', left, '0'); - } - } else if (left.id === '(string)') { - if (left.string === '') { - warn('expected_a_b', left, 'String', '\'\''); - } - } - var right = expression(130); - if (right.id === '(number)') { - if (right.number === 0) { - warn('unexpected_a', right, '0'); - } - } else if (right.id === '(string)') { - if (right.string === '') { - warn('expected_a_b', right, 'String', '\'\''); - } - } - if (left.id === right.id) { - if (left.id === '(string)' || left.id === '(number)') { - if (left.id === '(string)') { - left.string += right.string; - if (jx.test(left.string)) { - warn('url', left); - } - } else { - left.number += right.number; - } - left.thru = right.thru; - return left; - } - } - that.first = left; - that.second = right; - return that; - }); - prefix('+', 'num'); - prefix('+++', function () { - warn('confusing_a', token); - this.first = expression(150); - this.arity = 'prefix'; - return this; - }); - infix('+++', 130, function (left) { - warn('confusing_a', token); - this.first = left; - this.second = expression(130); - return this; - }); - infix('-', 130, function (left, that) { - if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') { - warn('unexpected_a', left); - } - var right = expression(130); - if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') { - warn('unexpected_a', right); - } - if (left.id === right.id && left.id === '(number)') { - left.number -= right.number; - left.thru = right.thru; - return left; - } - that.first = left; - that.second = right; - return that; - }); - prefix('-'); - prefix('---', function () { - warn('confusing_a', token); - this.first = expression(150); - this.arity = 'prefix'; - return this; - }); - infix('---', 130, function (left) { - warn('confusing_a', token); - this.first = left; - this.second = expression(130); - return this; - }); - infix('*', 140, function (left, that) { - if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') { - warn('unexpected_a', left); - } - var right = expression(140); - if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') { - warn('unexpected_a', right); - } - if (left.id === right.id && left.id === '(number)') { - left.number *= right.number; - left.thru = right.thru; - return left; - } - that.first = left; - that.second = right; - return that; - }); - infix('/', 140, function (left, that) { - if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') { - warn('unexpected_a', left); - } - var right = expression(140); - if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') { - warn('unexpected_a', right); - } - if (left.id === right.id && left.id === '(number)') { - left.number /= right.number; - left.thru = right.thru; - return left; - } - that.first = left; - that.second = right; - return that; - }); - infix('%', 140, function (left, that) { - if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') { - warn('unexpected_a', left); - } - var right = expression(140); - if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') { - warn('unexpected_a', right); - } - if (left.id === right.id && left.id === '(number)') { - left.number %= right.number; - left.thru = right.thru; - return left; - } - that.first = left; - that.second = right; - return that; - }); - - suffix('++'); - prefix('++'); - - suffix('--'); - prefix('--'); - prefix('delete', function () { - one_space(); - var p = expression(0); - if (!p || (p.id !== '.' && p.id !== '[')) { - warn('deleted'); - } - this.first = p; - return this; - }); - - - prefix('~', function () { - no_space_only(); - if (!option.bitwise) { - warn('unexpected_a', this); - } - expression(150); - return this; - }); - prefix('!', function () { - no_space_only(); - this.first = expected_condition(expression(150)); - this.arity = 'prefix'; - if (bang[this.first.id] === true || this.first.assign) { - warn('confusing_a', this); - } - return this; - }); - prefix('typeof', null); - prefix('new', function () { - one_space(); - var c = expression(160), n, p, v; - this.first = c; - if (c.id !== 'function') { - if (c.identifier) { - switch (c.string) { - case 'Object': - warn('use_object', token); - break; - case 'Array': - if (next_token.id === '(') { - p = next_token; - p.first = this; - advance('('); - if (next_token.id !== ')') { - n = expression(0); - p.second = [n]; - if (n.id !== '(number)' || next_token.id === ',') { - warn('use_array', p); - } - while (next_token.id === ',') { - advance(','); - p.second.push(expression(0)); - } - } else { - warn('use_array', token); - } - advance(')', p); - return p; - } - warn('use_array', token); - break; - case 'Number': - case 'String': - case 'Boolean': - case 'Math': - case 'JSON': - warn('not_a_constructor', c); - break; - case 'Function': - if (!option.evil) { - warn('function_eval'); - } - break; - case 'Date': - case 'RegExp': - case 'this': - break; - default: - if (c.id !== 'function') { - v = c.string.charAt(0); - if (!option.newcap && (v < 'A' || v > 'Z')) { - warn('constructor_name_a', token); - } - } - } - } else { - if (c.id !== '.' && c.id !== '[' && c.id !== '(') { - warn('bad_constructor', token); - } - } - } else { - warn('weird_new', this); - } - if (next_token.id !== '(') { - warn('missing_a', next_token, '()'); - } - return this; - }); - - infix('(', 160, function (left, that) { - var p; - if (indent && indent.mode === 'expression') { - no_space(prev_token, token); - } else { - no_space_only(prev_token, token); - } - if (!left.immed && left.id === 'function') { - warn('wrap_immediate'); - } - p = []; - if (left.identifier) { - if (left.string.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { - if (left.string !== 'Number' && left.string !== 'String' && - left.string !== 'Boolean' && left.string !== 'Date') { - if (left.string === 'Math' || left.string === 'JSON') { - warn('not_a_function', left); - } else if (left.string === 'Object') { - warn('use_object', token); - } else if (left.string === 'Array' || !option.newcap) { - warn('missing_a', left, 'new'); - } - } - } - } else if (left.id === '.') { - if (option.safe && left.first.string === 'Math' && - left.second === 'random') { - warn('adsafe_a', left); - } else if (left.second.string === 'split' && - left.first.id === '(string)') { - warn('use_array', left.second); - } - } - step_in(); - if (next_token.id !== ')') { - no_space(); - for (;;) { - edge(); - p.push(expression(10)); - if (next_token.id !== ',') { - break; - } - comma(); - } - } - no_space(); - step_out(')', that); - if (typeof left === 'object') { - if (left.string === 'parseInt' && p.length === 1) { - warn('radix', left); - } - if (!option.evil) { - if (left.string === 'eval' || left.string === 'Function' || - left.string === 'execScript') { - warn('evil', left); - } else if (p[0] && p[0].id === '(string)' && - (left.string === 'setTimeout' || - left.string === 'setInterval')) { - warn('implied_evil', left); - } - } - if (!left.identifier && left.id !== '.' && left.id !== '[' && - left.id !== '(' && left.id !== '&&' && left.id !== '||' && - left.id !== '?') { - warn('bad_invocation', left); - } - } - that.first = left; - that.second = p; - return that; - }, true); - - prefix('(', function () { - step_in('expression'); - no_space(); - edge(); - if (next_token.id === 'function') { - next_token.immed = true; - } - var value = expression(0); - value.paren = true; - no_space(); - step_out(')', this); - if (value.id === 'function') { - switch (next_token.id) { - case '(': - warn('move_invocation'); - break; - case '.': - case '[': - warn('unexpected_a'); - break; - default: - warn('bad_wrap', this); - } - } - return value; - }); - - infix('.', 170, function (left, that) { - no_space(prev_token, token); - no_space(); - var name = identifier(); - if (typeof name === 'string') { - tally_property(name); - } - that.first = left; - that.second = token; - if (left && left.string === 'arguments' && - (name === 'callee' || name === 'caller')) { - warn('avoid_a', left, 'arguments.' + name); - } else if (!option.evil && left && left.string === 'document' && - (name === 'write' || name === 'writeln')) { - warn('write_is_wrong', left); - } else if (!option.stupid && name.indexOf('Sync') > 0) { - warn('sync_a', token); - } else if (option.adsafe) { - if (!adsafe_top && left.string === 'ADSAFE') { - if (name === 'id' || name === 'lib') { - warn('adsafe_a', that); - } else if (name === 'go') { - if (xmode !== 'script') { - warn('adsafe_a', that); - } else if (adsafe_went || next_token.id !== '(' || - peek(0).id !== '(string)' || - peek(0).string !== adsafe_id || - peek(1).id !== ',') { - stop('adsafe_a', that, 'go'); - } - adsafe_went = true; - adsafe_may = false; - } - } - adsafe_top = false; - } - if (!option.evil && (name === 'eval' || name === 'execScript')) { - warn('evil'); - } else if (option.safe) { - for (;;) { - if (banned[name] === true) { - warn('adsafe_a', token, name); - } - if (typeof predefined[left.string] !== 'boolean' || //// check for writeable - next_token.id === '(') { - break; - } - if (next_token.id !== '.') { - warn('adsafe_a', that); - break; - } - advance('.'); - token.first = that; - token.second = name; - that = token; - name = identifier(); - if (typeof name === 'string') { - tally_property(name); - } - } - } - return that; - }, true); - - infix('[', 170, function (left, that) { - var e, s; - no_space_only(prev_token, token); - no_space(); - step_in(); - edge(); - e = expression(0); - switch (e.id) { - case '(number)': - if (e.id === '(number)' && left.id === 'arguments') { - warn('use_param', left); - } - break; - case '(string)': - if (option.safe && (banned[e.string] || - e.string.charAt(0) === '_' || e.string.slice(-1) === '_')) { - warn('adsafe_subscript_a', e); - } else if (!option.evil && - (e.string === 'eval' || e.string === 'execScript')) { - warn('evil', e); - } else if (!option.sub && ix.test(e.string)) { - s = syntax[e.string]; - if (!s || !s.reserved) { - warn('subscript', e); - } - } - tally_property(e.string); - break; - default: - if (option.safe) { - warn('adsafe_subscript_a', e); - } - } - step_out(']', that); - no_space(prev_token, token); - that.first = left; - that.second = e; - return that; - }, true); - - prefix('[', function () { - this.arity = 'prefix'; - this.first = []; - step_in('array'); - while (next_token.id !== '(end)') { - while (next_token.id === ',') { - warn('unexpected_a', next_token); - advance(','); - } - if (next_token.id === ']') { - break; - } - indent.wrap = false; - edge(); - this.first.push(expression(10)); - if (next_token.id === ',') { - comma(); - if (next_token.id === ']' && !option.es5) { - warn('unexpected_a', token); - break; - } - } else { - break; - } - } - step_out(']', this); - return this; - }, 170); - - - function property_name() { - var id = optional_identifier(true); - if (!id) { - if (next_token.id === '(string)') { - id = next_token.string; - if (option.safe) { - if (banned[id]) { - warn('adsafe_a'); - } else if (id.charAt(0) === '_' || - id.charAt(id.length - 1) === '_') { - warn('dangling_a'); - } - } - advance(); - } else if (next_token.id === '(number)') { - id = next_token.number.toString(); - advance(); - } - } - return id; - } - - - function function_params() { - var id, paren = next_token, params = []; - advance('('); - step_in(); - no_space(); - if (next_token.id === ')') { - no_space(); - step_out(')', paren); - return params; - } - for (;;) { - edge(); - id = identifier(); - params.push(token); - add_label(token, option.unparam ? 'parameter' : 'unparam'); - if (next_token.id === ',') { - comma(); - } else { - no_space(); - step_out(')', paren); - return params; - } - } - } - - - - function do_function(func, name) { - var old_funct = funct, - old_option = option, - old_scope = scope; - funct = { - '(name)' : name || '\'' + (anonname || '').replace(nx, sanitize) + '\'', - '(line)' : next_token.line, - '(context)' : old_funct, - '(breakage)' : 0, - '(loopage)' : 0, - '(scope)' : scope, - '(token)' : func - }; - option = Object.create(old_option); - scope = Object.create(old_scope); - functions.push(funct); - func.name = name; - if (name) { - add_label(func, 'function', name); - } - func.writeable = false; - func.first = funct['(params)'] = function_params(); - one_space(); - func.block = block(false); - if (funct['(arguments)']) { - func.first.forEach(function (value) { - if (value.assign) { - warn('parameter_arguments_a', value, value.string); - } - }); - } - funct = old_funct; - option = old_option; - scope = old_scope; - } - - - assignop('='); - assignop('+=', '+'); - assignop('-=', '-'); - assignop('*=', '*'); - assignop('/=', '/').nud = function () { - stop('slash_equal'); - }; - assignop('%=', '%'); - assignop('&=', '&'); - assignop('|=', '|'); - assignop('^=', '^'); - assignop('<<=', '<<'); - assignop('>>=', '>>'); - assignop('>>>=', '>>>'); - - - prefix('{', function () { - var get, i, j, name, p, set, seen = {}; - this.arity = 'prefix'; - this.first = []; - step_in(); - while (next_token.id !== '}') { - indent.wrap = false; - -// JSLint recognizes the ES5 extension for get/set in object literals, -// but requires that they be used in pairs. - - edge(); - if (next_token.string === 'get' && peek().id !== ':') { - if (!option.es5) { - warn('es5'); - } - get = next_token; - advance('get'); - one_space_only(); - name = next_token; - i = property_name(); - if (!i) { - stop('missing_property'); - } - get.string = ''; - do_function(get); - if (funct['(loopage)']) { - warn('function_loop', get); - } - p = get.first; - if (p && p.length) { - warn('parameter_a_get_b', p[0], p[0].string, i); - } - comma(); - set = next_token; - spaces(); - edge(); - advance('set'); - set.string = ''; - one_space_only(); - j = property_name(); - if (i !== j) { - stop('expected_a_b', token, i, j || next_token.string); - } - do_function(set); - if (set.block.length === 0) { - warn('missing_a', token, 'throw'); - } - p = set.first; - if (!p || p.length !== 1) { - stop('parameter_set_a', set, 'value'); - } else if (p[0].string !== 'value') { - stop('expected_a_b', p[0], 'value', p[0].string); - } - name.first = [get, set]; - } else { - name = next_token; - i = property_name(); - if (typeof i !== 'string') { - stop('missing_property'); - } - advance(':'); - spaces(); - name.first = expression(10); - } - this.first.push(name); - if (seen[i] === true) { - warn('duplicate_a', next_token, i); - } - seen[i] = true; - tally_property(i); - if (next_token.id !== ',') { - break; - } - for (;;) { - comma(); - if (next_token.id !== ',') { - break; - } - warn('unexpected_a', next_token); - } - if (next_token.id === '}' && !option.es5) { - warn('unexpected_a', token); - } - } - step_out('}', this); - return this; - }); - - stmt('{', function () { - warn('statement_block'); - this.arity = 'statement'; - this.block = statements(); - this.disrupt = this.block.disrupt; - advance('}', this); - return this; - }); - - stmt('/*global', directive); - stmt('/*globals', directive); - stmt('/*jslint', directive); - stmt('/*member', directive); - stmt('/*members', directive); - stmt('/*property', directive); - stmt('/*properties', directive); - - stmt('var', function () { - -// JavaScript does not have block scope. It only has function scope. So, -// declaring a variable in a block can have unexpected consequences. - -// var.first will contain an array, the array containing name tokens -// and assignment tokens. - - var assign, id, name; - - if (funct['(vars)'] && !option.vars) { - warn('combine_var'); - } else if (funct !== global_funct) { - funct['(vars)'] = true; - } - this.arity = 'statement'; - this.first = []; - step_in('var'); - for (;;) { - name = next_token; - id = identifier(); - add_label(name, 'becoming'); - - if (next_token.id === '=') { - assign = next_token; - assign.first = name; - spaces(); - advance('='); - spaces(); - if (next_token.id === 'undefined') { - warn('unnecessary_initialize', token, id); - } - if (peek(0).id === '=' && next_token.identifier) { - stop('var_a_not'); - } - assign.second = expression(0); - assign.arity = 'infix'; - this.first.push(assign); - } else { - this.first.push(name); - } - if (funct[id] === 'becoming') { - funct[id] = 'unused'; - } - if (next_token.id !== ',') { - break; - } - comma(); - indent.wrap = false; - if (var_mode && next_token.line === token.line && - this.first.length === 1) { - var_mode = null; - indent.open = false; - indent.at -= option.indent; - } - spaces(); - edge(); - } - var_mode = null; - step_out(); - return this; - }); - - stmt('function', function () { - one_space(); - if (in_block) { - warn('function_block', token); - } - var name = next_token, id = identifier(); - add_label(name, 'unction'); - no_space(); - this.arity = 'statement'; - do_function(this, id); - if (next_token.id === '(' && next_token.line === token.line) { - stop('function_statement'); - } - return this; - }); - - prefix('function', function () { - if (!option.anon) { - one_space(); - } - var id = optional_identifier(); - if (id) { - no_space(); - } else { - id = ''; - } - do_function(this, id); - if (funct['(loopage)']) { - warn('function_loop'); - } - switch (next_token.id) { - case ';': - case '(': - case ')': - case ',': - case ']': - case '}': - case ':': - break; - case '.': - if (peek().string !== 'bind' || peek(1).id !== '(') { - warn('unexpected_a'); - } - break; - default: - stop('unexpected_a'); - } - this.arity = 'function'; - return this; - }); - - stmt('if', function () { - var paren = next_token; - one_space(); - advance('('); - step_in('control'); - no_space(); - edge(); - this.arity = 'statement'; - this.first = expected_condition(expected_relation(expression(0))); - no_space(); - step_out(')', paren); - one_space(); - this.block = block(true); - if (next_token.id === 'else') { - one_space(); - advance('else'); - one_space(); - this['else'] = next_token.id === 'if' || next_token.id === 'switch' - ? statement(true) - : block(true); - if (this['else'].disrupt && this.block.disrupt) { - this.disrupt = true; - } - } - return this; - }); - - stmt('try', function () { - -// try.first The catch variable -// try.second The catch clause -// try.third The finally clause -// try.block The try block - - var exception_variable, old_scope, paren; - if (option.adsafe) { - warn('adsafe_a', this); - } - one_space(); - this.arity = 'statement'; - this.block = block(false); - if (next_token.id === 'catch') { - one_space(); - advance('catch'); - one_space(); - paren = next_token; - advance('('); - step_in('control'); - no_space(); - edge(); - old_scope = scope; - scope = Object.create(old_scope); - exception_variable = next_token.string; - this.first = exception_variable; - if (!next_token.identifier) { - warn('expected_identifier_a', next_token); - } else { - add_label(next_token, 'exception'); - } - advance(); - no_space(); - step_out(')', paren); - one_space(); - this.second = block(false); - scope = old_scope; - } - if (next_token.id === 'finally') { - one_space(); - advance('finally'); - one_space(); - this.third = block(false); - } else if (!this.second) { - stop('expected_a_b', next_token, 'catch', artifact()); - } - return this; - }); - - labeled_stmt('while', function () { - one_space(); - var paren = next_token; - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - advance('('); - step_in('control'); - no_space(); - edge(); - this.arity = 'statement'; - this.first = expected_relation(expression(0)); - if (this.first.id !== 'true') { - expected_condition(this.first, bundle.unexpected_a); - } - no_space(); - step_out(')', paren); - one_space(); - this.block = block(true); - if (this.block.disrupt) { - warn('strange_loop', prev_token); - } - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - }); - - reserve('with'); - - labeled_stmt('switch', function () { - -// switch.first the switch expression -// switch.second the array of cases. A case is 'case' or 'default' token: -// case.first the array of case expressions -// case.second the array of statements -// If all of the arrays of statements are disrupt, then the switch is disrupt. - - var cases = [], - old_in_block = in_block, - particular, - the_case = next_token, - unbroken = true; - - function find_duplicate_case(value) { - if (are_similar(particular, value)) { - warn('duplicate_a', value); - } - } - - funct['(breakage)'] += 1; - one_space(); - advance('('); - no_space(); - step_in(); - this.arity = 'statement'; - this.first = expected_condition(expected_relation(expression(0))); - no_space(); - step_out(')', the_case); - one_space(); - advance('{'); - step_in(); - in_block = true; - this.second = []; - while (next_token.id === 'case') { - the_case = next_token; - cases.forEach(find_duplicate_case); - the_case.first = []; - the_case.arity = 'case'; - spaces(); - edge('case'); - advance('case'); - for (;;) { - one_space(); - particular = expression(0); - cases.forEach(find_duplicate_case); - cases.push(particular); - the_case.first.push(particular); - if (particular.id === 'NaN') { - warn('unexpected_a', particular); - } - no_space_only(); - advance(':'); - if (next_token.id !== 'case') { - break; - } - spaces(); - edge('case'); - advance('case'); - } - spaces(); - the_case.second = statements(); - if (the_case.second && the_case.second.length > 0) { - particular = the_case.second[the_case.second.length - 1]; - if (particular.disrupt) { - if (particular.id === 'break') { - unbroken = false; - } - } else { - warn('missing_a_after_b', next_token, 'break', 'case'); - } - } else { - warn('empty_case'); - } - this.second.push(the_case); - } - if (this.second.length === 0) { - warn('missing_a', next_token, 'case'); - } - if (next_token.id === 'default') { - spaces(); - the_case = next_token; - the_case.arity = 'case'; - edge('case'); - advance('default'); - no_space_only(); - advance(':'); - spaces(); - the_case.second = statements(); - if (the_case.second && the_case.second.length > 0) { - particular = the_case.second[the_case.second.length - 1]; - if (unbroken && particular.disrupt && particular.id !== 'break') { - this.disrupt = true; - } - } - this.second.push(the_case); - } - funct['(breakage)'] -= 1; - spaces(); - step_out('}', this); - in_block = old_in_block; - return this; - }); - - stmt('debugger', function () { - if (!option.debug) { - warn('unexpected_a', this); - } - this.arity = 'statement'; - return this; - }); - - labeled_stmt('do', function () { - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - one_space(); - this.arity = 'statement'; - this.block = block(true); - if (this.block.disrupt) { - warn('strange_loop', prev_token); - } - one_space(); - advance('while'); - var paren = next_token; - one_space(); - advance('('); - step_in(); - no_space(); - edge(); - this.first = expected_condition(expected_relation(expression(0)), bundle.unexpected_a); - no_space(); - step_out(')', paren); - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - }); - - labeled_stmt('for', function () { - - var blok, filter, ok = false, paren = next_token, value; - this.arity = 'statement'; - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - advance('('); - if (next_token.id === ';') { - no_space(); - advance(';'); - no_space(); - advance(';'); - no_space(); - advance(')'); - blok = block(true); - } else { - step_in('control'); - spaces(this, paren); - no_space(); - if (next_token.id === 'var') { - stop('move_var'); - } - edge(); - if (peek(0).id === 'in') { - this.forin = true; - value = next_token; - switch (funct[value.string]) { - case 'unused': - funct[value.string] = 'var'; - break; - case 'closure': - case 'var': - break; - default: - warn('bad_in_a', value); - } - advance(); - advance('in'); - this.first = value; - this.second = expression(20); - step_out(')', paren); - blok = block(true); - if (!option.forin) { - if (blok.length === 1 && typeof blok[0] === 'object' && - blok[0].string === 'if' && !blok[0]['else']) { - filter = blok[0].first; - while (filter.id === '&&') { - filter = filter.first; - } - switch (filter.id) { - case '===': - case '!==': - ok = filter.first.id === '[' - ? filter.first.first.string === this.second.string && - filter.first.second.string === this.first.string - : filter.first.id === 'typeof' && - filter.first.first.id === '[' && - filter.first.first.first.string === this.second.string && - filter.first.first.second.string === this.first.string; - break; - case '(': - ok = filter.first.id === '.' && (( - filter.first.first.string === this.second.string && - filter.first.second.string === 'hasOwnProperty' && - filter.second[0].string === this.first.string - ) || ( - filter.first.first.string === 'ADSAFE' && - filter.first.second.string === 'has' && - filter.second[0].string === this.second.string && - filter.second[1].string === this.first.string - ) || ( - filter.first.first.id === '.' && - filter.first.first.first.id === '.' && - filter.first.first.first.first.string === 'Object' && - filter.first.first.first.second.string === 'prototype' && - filter.first.first.second.string === 'hasOwnProperty' && - filter.first.second.string === 'call' && - filter.second[0].string === this.second.string && - filter.second[1].string === this.first.string - )); - break; - } - } - if (!ok) { - warn('for_if', this); - } - } - } else { - edge(); - this.first = []; - for (;;) { - this.first.push(expression(0, 'for')); - if (next_token.id !== ',') { - break; - } - comma(); - } - semicolon(); - edge(); - this.second = expected_relation(expression(0)); - if (this.second.id !== 'true') { - expected_condition(this.second, bundle.unexpected_a); - } - semicolon(token); - if (next_token.id === ';') { - stop('expected_a_b', next_token, ')', ';'); - } - this.third = []; - edge(); - for (;;) { - this.third.push(expression(0, 'for')); - if (next_token.id !== ',') { - break; - } - comma(); - } - no_space(); - step_out(')', paren); - one_space(); - blok = block(true); - } - } - if (blok.disrupt) { - warn('strange_loop', prev_token); - } - this.block = blok; - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - }); - - disrupt_stmt('break', function () { - var label = next_token.string; - this.arity = 'statement'; - if (funct['(breakage)'] === 0) { - warn('unexpected_a', this); - } - if (next_token.identifier && token.line === next_token.line) { - one_space_only(); - if (funct[label] !== 'label') { - warn('not_a_label', next_token); - } else if (scope[label].funct !== funct) { - warn('not_a_scope', next_token); - } - this.first = next_token; - advance(); - } - return this; - }); - - disrupt_stmt('continue', function () { - if (!option['continue']) { - warn('unexpected_a', this); - } - var label = next_token.string; - this.arity = 'statement'; - if (funct['(breakage)'] === 0) { - warn('unexpected_a', this); - } - if (next_token.identifier && token.line === next_token.line) { - one_space_only(); - if (funct[label] !== 'label') { - warn('not_a_label', next_token); - } else if (scope[label].funct !== funct) { - warn('not_a_scope', next_token); - } - this.first = next_token; - advance(); - } - return this; - }); - - disrupt_stmt('return', function () { - if (funct === global_funct && xmode !== 'scriptstring') { - warn('unexpected_a', this); - } - this.arity = 'statement'; - if (next_token.id !== ';' && next_token.line === token.line) { - one_space_only(); - if (next_token.id === '/' || next_token.id === '(regexp)') { - warn('wrap_regexp'); - } - this.first = expression(20); - } - if (peek(0).id === '}' && peek(1).id === 'else') { - warn('unexpected_else', this); - } - return this; - }); - - disrupt_stmt('throw', function () { - this.arity = 'statement'; - one_space_only(); - this.first = expression(20); - return this; - }); - - -// Superfluous reserved words - - reserve('class'); - reserve('const'); - reserve('enum'); - reserve('export'); - reserve('extends'); - reserve('import'); - reserve('super'); - -// Harmony reserved words - - reserve('implements'); - reserve('interface'); - reserve('let'); - reserve('package'); - reserve('private'); - reserve('protected'); - reserve('public'); - reserve('static'); - reserve('yield'); - - -// Parse JSON - - function json_value() { - - function json_object() { - var brace = next_token, object = {}; - advance('{'); - if (next_token.id !== '}') { - while (next_token.id !== '(end)') { - while (next_token.id === ',') { - warn('unexpected_a', next_token); - advance(','); - } - if (next_token.id !== '(string)') { - warn('expected_string_a'); - } - if (object[next_token.string] === true) { - warn('duplicate_a'); - } else if (next_token.string === '__proto__') { - warn('dangling_a'); - } else { - object[next_token.string] = true; - } - advance(); - advance(':'); - json_value(); - if (next_token.id !== ',') { - break; - } - advance(','); - if (next_token.id === '}') { - warn('unexpected_a', token); - break; - } - } - } - advance('}', brace); - } - - function json_array() { - var bracket = next_token; - advance('['); - if (next_token.id !== ']') { - while (next_token.id !== '(end)') { - while (next_token.id === ',') { - warn('unexpected_a', next_token); - advance(','); - } - json_value(); - if (next_token.id !== ',') { - break; - } - advance(','); - if (next_token.id === ']') { - warn('unexpected_a', token); - break; - } - } - } - advance(']', bracket); - } - - switch (next_token.id) { - case '{': - json_object(); - break; - case '[': - json_array(); - break; - case 'true': - case 'false': - case 'null': - case '(number)': - case '(string)': - advance(); - break; - case '-': - advance('-'); - no_space_only(); - advance('(number)'); - break; - default: - stop('unexpected_a'); - } - } - - -// CSS parsing. - - function css_name() { - if (next_token.identifier) { - advance(); - return true; - } - } - - - function css_number() { - if (next_token.id === '-') { - advance('-'); - no_space_only(); - } - if (next_token.id === '(number)') { - advance('(number)'); - return true; - } - } - - - function css_string() { - if (next_token.id === '(string)') { - advance(); - return true; - } - } - - function css_color() { - var i, number, paren, value; - if (next_token.identifier) { - value = next_token.string; - if (value === 'rgb' || value === 'rgba') { - advance(); - paren = next_token; - advance('('); - for (i = 0; i < 3; i += 1) { - if (i) { - comma(); - } - number = next_token.number; - if (next_token.id !== '(number)' || number < 0) { - warn('expected_positive_a', next_token); - advance(); - } else { - advance(); - if (next_token.id === '%') { - advance('%'); - if (number > 100) { - warn('expected_percent_a', token, number); - } - } else { - if (number > 255) { - warn('expected_small_a', token, number); - } - } - } - } - if (value === 'rgba') { - comma(); - number = next_token.number; - if (next_token.id !== '(number)' || number < 0 || number > 1) { - warn('expected_fraction_a', next_token); - } - advance(); - if (next_token.id === '%') { - warn('unexpected_a'); - advance('%'); - } - } - advance(')', paren); - return true; - } - if (css_colorData[next_token.string] === true) { - advance(); - return true; - } - } else if (next_token.id === '(color)') { - advance(); - return true; - } - return false; - } - - - function css_length() { - if (next_token.id === '-') { - advance('-'); - no_space_only(); - } - if (next_token.id === '(number)') { - advance(); - if (next_token.id !== '(string)' && - css_lengthData[next_token.string] === true) { - no_space_only(); - advance(); - } else if (+token.number !== 0) { - warn('expected_linear_a'); - } - return true; - } - return false; - } - - - function css_line_height() { - if (next_token.id === '-') { - advance('-'); - no_space_only(); - } - if (next_token.id === '(number)') { - advance(); - if (next_token.id !== '(string)' && - css_lengthData[next_token.string] === true) { - no_space_only(); - advance(); - } - return true; - } - return false; - } - - - function css_width() { - if (next_token.identifier) { - switch (next_token.string) { - case 'thin': - case 'medium': - case 'thick': - advance(); - return true; - } - } else { - return css_length(); - } - } - - - function css_margin() { - if (next_token.identifier) { - if (next_token.string === 'auto') { - advance(); - return true; - } - } else { - return css_length(); - } - } - - function css_attr() { - if (next_token.identifier && next_token.string === 'attr') { - advance(); - advance('('); - if (!next_token.identifier) { - warn('expected_name_a'); - } - advance(); - advance(')'); - return true; - } - return false; - } - - - function css_comma_list() { - while (next_token.id !== ';') { - if (!css_name() && !css_string()) { - warn('expected_name_a'); - } - if (next_token.id !== ',') { - return true; - } - comma(); - } - } - - - function css_counter() { - if (next_token.identifier && next_token.string === 'counter') { - advance(); - advance('('); - advance(); - if (next_token.id === ',') { - comma(); - if (next_token.id !== '(string)') { - warn('expected_string_a'); - } - advance(); - } - advance(')'); - return true; - } - if (next_token.identifier && next_token.string === 'counters') { - advance(); - advance('('); - if (!next_token.identifier) { - warn('expected_name_a'); - } - advance(); - if (next_token.id === ',') { - comma(); - if (next_token.id !== '(string)') { - warn('expected_string_a'); - } - advance(); - } - if (next_token.id === ',') { - comma(); - if (next_token.id !== '(string)') { - warn('expected_string_a'); - } - advance(); - } - advance(')'); - return true; - } - return false; - } - - - function css_radius() { - return css_length() && (next_token.id !== '(number)' || css_length()); - } - - - function css_shape() { - var i; - if (next_token.identifier && next_token.string === 'rect') { - advance(); - advance('('); - for (i = 0; i < 4; i += 1) { - if (!css_length()) { - warn('expected_number_a'); - break; - } - } - advance(')'); - return true; - } - return false; - } - - - function css_url() { - var c, url; - if (next_token.identifier && next_token.string === 'url') { - next_token = lex.range('(', ')'); - url = next_token.string; - c = url.charAt(0); - if (c === '"' || c === '\'') { - if (url.slice(-1) !== c) { - warn('bad_url_a'); - } else { - url = url.slice(1, -1); - if (url.indexOf(c) >= 0) { - warn('bad_url_a'); - } - } - } - if (!url) { - warn('missing_url'); - } - if (ux.test(url)) { - stop('bad_url_a'); - } - urls.push(url); - advance(); - return true; - } - return false; - } - - - css_any = [css_url, function () { - for (;;) { - if (next_token.identifier) { - switch (next_token.string.toLowerCase()) { - case 'url': - css_url(); - break; - case 'expression': - warn('unexpected_a'); - advance(); - break; - default: - advance(); - } - } else { - if (next_token.id === ';' || next_token.id === '!' || - next_token.id === '(end)' || next_token.id === '}') { - return true; - } - advance(); - } - } - }]; - - - function font_face() { - advance_identifier('font-family'); - advance(':'); - if (!css_name() && !css_string()) { - stop('expected_name_a'); - } - semicolon(); - advance_identifier('src'); - advance(':'); - while (true) { - if (next_token.string === 'local') { - advance_identifier('local'); - advance('('); - if (ux.test(next_token.string)) { - stop('bad_url_a'); - } - - if (!css_name() && !css_string()) { - stop('expected_name_a'); - } - advance(')'); - } else if (!css_url()) { - stop('expected_a_b', next_token, 'url', artifact()); - } - if (next_token.id !== ',') { - break; - } - comma(); - } - semicolon(); - } - - - css_border_style = [ - 'none', 'dashed', 'dotted', 'double', 'groove', - 'hidden', 'inset', 'outset', 'ridge', 'solid' - ]; - - css_break = [ - 'auto', 'always', 'avoid', 'left', 'right' - ]; - - css_media = { - 'all': true, - 'braille': true, - 'embossed': true, - 'handheld': true, - 'print': true, - 'projection': true, - 'screen': true, - 'speech': true, - 'tty': true, - 'tv': true - }; - - css_overflow = [ - 'auto', 'hidden', 'scroll', 'visible' - ]; - - css_attribute_data = { - background: [ - true, 'background-attachment', 'background-color', - 'background-image', 'background-position', 'background-repeat' - ], - 'background-attachment': ['scroll', 'fixed'], - 'background-color': ['transparent', css_color], - 'background-image': ['none', css_url], - 'background-position': [ - 2, [css_length, 'top', 'bottom', 'left', 'right', 'center'] - ], - 'background-repeat': [ - 'repeat', 'repeat-x', 'repeat-y', 'no-repeat' - ], - 'border': [true, 'border-color', 'border-style', 'border-width'], - 'border-bottom': [ - true, 'border-bottom-color', 'border-bottom-style', - 'border-bottom-width' - ], - 'border-bottom-color': css_color, - 'border-bottom-left-radius': css_radius, - 'border-bottom-right-radius': css_radius, - 'border-bottom-style': css_border_style, - 'border-bottom-width': css_width, - 'border-collapse': ['collapse', 'separate'], - 'border-color': ['transparent', 4, css_color], - 'border-left': [ - true, 'border-left-color', 'border-left-style', 'border-left-width' - ], - 'border-left-color': css_color, - 'border-left-style': css_border_style, - 'border-left-width': css_width, - 'border-radius': function () { - function count(separator) { - var n = 1; - if (separator) { - advance(separator); - } - if (!css_length()) { - return false; - } - while (next_token.id === '(number)') { - if (!css_length()) { - return false; - } - n += 1; - } - if (n > 4) { - warn('bad_style'); - } - return true; - } - - return count() && (next_token.id !== '/' || count('/')); - }, - 'border-right': [ - true, 'border-right-color', 'border-right-style', - 'border-right-width' - ], - 'border-right-color': css_color, - 'border-right-style': css_border_style, - 'border-right-width': css_width, - 'border-spacing': [2, css_length], - 'border-style': [4, css_border_style], - 'border-top': [ - true, 'border-top-color', 'border-top-style', 'border-top-width' - ], - 'border-top-color': css_color, - 'border-top-left-radius': css_radius, - 'border-top-right-radius': css_radius, - 'border-top-style': css_border_style, - 'border-top-width': css_width, - 'border-width': [4, css_width], - bottom: [css_length, 'auto'], - 'caption-side' : ['bottom', 'left', 'right', 'top'], - clear: ['both', 'left', 'none', 'right'], - clip: [css_shape, 'auto'], - color: css_color, - content: [ - 'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote', - css_string, css_url, css_counter, css_attr - ], - 'counter-increment': [ - css_name, 'none' - ], - 'counter-reset': [ - css_name, 'none' - ], - cursor: [ - css_url, 'auto', 'crosshair', 'default', 'e-resize', 'help', 'move', - 'n-resize', 'ne-resize', 'nw-resize', 'pointer', 's-resize', - 'se-resize', 'sw-resize', 'w-resize', 'text', 'wait' - ], - direction: ['ltr', 'rtl'], - display: [ - 'block', 'compact', 'inline', 'inline-block', 'inline-table', - 'list-item', 'marker', 'none', 'run-in', 'table', 'table-caption', - 'table-cell', 'table-column', 'table-column-group', - 'table-footer-group', 'table-header-group', 'table-row', - 'table-row-group' - ], - 'empty-cells': ['show', 'hide'], - 'float': ['left', 'none', 'right'], - font: [ - 'caption', 'icon', 'menu', 'message-box', 'small-caption', - 'status-bar', true, 'font-size', 'font-style', 'font-weight', - 'font-family' - ], - 'font-family': css_comma_list, - 'font-size': [ - 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', - 'xx-large', 'larger', 'smaller', css_length - ], - 'font-size-adjust': ['none', css_number], - 'font-stretch': [ - 'normal', 'wider', 'narrower', 'ultra-condensed', - 'extra-condensed', 'condensed', 'semi-condensed', - 'semi-expanded', 'expanded', 'extra-expanded' - ], - 'font-style': [ - 'normal', 'italic', 'oblique' - ], - 'font-variant': [ - 'normal', 'small-caps' - ], - 'font-weight': [ - 'normal', 'bold', 'bolder', 'lighter', css_number - ], - height: [css_length, 'auto'], - left: [css_length, 'auto'], - 'letter-spacing': ['normal', css_length], - 'line-height': ['normal', css_line_height], - 'list-style': [ - true, 'list-style-image', 'list-style-position', 'list-style-type' - ], - 'list-style-image': ['none', css_url], - 'list-style-position': ['inside', 'outside'], - 'list-style-type': [ - 'circle', 'disc', 'square', 'decimal', 'decimal-leading-zero', - 'lower-roman', 'upper-roman', 'lower-greek', 'lower-alpha', - 'lower-latin', 'upper-alpha', 'upper-latin', 'hebrew', 'katakana', - 'hiragana-iroha', 'katakana-oroha', 'none' - ], - margin: [4, css_margin], - 'margin-bottom': css_margin, - 'margin-left': css_margin, - 'margin-right': css_margin, - 'margin-top': css_margin, - 'marker-offset': [css_length, 'auto'], - 'max-height': [css_length, 'none'], - 'max-width': [css_length, 'none'], - 'min-height': css_length, - 'min-width': css_length, - opacity: css_number, - outline: [true, 'outline-color', 'outline-style', 'outline-width'], - 'outline-color': ['invert', css_color], - 'outline-style': [ - 'dashed', 'dotted', 'double', 'groove', 'inset', 'none', - 'outset', 'ridge', 'solid' - ], - 'outline-width': css_width, - overflow: css_overflow, - 'overflow-x': css_overflow, - 'overflow-y': css_overflow, - padding: [4, css_length], - 'padding-bottom': css_length, - 'padding-left': css_length, - 'padding-right': css_length, - 'padding-top': css_length, - 'page-break-after': css_break, - 'page-break-before': css_break, - position: ['absolute', 'fixed', 'relative', 'static'], - quotes: [8, css_string], - right: [css_length, 'auto'], - 'table-layout': ['auto', 'fixed'], - 'text-align': ['center', 'justify', 'left', 'right'], - 'text-decoration': [ - 'none', 'underline', 'overline', 'line-through', 'blink' - ], - 'text-indent': css_length, - 'text-shadow': ['none', 4, [css_color, css_length]], - 'text-transform': ['capitalize', 'uppercase', 'lowercase', 'none'], - top: [css_length, 'auto'], - 'unicode-bidi': ['normal', 'embed', 'bidi-override'], - 'vertical-align': [ - 'baseline', 'bottom', 'sub', 'super', 'top', 'text-top', 'middle', - 'text-bottom', css_length - ], - visibility: ['visible', 'hidden', 'collapse'], - 'white-space': [ - 'normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'inherit' - ], - width: [css_length, 'auto'], - 'word-spacing': ['normal', css_length], - 'word-wrap': ['break-word', 'normal'], - 'z-index': ['auto', css_number] - }; - - function style_attribute() { - var v; - while (next_token.id === '*' || next_token.id === '#' || - next_token.string === '_') { - if (!option.css) { - warn('unexpected_a'); - } - advance(); - } - if (next_token.id === '-') { - if (!option.css) { - warn('unexpected_a'); - } - advance('-'); - if (!next_token.identifier) { - warn('expected_nonstandard_style_attribute'); - } - advance(); - return css_any; - } - if (!next_token.identifier) { - warn('expected_style_attribute'); - } else { - if (Object.prototype.hasOwnProperty.call(css_attribute_data, - next_token.string)) { - v = css_attribute_data[next_token.string]; - } else { - v = css_any; - if (!option.css) { - warn('unrecognized_style_attribute_a'); - } - } - } - advance(); - return v; - } - - - function style_value(v) { - var i = 0, - n, - once, - match, - round, - start = 0, - vi; - switch (typeof v) { - case 'function': - return v(); - case 'string': - if (next_token.identifier && next_token.string === v) { - advance(); - return true; - } - return false; - } - for (;;) { - if (i >= v.length) { - return false; - } - vi = v[i]; - i += 1; - if (typeof vi === 'boolean') { - break; - } else if (typeof vi === 'number') { - n = vi; - vi = v[i]; - i += 1; - } else { - n = 1; - } - match = false; - while (n > 0) { - if (style_value(vi)) { - match = true; - n -= 1; - } else { - break; - } - } - if (match) { - return true; - } - } - start = i; - once = []; - for (;;) { - round = false; - for (i = start; i < v.length; i += 1) { - if (!once[i]) { - if (style_value(css_attribute_data[v[i]])) { - match = true; - round = true; - once[i] = true; - break; - } - } - } - if (!round) { - return match; - } - } - } - - function style_child() { - if (next_token.id === '(number)') { - advance(); - if (next_token.string === 'n' && next_token.identifier) { - no_space_only(); - advance(); - if (next_token.id === '+') { - no_space_only(); - advance('+'); - no_space_only(); - advance('(number)'); - } - } - return; - } - if (next_token.identifier && - (next_token.string === 'odd' || next_token.string === 'even')) { - advance(); - return; - } - warn('unexpected_a'); - } - - function substyle() { - var v; - for (;;) { - if (next_token.id === '}' || next_token.id === '(end)' || - (xquote && next_token.id === xquote)) { - return; - } - v = style_attribute(); - advance(':'); - if (next_token.identifier && next_token.string === 'inherit') { - advance(); - } else { - if (!style_value(v)) { - warn('unexpected_a'); - advance(); - } - } - if (next_token.id === '!') { - advance('!'); - no_space_only(); - if (next_token.identifier && next_token.string === 'important') { - advance(); - } else { - warn('expected_a_b', - next_token, 'important', artifact()); - } - } - if (next_token.id === '}' || next_token.id === xquote) { - warn('expected_a_b', next_token, ';', artifact()); - } else { - semicolon(); - } - } - } - - function style_selector() { - if (next_token.identifier) { - if (!Object.prototype.hasOwnProperty.call(html_tag, option.cap - ? next_token.string.toLowerCase() - : next_token.string)) { - warn('expected_tagname_a'); - } - advance(); - } else { - switch (next_token.id) { - case '>': - case '+': - advance(); - style_selector(); - break; - case ':': - advance(':'); - switch (next_token.string) { - case 'active': - case 'after': - case 'before': - case 'checked': - case 'disabled': - case 'empty': - case 'enabled': - case 'first-child': - case 'first-letter': - case 'first-line': - case 'first-of-type': - case 'focus': - case 'hover': - case 'last-child': - case 'last-of-type': - case 'link': - case 'only-of-type': - case 'root': - case 'target': - case 'visited': - advance_identifier(next_token.string); - break; - case 'lang': - advance_identifier('lang'); - advance('('); - if (!next_token.identifier) { - warn('expected_lang_a'); - } - advance(')'); - break; - case 'nth-child': - case 'nth-last-child': - case 'nth-last-of-type': - case 'nth-of-type': - advance_identifier(next_token.string); - advance('('); - style_child(); - advance(')'); - break; - case 'not': - advance_identifier('not'); - advance('('); - if (next_token.id === ':' && peek(0).string === 'not') { - warn('not'); - } - style_selector(); - advance(')'); - break; - default: - warn('expected_pseudo_a'); - } - break; - case '#': - advance('#'); - if (!next_token.identifier) { - warn('expected_id_a'); - } - advance(); - break; - case '*': - advance('*'); - break; - case '.': - advance('.'); - if (!next_token.identifier) { - warn('expected_class_a'); - } - advance(); - break; - case '[': - advance('['); - if (!next_token.identifier) { - warn('expected_attribute_a'); - } - advance(); - if (next_token.id === '=' || next_token.string === '~=' || - next_token.string === '$=' || - next_token.string === '|=' || - next_token.id === '*=' || - next_token.id === '^=') { - advance(); - if (next_token.id !== '(string)') { - warn('expected_string_a'); - } - advance(); - } - advance(']'); - break; - default: - stop('expected_selector_a'); - } - } - } - - function style_pattern() { - if (next_token.id === '{') { - warn('expected_style_pattern'); - } - for (;;) { - style_selector(); - if (next_token.id === '= 0) { - warn('unexpected_char_a_b', token, v.charAt(x), a); - } - ids[u] = true; - } else if (a === 'class' || a === 'type' || a === 'name') { - x = v.search(qx); - if (x >= 0) { - warn('unexpected_char_a_b', token, v.charAt(x), a); - } - ids[u] = true; - } else if (a === 'href' || a === 'background' || - a === 'content' || a === 'data' || - a.indexOf('src') >= 0 || a.indexOf('url') >= 0) { - if (option.safe && ux.test(v)) { - stop('bad_url_a', next_token, v); - } - urls.push(v); - } else if (a === 'for') { - if (option.adsafe) { - if (adsafe_id) { - if (v.slice(0, adsafe_id.length) !== adsafe_id) { - warn('adsafe_prefix_a', next_token, adsafe_id); - } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) { - warn('adsafe_bad_id'); - } - } else { - warn('adsafe_bad_id'); - } - } - } else if (a === 'name') { - if (option.adsafe && v.indexOf('_') >= 0) { - warn('adsafe_name_a', next_token, v); - } - } - } - - function do_tag(name, attribute) { - var i, tag = html_tag[name], script, x; - src = false; - if (!tag) { - stop( - bundle.unrecognized_tag_a, - next_token, - name === name.toLowerCase() - ? name - : name + ' (capitalization error)' - ); - } - if (stack.length > 0) { - if (name === 'html') { - stop('unexpected_a', token, name); - } - x = tag.parent; - if (x) { - if (x.indexOf(' ' + stack[stack.length - 1].name + ' ') < 0) { - stop('tag_a_in_b', token, name, x); - } - } else if (!option.adsafe && !option.fragment) { - i = stack.length; - do { - if (i <= 0) { - stop('tag_a_in_b', token, name, 'body'); - } - i -= 1; - } while (stack[i].name !== 'body'); - } - } - switch (name) { - case 'div': - if (option.adsafe && stack.length === 1 && !adsafe_id) { - warn('adsafe_missing_id'); - } - break; - case 'script': - xmode = 'script'; - advance('>'); - if (attribute.lang) { - warn('lang', token); - } - if (option.adsafe && stack.length !== 1) { - warn('adsafe_placement', token); - } - if (attribute.src) { - if (option.adsafe && (!adsafe_may || !approved[attribute.src])) { - warn('adsafe_source', token); - } - } else { - step_in(next_token.from); - edge(); - use_strict(); - adsafe_top = true; - script = statements(); - -// JSLint is also the static analyzer for ADsafe. See www.ADsafe.org. - - if (option.adsafe) { - if (adsafe_went) { - stop('adsafe_script', token); - } - if (script.length !== 1 || - aint(script[0], 'id', '(') || - aint(script[0].first, 'id', '.') || - aint(script[0].first.first, 'string', 'ADSAFE') || - aint(script[0].second[0], 'string', adsafe_id)) { - stop('adsafe_id_go'); - } - switch (script[0].first.second.string) { - case 'id': - if (adsafe_may || adsafe_went || - script[0].second.length !== 1) { - stop('adsafe_id', next_token); - } - adsafe_may = true; - break; - case 'go': - if (adsafe_went) { - stop('adsafe_go'); - } - if (script[0].second.length !== 2 || - aint(script[0].second[1], 'id', 'function') || - !script[0].second[1].first || - aint(script[0].second[1].first[0], 'string', 'dom') || - script[0].second[1].first.length > 2 || - (script[0].second[1].first.length === 2 && - aint(script[0].second[1].first[1], 'string', 'lib'))) { - stop('adsafe_go', next_token); - } - adsafe_went = true; - break; - default: - stop('adsafe_id_go'); - } - } - indent = null; - } - xmode = 'html'; - advance(''); - styles(); - xmode = 'html'; - advance(''; - } - - function html() { - var attribute, attributes, is_empty, name, old_white = option.white, - quote, tag_name, tag, wmode; - xmode = 'html'; - xquote = ''; - stack = null; - for (;;) { - switch (next_token.string) { - case '<': - xmode = 'html'; - advance('<'); - attributes = {}; - tag_name = next_token; - name = tag_name.string; - advance_identifier(name); - if (option.cap) { - name = name.toLowerCase(); - } - tag_name.name = name; - if (!stack) { - stack = []; - do_begin(name); - } - tag = html_tag[name]; - if (typeof tag !== 'object') { - stop('unrecognized_tag_a', tag_name, name); - } - is_empty = tag.empty; - tag_name.type = name; - for (;;) { - if (next_token.id === '/') { - advance('/'); - if (next_token.id !== '>') { - warn('expected_a_b', next_token, '>', artifact()); - } - break; - } - if (next_token.id && next_token.id.charAt(0) === '>') { - break; - } - if (!next_token.identifier) { - if (next_token.id === '(end)' || next_token.id === '(error)') { - warn('expected_a_b', next_token, '>', artifact()); - } - warn('bad_name_a'); - } - option.white = false; - spaces(); - attribute = next_token.string; - option.white = old_white; - advance(); - if (!option.cap && attribute !== attribute.toLowerCase()) { - warn('attribute_case_a', token); - } - attribute = attribute.toLowerCase(); - xquote = ''; - if (Object.prototype.hasOwnProperty.call(attributes, attribute)) { - warn('duplicate_a', token, attribute); - } - if (attribute.slice(0, 2) === 'on') { - if (!option.on) { - warn('html_handlers'); - } - xmode = 'scriptstring'; - advance('='); - quote = next_token.id; - if (quote !== '"' && quote !== '\'') { - stop('expected_a_b', next_token, '"', artifact()); - } - xquote = quote; - wmode = option.white; - option.white = true; - advance(quote); - use_strict(); - statements(); - option.white = wmode; - if (next_token.id !== quote) { - stop('expected_a_b', next_token, quote, artifact()); - } - xmode = 'html'; - xquote = ''; - advance(quote); - tag = false; - } else if (attribute === 'style') { - xmode = 'scriptstring'; - advance('='); - quote = next_token.id; - if (quote !== '"' && quote !== '\'') { - stop('expected_a_b', next_token, '"', artifact()); - } - xmode = 'styleproperty'; - xquote = quote; - advance(quote); - substyle(); - xmode = 'html'; - xquote = ''; - advance(quote); - tag = false; - } else { - if (next_token.id === '=') { - advance('='); - tag = next_token.string; - if (!next_token.identifier && - next_token.id !== '"' && - next_token.id !== '\'' && - next_token.id !== '(string)' && - next_token.id !== '(string)' && - next_token.id !== '(color)') { - warn('expected_attribute_value_a', token, attribute); - } - advance(); - } else { - tag = true; - } - } - attributes[attribute] = tag; - do_attribute(attribute, tag); - } - do_tag(name, attributes); - if (!is_empty) { - stack.push(tag_name); - } - xmode = 'outer'; - advance('>'); - break; - case '') { - stop('expected_a_b', next_token, '>', artifact()); - } - xmode = 'outer'; - advance('>'); - break; - case '' || next_token.id === '(end)') { - break; - } - if (next_token.string.indexOf('--') >= 0) { - stop('unexpected_a', next_token, '--'); - } - if (next_token.string.indexOf('<') >= 0) { - stop('unexpected_a', next_token, '<'); - } - if (next_token.string.indexOf('>') >= 0) { - stop('unexpected_a', next_token, '>'); - } - } - xmode = 'outer'; - advance('>'); - break; - case '(end)': - if (stack.length !== 0) { - warn('missing_a', next_token, ''); - } - return; - default: - if (next_token.id === '(end)') { - stop('missing_a', next_token, - ''); - } else { - advance(); - } - } - if (stack && stack.length === 0 && (option.adsafe || - !option.fragment || next_token.id === '(end)')) { - break; - } - } - if (next_token.id !== '(end)') { - stop('unexpected_a'); - } - } - - -// The actual JSLINT function itself. - - itself = function JSLint(the_source, the_option) { - - var i, predef, tree; - JSLINT.errors = []; - JSLINT.tree = ''; - begin = prev_token = token = next_token = - Object.create(syntax['(begin)']); - predefined = {}; - add_to_predefined(standard); - property = {}; - if (the_option) { - option = Object.create(the_option); - predef = option.predef; - if (predef) { - if (Array.isArray(predef)) { - for (i = 0; i < predef.length; i += 1) { - predefined[predef[i]] = true; - } - } else if (typeof predef === 'object') { - add_to_predefined(predef); - } - } - do_safe(); - } else { - option = {}; - } - option.indent = +option.indent || 4; - option.maxerr = +option.maxerr || 50; - adsafe_id = ''; - adsafe_may = adsafe_top = adsafe_went = false; - approved = {}; - if (option.approved) { - for (i = 0; i < option.approved.length; i += 1) { - approved[option.approved[i]] = option.approved[i]; - } - } else { - approved.test = 'test'; - } - tab = ''; - for (i = 0; i < option.indent; i += 1) { - tab += ' '; - } - global_scope = scope = {}; - global_funct = funct = { - '(scope)': scope, - '(breakage)': 0, - '(loopage)': 0 - }; - functions = [funct]; - - comments_off = false; - ids = {}; - in_block = false; - indent = null; - json_mode = false; - lookahead = []; - node_js = false; - prereg = true; - src = false; - stack = null; - strict_mode = false; - urls = []; - var_mode = null; - warnings = 0; - xmode = ''; - lex.init(the_source); - - assume(); - - try { - advance(); - if (next_token.id === '(number)') { - stop('unexpected_a'); - } else if (next_token.string.charAt(0) === '<') { - html(); - if (option.adsafe && !adsafe_went) { - warn('adsafe_go', this); - } - } else { - switch (next_token.id) { - case '{': - case '[': - json_mode = true; - json_value(); - break; - case '@': - case '*': - case '#': - case '.': - case ':': - xmode = 'style'; - advance(); - if (token.id !== '@' || !next_token.identifier || - next_token.string !== 'charset' || token.line !== 1 || - token.from !== 1) { - stop('css'); - } - advance(); - if (next_token.id !== '(string)' && - next_token.string !== 'UTF-8') { - stop('css'); - } - advance(); - semicolon(); - styles(); - break; - - default: - if (option.adsafe && option.fragment) { - stop('expected_a_b', - next_token, '
    ', artifact()); - } - -// If the first token is a semicolon, ignore it. This is sometimes used when -// files are intended to be appended to files that may be sloppy. A sloppy -// file may be depending on semicolon insertion on its last line. - - step_in(1); - if (next_token.id === ';' && !node_js) { - semicolon(); - } - adsafe_top = true; - tree = statements(); - begin.first = tree; - JSLINT.tree = begin; - // infer_types(tree); - if (option.adsafe && (tree.length !== 1 || - aint(tree[0], 'id', '(') || - aint(tree[0].first, 'id', '.') || - aint(tree[0].first.first, 'string', 'ADSAFE') || - aint(tree[0].first.second, 'string', 'lib') || - tree[0].second.length !== 2 || - tree[0].second[0].id !== '(string)' || - aint(tree[0].second[1], 'id', 'function'))) { - stop('adsafe_lib'); - } - if (tree.disrupt) { - warn('weird_program', prev_token); - } - } - } - indent = null; - advance('(end)'); - } catch (e) { - if (e) { // ~~ - JSLINT.errors.push({ - reason : e.message, - line : e.line || next_token.line, - character : e.character || next_token.from - }, null); - } - } - return JSLINT.errors.length === 0; - }; - - -// Data summary. - - itself.data = function () { - var data = {functions: []}, - function_data, - globals, - i, - j, - kind, - members = [], - name, - the_function, - undef = [], - unused = []; - if (itself.errors.length) { - data.errors = itself.errors; - } - - if (json_mode) { - data.json = true; - } - - if (urls.length > 0) { - data.urls = urls; - } - - globals = Object.keys(global_scope).filter(function (value) { - return value.charAt(0) !== '(' && typeof standard[value] !== 'boolean'; - }); - if (globals.length > 0) { - data.globals = globals; - } - - for (i = 1; i < functions.length; i += 1) { - the_function = functions[i]; - function_data = {}; - for (j = 0; j < functionicity.length; j += 1) { - function_data[functionicity[j]] = []; - } - for (name in the_function) { - if (Object.prototype.hasOwnProperty.call(the_function, name)) { - if (name.charAt(0) !== '(') { - kind = the_function[name]; - if (kind === 'unction' || kind === 'unparam') { - kind = 'unused'; - } - if (Array.isArray(function_data[kind])) { - function_data[kind].push(name); - if (kind === 'unused') { - unused.push({ - name: name, - line: the_function['(line)'], - 'function': the_function['(name)'] - }); - } else if (kind === 'undef') { - undef.push({ - name: name, - line: the_function['(line)'], - 'function': the_function['(name)'] - }); - } - } - } - } - } - for (j = 0; j < functionicity.length; j += 1) { - if (function_data[functionicity[j]].length === 0) { - delete function_data[functionicity[j]]; - } - } - function_data.name = the_function['(name)']; - function_data.params = the_function['(params)']; - function_data.line = the_function['(line)']; - data.functions.push(function_data); - } - - if (unused.length > 0) { - data.unused = unused; - } - if (undef.length > 0) { - data['undefined'] = undef; - } - - members = []; - for (name in property) { - if (typeof property[name] === 'number') { - data.member = property; - break; - } - } - - return data; - }; - - - itself.report = function (errors_only) { - var data = itself.data(), err, evidence, i, italics, j, key, keys, - length, mem = '', name, names, not_first, output = [], snippets, - the_function, warning; - - function detail(h, value) { - var comma_needed, singularity; - if (Array.isArray(value)) { - output.push('
    ' + h + ' '); - value.sort().forEach(function (item) { - if (item !== singularity) { - singularity = item; - output.push((comma_needed ? ', ' : '') + singularity); - comma_needed = true; - } - }); - output.push('
    '); - } else if (value) { - output.push('
    ' + h + ' ' + value + '
    '); - } - } - - if (data.errors || data.unused || data['undefined']) { - err = true; - output.push('
    Error:'); - if (data.errors) { - for (i = 0; i < data.errors.length; i += 1) { - warning = data.errors[i]; - if (warning) { - evidence = warning.evidence || ''; - output.push('

    Problem' + (isFinite(warning.line) - ? ' at line ' + String(warning.line) + - ' character ' + String(warning.character) - : '') + - ': ' + warning.reason.entityify() + - '

    ' + - (evidence && (evidence.length > 80 - ? evidence.slice(0, 77) + '...' - : evidence).entityify()) + '

    '); - } - } - } - - if (data['undefined']) { - snippets = []; - for (i = 0; i < data['undefined'].length; i += 1) { - snippets[i] = '' + data['undefined'][i].name + ' ' + - String(data['undefined'][i].line) + ' ' + - data['undefined'][i]['function'] + ''; - } - output.push('

    Undefined variable: ' + snippets.join(', ') + '

    '); - } - if (data.unused) { - snippets = []; - for (i = 0; i < data.unused.length; i += 1) { - snippets[i] = '' + data.unused[i].name + ' ' + - String(data.unused[i].line) + ' ' + - data.unused[i]['function'] + ''; - } - output.push('

    Unused variable: ' + snippets.join(', ') + '

    '); - } - if (data.json) { - output.push('

    JSON: bad.

    '); - } - output.push('
    '); - } - - if (!errors_only) { - - output.push('
    '); - - if (data.urls) { - detail("URLs
    ", data.urls, '
    '); - } - - if (xmode === 'style') { - output.push('

    CSS.

    '); - } else if (data.json && !err) { - output.push('

    JSON: good.

    '); - } else if (data.globals) { - output.push('
    Global ' + - data.globals.sort().join(', ') + '
    '); - } else { - output.push('
    No new global variables introduced.
    '); - } - - for (i = 0; i < data.functions.length; i += 1) { - the_function = data.functions[i]; - names = []; - if (the_function.params) { - for (j = 0; j < the_function.params.length; j += 1) { - names[j] = the_function.params[j].string; - } - } - output.push('
    ' + - String(the_function.line) + ' ' + - the_function.name.entityify() + - '(' + names.join(', ') + ')
    '); - detail('Undefined', the_function['undefined']); - detail('Unused', the_function.unused); - detail('Closure', the_function.closure); - detail('Variable', the_function['var']); - detail('Exception', the_function.exception); - detail('Outer', the_function.outer); - detail('Global', the_function.global); - detail('Label', the_function.label); - } - - if (data.member) { - keys = Object.keys(data.member); - if (keys.length) { - keys = keys.sort(); - output.push('
    /*properties
    '); - mem = ' '; - italics = 0; - j = 0; - not_first = false; - for (i = 0; i < keys.length; i += 1) { - key = keys[i]; - if (data.member[key] > 0) { - if (not_first) { - mem += ', '; - } - name = ix.test(key) - ? key - : '\'' + key.entityify().replace(nx, sanitize) + '\''; - length += name.length + 2; - if (data.member[key] === 1) { - name = '' + name + ''; - italics += 1; - j = 1; - } - if (mem.length + name.length - (italics * 7) > 80) { - output.push(mem + '
    '); - mem = ' '; - italics = j; - } - mem += name; - j = 0; - not_first = true; - } - } - output.push(mem + '
    */
    '); - } - output.push('
    '); - } - } - return output.join(''); - }; - itself.jslint = itself; - - itself.edition = '2012-04-15'; - - return itself; -}()); -core.JSLint = function JSLint() { - this.JSLINT = JSLINT; -}; - diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js deleted file mode 100644 index f3f0008f78..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, Node: true*/ -/** - * A simple walker that allows finegrained stepping through the DOM. - * It does not support node filtering. - * TODO: write a position walker that uses a treewalker - * @constructor - * @param {!Node} node - */ -core.PointWalker = function PointWalker(node) { - "use strict"; - var currentNode = node, - before = null, // node before the point - after = node && node.firstChild, // node after the point - root = node, - pos = 0; - - /** - * @param {!Node} node - * @return {!number} - */ - function getPosition(node) { - var /**@type{!number}*/ p = -1, - /**@type{Node}*/ n = node; - while (n) { - n = n.previousSibling; - p += 1; - } - return p; - } - /** - * Move the walker to the point given by @p node and @p position. - * @param {!Element} node must be the root of this walker or part of the - * tree of this walker. - * @param {!number} position must be a valid position in @node. - **/ - this.setPoint = function (node, position) { - currentNode = node; - pos = position; - if (currentNode.nodeType === 3) { // Node.TEXT_NODE - after = null; - before = null; - } else { - after = currentNode.firstChild; - while (position) { - position -= 1; - after = after.nextSibling; - } - if (after) { - before = after.previousSibling; - } else { - before = currentNode.lastChild; - } - } - }; - /** - * @return {!boolean} - */ - this.stepForward = function () { - var len; - // if this is a text node, move to the next position in the text - if (currentNode.nodeType === 3) { // TEXT_NODE - if (typeof currentNode.nodeValue.length === "number") { - len = currentNode.nodeValue.length; - } else { - len = currentNode.nodeValue.length(); - } - if (pos < len) { - pos += 1; - return true; - } - } - if (after) { - if (after.nodeType === 1) { // ELEMENT_NODE - currentNode = after; - before = null; - after = currentNode.firstChild; - pos = 0; - } else if (after.nodeType === 3) { // TEXT_NODE - currentNode = after; - before = null; - after = null; - pos = 0; - } else { - before = after; - after = after.nextSibling; - pos += 1; - } - return true; - } - if (currentNode !== root) { - before = currentNode; - after = before.nextSibling; - currentNode = currentNode.parentNode; - pos = getPosition(before) + 1; - return true; - } - return false; - }; - /** - * @return {!boolean} - */ - this.stepBackward = function () { - // if this is a text node, move to the next position in the text - if (currentNode.nodeType === 3) { // TEXT_NODE - if (pos > 0) { - pos -= 1; - return true; - } - } - if (before) { - if (before.nodeType === 1) { // ELEMENT_NODE - currentNode = before; - before = currentNode.lastChild; - after = null; - pos = getPosition(before) + 1; - } else if (before.nodeType === 3) { // TEXT_NODE - currentNode = before; - before = null; - after = null; - if (typeof currentNode.nodeValue.length === "number") { - pos = currentNode.nodeValue.length; - } else { - pos = currentNode.nodeValue.length(); - } - } else { - after = before; - before = before.previousSibling; - pos -= 1; - } - return true; - } - if (currentNode !== root) { - after = currentNode; - before = after.previousSibling; - currentNode = currentNode.parentNode; - pos = getPosition(after); - return true; - } - return false; - }; - /** - * @return {?Node} - */ - this.node = function () { - return currentNode; - }; - /** - * @return {!number} - */ - this.position = function () { - return pos; - }; - /** - * @return {?Node} - */ - this.precedingSibling = function () { - return before; - }; - /** - * @return {?Node} - */ - this.followingSibling = function () { - return after; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js deleted file mode 100644 index 5fdd2b02de..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js +++ /dev/null @@ -1,1833 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core, runtime*/ -/*jslint bitwise: true, white: false, plusplus: true, vars: true, continue: true*/ -/* - * $Id: rawdeflate.js,v 0.3 2009/03/01 19:05:05 dankogai Exp dankogai $ - * - * Original: - * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt - */ -/** - * @constructor - */ -core.RawDeflate = function () { - "use strict"; - /* Copyright (C) 1999 Masanao Izumo - * Version: 1.0.1 - * LastModified: Dec 25 1999 - */ - - /* Interface: - * data = zip_deflate(src); - */ - - /* constant parameters */ - var zip_WSIZE = 32768, // Sliding Window size - zip_STORED_BLOCK = 0, - zip_STATIC_TREES = 1, - zip_DYN_TREES = 2, - - /* for deflate */ - zip_DEFAULT_LEVEL = 6, - zip_FULL_SEARCH = true, - zip_INBUFSIZ = 32768, // Input buffer size - zip_INBUF_EXTRA = 64, // Extra buffer - zip_OUTBUFSIZ = 1024 * 8, - zip_window_size = 2 * zip_WSIZE, - zip_MIN_MATCH = 3, - zip_MAX_MATCH = 258, - zip_BITS = 16, - // for SMALL_MEM - zip_LIT_BUFSIZE = 0x2000, - zip_HASH_BITS = 13, - // for MEDIUM_MEM - // var zip_LIT_BUFSIZE = 0x4000; - // var zip_HASH_BITS = 14; - // for BIG_MEM - // var zip_LIT_BUFSIZE = 0x8000; - zip_DIST_BUFSIZE = zip_LIT_BUFSIZE, - zip_HASH_SIZE = 1 << zip_HASH_BITS, - zip_HASH_MASK = zip_HASH_SIZE - 1, - zip_WMASK = zip_WSIZE - 1, - zip_NIL = 0, // Tail of hash chains - zip_TOO_FAR = 4096, - zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1, - zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD, - zip_SMALLEST = 1, - zip_MAX_BITS = 15, - zip_MAX_BL_BITS = 7, - zip_LENGTH_CODES = 29, - zip_LITERALS = 256, - zip_END_BLOCK = 256, - zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES, - zip_D_CODES = 30, - zip_BL_CODES = 19, - zip_REP_3_6 = 16, - zip_REPZ_3_10 = 17, - zip_REPZ_11_138 = 18, - zip_HEAP_SIZE = 2 * zip_L_CODES + 1, - zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / - zip_MIN_MATCH, 10), - - /* variables */ - zip_free_queue, - zip_qhead, - zip_qtail, - zip_initflag, - zip_outbuf = null, - zip_outcnt, - zip_outoff, - zip_complete, - zip_window, - zip_d_buf, - zip_l_buf, - zip_prev, - zip_bi_buf, - zip_bi_valid, - zip_block_start, - zip_ins_h, - zip_hash_head, - zip_prev_match, - zip_match_available, - zip_match_length, - zip_prev_length, - zip_strstart, - zip_match_start, - zip_eofile, - zip_lookahead, - zip_max_chain_length, - zip_max_lazy_match, - zip_compr_level, - zip_good_match, - zip_nice_match, - zip_dyn_ltree, - zip_dyn_dtree, - zip_static_ltree, - zip_static_dtree, - zip_bl_tree, - zip_l_desc, - zip_d_desc, - zip_bl_desc, - zip_bl_count, - zip_heap, - zip_heap_len, - zip_heap_max, - zip_depth, - zip_length_code, - zip_dist_code, - zip_base_length, - zip_base_dist, - zip_flag_buf, - zip_last_lit, - zip_last_dist, - zip_last_flags, - zip_flags, - zip_flag_bit, - zip_opt_len, - zip_static_len, - zip_deflate_data, - zip_deflate_pos, - // var zip_HASH_BITS = 15; - /* constant tables */ - zip_extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], - zip_extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], - zip_extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], - zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], - zip_configuration_table; - if (zip_LIT_BUFSIZE > zip_INBUFSIZ) { - runtime.log("error: zip_INBUFSIZ is too small"); - } - if ((zip_WSIZE << 1) > (1 << zip_BITS)) { - runtime.log("error: zip_WSIZE is too large"); - } - if (zip_HASH_BITS > zip_BITS - 1) { - runtime.log("error: zip_HASH_BITS is too large"); - } - if (zip_HASH_BITS < 8 || zip_MAX_MATCH !== 258) { - runtime.log("error: Code too clever"); - } - - /* objects (deflate) */ - /** - * @constructor - */ - function Zip_DeflateCT() { - this.fc = 0; // frequency count or bit string - this.dl = 0; // father node in Huffman tree or length of bit string - } - /** - * @constructor - */ - function Zip_DeflateTreeDesc() { - this.dyn_tree = null; // the dynamic tree - this.static_tree = null; // corresponding static tree or NULL - this.extra_bits = null; // extra bits for each code or NULL - this.extra_base = 0; // base index for extra_bits - this.elems = 0; // max number of elements in the tree - this.max_length = 0; // max bit length for the codes - this.max_code = 0; // largest code with non zero frequency - } - - /** Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - * @constructor - */ - function Zip_DeflateConfiguration(a, b, c, d) { - this.good_length = a; // reduce lazy search above this match length - this.max_lazy = b; // do not perform lazy search above this match length - this.nice_length = c; // quit search above this match length - this.max_chain = d; - } - - /** - * @constructor - */ - function Zip_DeflateBuffer() { - this.next = null; - this.len = 0; - this.ptr = []; - this.ptr.length = zip_OUTBUFSIZ; - this.off = 0; - } - - /* constant tables */ - zip_configuration_table = [ - new Zip_DeflateConfiguration(0, 0, 0, 0), - new Zip_DeflateConfiguration(4, 4, 8, 4), - new Zip_DeflateConfiguration(4, 5, 16, 8), - new Zip_DeflateConfiguration(4, 6, 32, 32), - new Zip_DeflateConfiguration(4, 4, 16, 16), - new Zip_DeflateConfiguration(8, 16, 32, 32), - new Zip_DeflateConfiguration(8, 16, 128, 128), - new Zip_DeflateConfiguration(8, 32, 128, 256), - new Zip_DeflateConfiguration(32, 128, 258, 1024), - new Zip_DeflateConfiguration(32, 258, 258, 4096) - ]; - - - /* routines (deflate) */ - - function zip_deflate_start(level) { - var i; - - if (!level) { - level = zip_DEFAULT_LEVEL; - } else if (level < 1) { - level = 1; - } else if (level > 9) { - level = 9; - } - - zip_compr_level = level; - zip_initflag = false; - zip_eofile = false; - if (zip_outbuf !== null) { - return; - } - - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = []; - zip_outbuf.length = zip_OUTBUFSIZ; - zip_window = []; - zip_window.length = zip_window_size; - zip_d_buf = []; - zip_d_buf.length = zip_DIST_BUFSIZE; - zip_l_buf = []; - zip_l_buf.length = zip_INBUFSIZ + zip_INBUF_EXTRA; - zip_prev = []; - zip_prev.length = 1 << zip_BITS; - zip_dyn_ltree = []; - zip_dyn_ltree.length = zip_HEAP_SIZE; - for (i = 0; i < zip_HEAP_SIZE; i++) { - zip_dyn_ltree[i] = new Zip_DeflateCT(); - } - zip_dyn_dtree = []; - zip_dyn_dtree.length = 2 * zip_D_CODES + 1; - for (i = 0; i < 2 * zip_D_CODES + 1; i++) { - zip_dyn_dtree[i] = new Zip_DeflateCT(); - } - zip_static_ltree = []; - zip_static_ltree.length = zip_L_CODES + 2; - for (i = 0; i < zip_L_CODES + 2; i++) { - zip_static_ltree[i] = new Zip_DeflateCT(); - } - zip_static_dtree = []; - zip_static_dtree.length = zip_D_CODES; - for (i = 0; i < zip_D_CODES; i++) { - zip_static_dtree[i] = new Zip_DeflateCT(); - } - zip_bl_tree = []; - zip_bl_tree.length = 2 * zip_BL_CODES + 1; - for (i = 0; i < 2 * zip_BL_CODES + 1; i++) { - zip_bl_tree[i] = new Zip_DeflateCT(); - } - zip_l_desc = new Zip_DeflateTreeDesc(); - zip_d_desc = new Zip_DeflateTreeDesc(); - zip_bl_desc = new Zip_DeflateTreeDesc(); - zip_bl_count = []; - zip_bl_count.length = zip_MAX_BITS + 1; - zip_heap = []; - zip_heap.length = 2 * zip_L_CODES + 1; - zip_depth = []; - zip_depth.length = 2 * zip_L_CODES + 1; - zip_length_code = []; - zip_length_code.length = zip_MAX_MATCH - zip_MIN_MATCH + 1; - zip_dist_code = []; - zip_dist_code.length = 512; - zip_base_length = []; - zip_base_length.length = zip_LENGTH_CODES; - zip_base_dist = []; - zip_base_dist.length = zip_D_CODES; - zip_flag_buf = []; - zip_flag_buf.length = parseInt(zip_LIT_BUFSIZE / 8, 10); - } - - var zip_deflate_end = function () { - zip_free_queue = zip_qhead = zip_qtail = null; - zip_outbuf = null; - zip_window = null; - zip_d_buf = null; - zip_l_buf = null; - zip_prev = null; - zip_dyn_ltree = null; - zip_dyn_dtree = null; - zip_static_ltree = null; - zip_static_dtree = null; - zip_bl_tree = null; - zip_l_desc = null; - zip_d_desc = null; - zip_bl_desc = null; - zip_bl_count = null; - zip_heap = null; - zip_depth = null; - zip_length_code = null; - zip_dist_code = null; - zip_base_length = null; - zip_base_dist = null; - zip_flag_buf = null; - }; - - var zip_reuse_queue = function (p) { - p.next = zip_free_queue; - zip_free_queue = p; - }; - - var zip_new_queue = function () { - var p; - - if (zip_free_queue !== null) { - p = zip_free_queue; - zip_free_queue = zip_free_queue.next; - } else { - p = new Zip_DeflateBuffer(); - } - p.next = null; - p.len = p.off = 0; - - return p; - }; - - var zip_head1 = function (i) { - return zip_prev[zip_WSIZE + i]; - }; - - var zip_head2 = function (i, val) { - zip_prev[zip_WSIZE + i] = val; - return val; - }; - - var zip_qoutbuf = function () { - var q, i; - if (zip_outcnt !== 0) { - q = zip_new_queue(); - if (zip_qhead === null) { - zip_qhead = zip_qtail = q; - } else { - zip_qtail = zip_qtail.next = q; - } - q.len = zip_outcnt - zip_outoff; - // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); - for (i = 0; i < q.len; i++) { - q.ptr[i] = zip_outbuf[zip_outoff + i]; - } - zip_outcnt = zip_outoff = 0; - } - }; - - /* put_byte is used for the compressed output, put_ubyte for the - * uncompressed output. However unlzw() uses window for its - * suffix table instead of its output buffer, so it does not use put_ubyte - * (to be cleaned up). - */ - var zip_put_byte = function (c) { - zip_outbuf[zip_outoff + zip_outcnt++] = c; - if (zip_outoff + zip_outcnt === zip_OUTBUFSIZ) { - zip_qoutbuf(); - } - }; - - /* Output a 16 bit value, lsb first */ - var zip_put_short = function (w) { - w &= 0xffff; - if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { - zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); - zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); - } else { - zip_put_byte(w & 0xff); - zip_put_byte(w >>> 8); - } - }; - - /* ========================================================================== - * Insert string s in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of s are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ - var zip_INSERT_STRING = function () { - zip_ins_h = ((zip_ins_h << zip_H_SHIFT) - ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) - & zip_HASH_MASK; - zip_hash_head = zip_head1(zip_ins_h); - zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; - zip_head2(zip_ins_h, zip_strstart); - }; - - /* ========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ - var zip_Buf_size = 16; // bit size of bi_buf - var zip_send_bits = function ( - value, // value to send - length - ) { // number of bits - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (zip_bi_valid > zip_Buf_size - length) { - zip_bi_buf |= (value << zip_bi_valid); - zip_put_short(zip_bi_buf); - zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); - zip_bi_valid += length - zip_Buf_size; - } else { - zip_bi_buf |= value << zip_bi_valid; - zip_bi_valid += length; - } - }; - - /* Send a code of the given tree. c and tree must not have side effects */ - var zip_SEND_CODE = function (c, tree) { - zip_send_bits(tree[c].fc, tree[c].dl); - }; - - /* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. dist_code[256] and dist_code[257] are never - * used. - */ - var zip_D_CODE = function (dist) { - return (dist < 256 ? zip_dist_code[dist] - : zip_dist_code[256 + (dist >> 7)]) & 0xff; - }; - - /* ========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ - var zip_SMALLER = function (tree, n, m) { - return tree[n].fc < tree[m].fc || - (tree[n].fc === tree[m].fc && zip_depth[n] <= zip_depth[m]); - }; - - /* ========================================================================== - * read string data - */ - var zip_read_buff = function (buff, offset, n) { - var i; - for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) { - buff[offset + i] = - zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; - } - return i; - }; - - /* ========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead, and sets eofile if end of input file. - * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 - * OUT assertions: at least one byte has been read, or eofile is set; - * file reads are performed for at least two bytes (required for the - * translate_eol option). - */ - var zip_fill_window = function () { - var n, m; - - // Amount of free space at the end of the window. - var more = zip_window_size - zip_lookahead - zip_strstart; - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (more === -1) { - /* Very unlikely, but possible on 16 bit machine if strstart == 0 - * and lookahead == 1 (input done one byte at time) - */ - more--; - } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { - /* By the IN assertion, the window is not empty so we can't confuse - * more == 0 with more == 64K on a 16 bit machine. - */ - // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); - - // System.arraycopy(window, WSIZE, window, 0, WSIZE); - for (n = 0; n < zip_WSIZE; n++) { - zip_window[n] = zip_window[n + zip_WSIZE]; - } - - zip_match_start -= zip_WSIZE; - zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ - zip_block_start -= zip_WSIZE; - - for (n = 0; n < zip_HASH_SIZE; n++) { - m = zip_head1(n); - zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); - } - for (n = 0; n < zip_WSIZE; n++) { - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - m = zip_prev[n]; - zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); - } - more += zip_WSIZE; - } - // At this point, more >= 2 - if (!zip_eofile) { - n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); - if (n <= 0) { - zip_eofile = true; - } else { - zip_lookahead += n; - } - } - }; - - - /* ========================================================================== - * Initialize the "longest match" routines for a new file - */ - var zip_lm_init = function () { - var j; - - /* Initialize the hash table. */ - for (j = 0; j < zip_HASH_SIZE; j++) { - // zip_head2(j, zip_NIL); - zip_prev[zip_WSIZE + j] = 0; - } - /* prev will be initialized on the fly */ - - /* Set the default configuration parameters: - */ - zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; - zip_good_match = zip_configuration_table[zip_compr_level].good_length; - if (!zip_FULL_SEARCH) { - zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; - } - zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; - - zip_strstart = 0; - zip_block_start = 0; - - zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); - if (zip_lookahead <= 0) { - zip_eofile = true; - zip_lookahead = 0; - return; - } - zip_eofile = false; - /* Make sure that we always have enough lookahead. This is important - * if input comes from a device such as a tty. - */ - while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window(); - } - - /* If lookahead < MIN_MATCH, ins_h is garbage, but this is - * not important since only literal bytes will be emitted. - */ - zip_ins_h = 0; - for (j = 0; j < zip_MIN_MATCH - 1; j++) { - // UPDATE_HASH(ins_h, window[j]); - zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; - } - }; - - /* ========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - */ - var zip_longest_match = function (cur_match) { - var chain_length = zip_max_chain_length; // max hash chain length - var scanp = zip_strstart; // current string - var matchp; // matched string - var len; // length of current match - var best_len = zip_prev_length; // best match length so far - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); - - var strendp = zip_strstart + zip_MAX_MATCH; - var scan_end1 = zip_window[scanp + best_len - 1]; - var scan_end = zip_window[scanp + best_len]; - - /* Do not waste too much time if we already have a good match: */ - if (zip_prev_length >= zip_good_match) { - chain_length >>= 2; - } - - // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); - - do { - // Assert(cur_match < encoder->strstart, "no future"); - matchp = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2: - */ - if (zip_window[matchp + best_len] !== scan_end || - zip_window[matchp + best_len - 1] !== scan_end1 || - zip_window[matchp] !== zip_window[scanp] || - zip_window[++matchp] !== zip_window[scanp + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scanp += 2; - matchp++; - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - ++scanp; - } while (zip_window[scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - zip_window[++scanp] === zip_window[++matchp] && - scanp < strendp); - - len = zip_MAX_MATCH - (strendp - scanp); - scanp = strendp - zip_MAX_MATCH; - - if (len > best_len) { - zip_match_start = cur_match; - best_len = len; - if (zip_FULL_SEARCH) { - if (len >= zip_MAX_MATCH) { - break; - } - } else { - if (len >= zip_nice_match) { - break; - } - } - - scan_end1 = zip_window[scanp + best_len - 1]; - scan_end = zip_window[scanp + best_len]; - } - } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit - && --chain_length !== 0); - - return best_len; - }; - - /* ========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ - var zip_ct_tally = function ( - dist, // distance of matched string - lc - ) { // match length-MIN_MATCH or unmatched char (if dist==0) - zip_l_buf[zip_last_lit++] = lc; - if (dist === 0) { - // lc is the unmatched char - zip_dyn_ltree[lc].fc++; - } else { - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 - // Assert((ush)dist < (ush)MAX_DIST && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); - - zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; - zip_dyn_dtree[zip_D_CODE(dist)].fc++; - - zip_d_buf[zip_last_dist++] = dist; - zip_flags |= zip_flag_bit; - } - zip_flag_bit <<= 1; - - // Output the flags if they fill a byte - if ((zip_last_lit & 7) === 0) { - zip_flag_buf[zip_last_flags++] = zip_flags; - zip_flags = 0; - zip_flag_bit = 1; - } - // Try to guess if it is profitable to stop the current block here - if (zip_compr_level > 2 && (zip_last_lit & 0xfff) === 0) { - // Compute an upper bound for the compressed length - var out_length = zip_last_lit * 8; - var in_length = zip_strstart - zip_block_start; - var dcode; - - for (dcode = 0; dcode < zip_D_CODES; dcode++) { - out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); - } - out_length >>= 3; - // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", - // encoder->last_lit, encoder->last_dist, in_length, out_length, - // 100L - out_length*100L/in_length)); - if (zip_last_dist < parseInt(zip_last_lit / 2, 10) && - out_length < parseInt(in_length / 2, 10)) { - return true; - } - } - return (zip_last_lit === zip_LIT_BUFSIZE - 1 || - zip_last_dist === zip_DIST_BUFSIZE); - /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ - }; - - /* ========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ - var zip_pqdownheap = function ( - tree, // the tree to restore - k - ) { // node to move down - var v = zip_heap[k]; - var j = k << 1; // left son of k - - while (j <= zip_heap_len) { - // Set j to the smallest of the two sons: - if (j < zip_heap_len && - zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) { - j++; - } - - // Exit if v is smaller than both sons - if (zip_SMALLER(tree, v, zip_heap[j])) { - break; - } - - // Exchange v with the smallest son - zip_heap[k] = zip_heap[j]; - k = j; - - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - zip_heap[k] = v; - }; - - /* ========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ - var zip_gen_bitlen = function (desc) { // the tree descriptor - var tree = desc.dyn_tree; - var extra = desc.extra_bits; - var base = desc.extra_base; - var max_code = desc.max_code; - var max_length = desc.max_length; - var stree = desc.static_tree; - var h; // heap index - var n, m; // iterate over the tree elements - var bits; // bit length - var xbits; // extra bits - var f; // frequency - var overflow = 0; // number of elements with bit length too large - - for (bits = 0; bits <= zip_MAX_BITS; bits++) { - zip_bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap - - for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { - n = zip_heap[h]; - bits = tree[tree[n].dl].dl + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n].dl = bits; - // We overwrite tree[n].dl which is no longer needed - - if (n > max_code) { - continue; // not a leaf node - } - - zip_bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n].fc; - zip_opt_len += f * (bits + xbits); - if (stree !== null) { - zip_static_len += f * (stree[n].dl + xbits); - } - } - if (overflow === 0) { - return; - } - - // This happens for example on obj2 and pic of the Calgary corpus - - // Find the first bit length which could increase: - do { - bits = max_length - 1; - while (zip_bl_count[bits] === 0) { - bits--; - } - zip_bl_count[bits]--; // move one leaf down the tree - zip_bl_count[bits + 1] += 2; // move one overflow item as its brother - zip_bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = zip_bl_count[bits]; - while (n !== 0) { - m = zip_heap[--h]; - if (m > max_code) { - continue; - } - if (tree[m].dl !== bits) { - zip_opt_len += (bits - tree[m].dl) * tree[m].fc; - tree[m].fc = bits; - } - n--; - } - } - }; - - /* ========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ - var zip_bi_reverse = function ( - code, // the value to invert - len - ) { // its bit length - var res = 0; - do { - res |= code & 1; - code >>= 1; - res <<= 1; - } while (--len > 0); - return res >> 1; - }; - - /* ========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ - var zip_gen_codes = function (tree, // the tree to decorate - max_code) { // largest code with non zero frequency - var next_code = []; - next_code.length = zip_MAX_BITS + 1; // next code value for each bit length - var code = 0; // running code value - var bits; // bit index - var n; // code index - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= zip_MAX_BITS; bits++) { - code = ((code + zip_bl_count[bits - 1]) << 1); - next_code[bits] = code; - } - - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) { - zip_pqdownheap(tree, n); - } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - do { - n = zip_heap[zip_SMALLEST]; - zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; - zip_pqdownheap(tree, zip_SMALLEST); - - m = zip_heap[zip_SMALLEST]; // m = node of next least frequency - - // keep the nodes sorted by frequency - zip_heap[--zip_heap_max] = n; - zip_heap[--zip_heap_max] = m; - - // Create a new node father of n and m - tree[node].fc = tree[n].fc + tree[m].fc; - // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); - if (zip_depth[n] > zip_depth[m] + 1) { - zip_depth[node] = zip_depth[n]; - } else { - zip_depth[node] = zip_depth[m] + 1; - } - tree[n].dl = tree[m].dl = node; - - // and insert the new node in the heap - zip_heap[zip_SMALLEST] = node++; - zip_pqdownheap(tree, zip_SMALLEST); - - } while (zip_heap_len >= 2); - - zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - zip_gen_bitlen(desc); - - // The field len is now set, we can generate the bit codes - zip_gen_codes(tree, max_code); - }; - - /* ========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. Updates opt_len to take into account the repeat - * counts. (The contribution of the bit length codes will be added later - * during the construction of bl_tree.) - */ - var zip_scan_tree = function (tree,// the tree to be scanned - max_code) { // and its largest code of non zero frequency - var n; // iterates over all tree elements - var prevlen = -1; // last emitted length - var curlen; // length of current code - var nextlen = tree[0].dl; // length of next code - var count = 0; // repeat count of the current code - var max_count = 7; // max repeat count - var min_count = 4; // min repeat count - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[max_code + 1].dl = 0xffff; // guard - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n + 1].dl; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - zip_bl_tree[curlen].fc += count; - } else if (curlen !== 0) { - if (curlen !== prevlen) { - zip_bl_tree[curlen].fc++; - } - zip_bl_tree[zip_REP_3_6].fc++; - } else if (count <= 10) { - zip_bl_tree[zip_REPZ_3_10].fc++; - } else { - zip_bl_tree[zip_REPZ_11_138].fc++; - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - - /* ========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ - var zip_build_bl_tree = function () { - var max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); - zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); - - // Build the bit length tree: - zip_build_tree(zip_bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (zip_bl_tree[zip_bl_order[max_blindex]].dl !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // encoder->opt_len, encoder->static_len)); - - return max_blindex; - }; - - /* ========================================================================== - * Write out any remaining bits in an incomplete byte. - */ - var zip_bi_windup = function () { - if (zip_bi_valid > 8) { - zip_put_short(zip_bi_buf); - } else if (zip_bi_valid > 0) { - zip_put_byte(zip_bi_buf); - } - zip_bi_buf = 0; - zip_bi_valid = 0; - }; - - /* ========================================================================== - * Send the block data compressed using the given Huffman trees - */ - var zip_compress_block = function ( - ltree, // literal tree - dtree - ) { // distance tree - var dist; // distance of matched string - var lc; // match length or unmatched char (if dist == 0) - var lx = 0; // running index in l_buf - var dx = 0; // running index in d_buf - var fx = 0; // running index in flag_buf - var flag = 0; // current flags - var code; // the code to send - var extra; // number of extra bits to send - - if (zip_last_lit !== 0) { - do { - if ((lx & 7) === 0) { - flag = zip_flag_buf[fx++]; - } - lc = zip_l_buf[lx++] & 0xff; - if ((flag & 1) === 0) { - zip_SEND_CODE(lc, ltree); /* send a literal byte */ - // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - // Here, lc is the match length - MIN_MATCH - code = zip_length_code[lc]; - zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code - extra = zip_extra_lbits[code]; - if (extra !== 0) { - lc -= zip_base_length[code]; - zip_send_bits(lc, extra); // send the extra length bits - } - dist = zip_d_buf[dx++]; - // Here, dist is the match distance - 1 - code = zip_D_CODE(dist); - // Assert (code < D_CODES, "bad d_code"); - - zip_SEND_CODE(code, dtree); // send the distance code - extra = zip_extra_dbits[code]; - if (extra !== 0) { - dist -= zip_base_dist[code]; - zip_send_bits(dist, extra); // send the extra distance bits - } - } // literal or match pair ? - flag >>= 1; - } while (lx < zip_last_lit); - } - - zip_SEND_CODE(zip_END_BLOCK, ltree); - }; - - /* ========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ - var zip_send_tree = function (tree, // the tree to be scanned - max_code) { // and its largest code of non zero frequency - var n; // iterates over all tree elements - var prevlen = -1; // last emitted length - var curlen; // length of current code - var nextlen = tree[0].dl; // length of next code - var count = 0; // repeat count of the current code - var max_count = 7; // max repeat count - var min_count = 4; // min repeat count - - /* tree[max_code+1].dl = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[n + 1].dl; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - do { - zip_SEND_CODE(curlen, zip_bl_tree); - } while (--count !== 0); - } else if (curlen !== 0) { - if (curlen !== prevlen) { - zip_SEND_CODE(curlen, zip_bl_tree); - count--; - } - // Assert(count >= 3 && count <= 6, " 3_6?"); - zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); - zip_send_bits(count - 3, 2); - } else if (count <= 10) { - zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); - zip_send_bits(count - 3, 3); - } else { - zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); - zip_send_bits(count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } - }; - - /* ========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ - var zip_send_all_trees = function (lcodes, dcodes, blcodes) { // number of codes for each tree - var rank; // index in bl_order - - // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - // Tracev((stderr, "\nbl counts: ")); - zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt - zip_send_bits(dcodes - 1, 5); - zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt - for (rank = 0; rank < blcodes; rank++) { - // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); - } - - // send the literal tree - zip_send_tree(zip_dyn_ltree, lcodes - 1); - - // send the distance tree - zip_send_tree(zip_dyn_dtree, dcodes - 1); - }; - - /* ========================================================================== - * Initialize a new block. - */ - var zip_init_block = function () { - var n; // iterates over tree elements - - // Initialize the trees. - for (n = 0; n < zip_L_CODES; n++) { - zip_dyn_ltree[n].fc = 0; - } - for (n = 0; n < zip_D_CODES; n++) { - zip_dyn_dtree[n].fc = 0; - } - for (n = 0; n < zip_BL_CODES; n++) { - zip_bl_tree[n].fc = 0; - } - - zip_dyn_ltree[zip_END_BLOCK].fc = 1; - zip_opt_len = zip_static_len = 0; - zip_last_lit = zip_last_dist = zip_last_flags = 0; - zip_flags = 0; - zip_flag_bit = 1; - }; - - /* ========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ - var zip_flush_block = function (eof) { // true if this is the last block for a file - var opt_lenb, static_lenb; // opt_len and static_len in bytes - var max_blindex; // index of last bit length code of non zero freq - var stored_len; // length of input block - - stored_len = zip_strstart - zip_block_start; - zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items - - // Construct the literal and distance trees - zip_build_tree(zip_l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", - // encoder->opt_len, encoder->static_len)); - - zip_build_tree(zip_d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", - // encoder->opt_len, encoder->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = zip_build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb = (zip_opt_len + 3 + 7) >> 3; - static_lenb = (zip_static_len + 3 + 7) >> 3; - - // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", - // opt_lenb, encoder->opt_len, - // static_lenb, encoder->static_len, stored_len, - // encoder->last_lit, encoder->last_dist)); - - if (static_lenb <= opt_lenb) { - opt_lenb = static_lenb; - } - if (stored_len + 4 <= opt_lenb // 4: two words for the lengths - && zip_block_start >= 0) { - var i; - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ - zip_bi_windup(); /* align on byte boundary */ - zip_put_short(stored_len); - zip_put_short(~stored_len); - - // copy block - /* - p = &window[block_start]; - for (i = 0; i < stored_len; i++) - put_byte(p[i]); - */ - for (i = 0; i < stored_len; i++) { - zip_put_byte(zip_window[zip_block_start + i]); - } - - } else if (static_lenb === opt_lenb) { - zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); - zip_compress_block(zip_static_ltree, zip_static_dtree); - } else { - zip_send_bits((zip_DYN_TREES << 1) + eof, 3); - zip_send_all_trees(zip_l_desc.max_code + 1, - zip_d_desc.max_code + 1, - max_blindex + 1); - zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); - } - - zip_init_block(); - - if (eof !== 0) { - zip_bi_windup(); - } - }; - - /* ========================================================================== - * Processes a new input file and return its compressed length. This - * function does not perform lazy evaluationof matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ - var zip_deflate_fast = function () { - while (zip_lookahead !== 0 && zip_qhead === null) { - var flush; // set if current block must be flushed - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - zip_INSERT_STRING(); - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (zip_hash_head !== zip_NIL && - zip_strstart - zip_hash_head <= zip_MAX_DIST) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - zip_match_length = zip_longest_match(zip_hash_head); - /* longest_match() sets match_start */ - if (zip_match_length > zip_lookahead) { - zip_match_length = zip_lookahead; - } - } - if (zip_match_length >= zip_MIN_MATCH) { - // check_match(strstart, match_start, match_length); - - flush = zip_ct_tally(zip_strstart - zip_match_start, - zip_match_length - zip_MIN_MATCH); - zip_lookahead -= zip_match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (zip_match_length <= zip_max_lazy_match) { - zip_match_length--; // string at strstart already in hash table - do { - zip_strstart++; - zip_INSERT_STRING(); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH - * these bytes are garbage, but it does not matter since - * the next lookahead bytes will be emitted as literals. - */ - } while (--zip_match_length !== 0); - zip_strstart++; - } else { - zip_strstart += zip_match_length; - zip_match_length = 0; - zip_ins_h = zip_window[zip_strstart] & 0xff; - // UPDATE_HASH(ins_h, window[strstart + 1]); - zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - - } - } else { - /* No match, output a literal byte */ - flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); - zip_lookahead--; - zip_strstart++; - } - if (flush) { - zip_flush_block(0); - zip_block_start = zip_strstart; - } - - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window(); - } - } - }; - - var zip_deflate_better = function () { - /* Process the input block. */ - while (zip_lookahead !== 0 && zip_qhead === null) { - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - zip_INSERT_STRING(); - - /* Find the longest match, discarding those <= prev_length. - */ - zip_prev_length = zip_match_length; - zip_prev_match = zip_match_start; - zip_match_length = zip_MIN_MATCH - 1; - - if (zip_hash_head !== zip_NIL && - zip_prev_length < zip_max_lazy_match && - zip_strstart - zip_hash_head <= zip_MAX_DIST) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - zip_match_length = zip_longest_match(zip_hash_head); - /* longest_match() sets match_start */ - if (zip_match_length > zip_lookahead) { - zip_match_length = zip_lookahead; - } - - /* Ignore a length 3 match if it is too distant: */ - if (zip_match_length === zip_MIN_MATCH && - zip_strstart - zip_match_start > zip_TOO_FAR) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - zip_match_length--; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (zip_prev_length >= zip_MIN_MATCH && - zip_match_length <= zip_prev_length) { - var flush; // set if current block must be flushed - - // check_match(strstart - 1, prev_match, prev_length); - flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, - zip_prev_length - zip_MIN_MATCH); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. - */ - zip_lookahead -= zip_prev_length - 1; - zip_prev_length -= 2; - do { - zip_strstart++; - zip_INSERT_STRING(); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH - * these bytes are garbage, but it does not matter since the - * next lookahead bytes will always be emitted as literals. - */ - } while (--zip_prev_length !== 0); - zip_match_available = 0; - zip_match_length = zip_MIN_MATCH - 1; - zip_strstart++; - if (flush) { - zip_flush_block(0); - zip_block_start = zip_strstart; - } - } else if (zip_match_available !== 0) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { - zip_flush_block(0); - zip_block_start = zip_strstart; - } - zip_strstart++; - zip_lookahead--; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - zip_match_available = 1; - zip_strstart++; - zip_lookahead--; - } - - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { - zip_fill_window(); - } - } - }; - - /* ========================================================================== - * Allocate the match buffer, initialize the various tables and save the - * location of the internal file attribute (ascii/binary) and method - * (DEFLATE/STORE). - */ - var zip_ct_init = function () { - var n; // iterates over tree elements - var bits; // bit counter - var length; // length value - var code; // code value - var dist; // distance index - - if (zip_static_dtree[0].dl !== 0) { - return; // ct_init already called - } - - zip_l_desc.dyn_tree = zip_dyn_ltree; - zip_l_desc.static_tree = zip_static_ltree; - zip_l_desc.extra_bits = zip_extra_lbits; - zip_l_desc.extra_base = zip_LITERALS + 1; - zip_l_desc.elems = zip_L_CODES; - zip_l_desc.max_length = zip_MAX_BITS; - zip_l_desc.max_code = 0; - - zip_d_desc.dyn_tree = zip_dyn_dtree; - zip_d_desc.static_tree = zip_static_dtree; - zip_d_desc.extra_bits = zip_extra_dbits; - zip_d_desc.extra_base = 0; - zip_d_desc.elems = zip_D_CODES; - zip_d_desc.max_length = zip_MAX_BITS; - zip_d_desc.max_code = 0; - - zip_bl_desc.dyn_tree = zip_bl_tree; - zip_bl_desc.static_tree = null; - zip_bl_desc.extra_bits = zip_extra_blbits; - zip_bl_desc.extra_base = 0; - zip_bl_desc.elems = zip_BL_CODES; - zip_bl_desc.max_length = zip_MAX_BL_BITS; - zip_bl_desc.max_code = 0; - - // Initialize the mapping length (0..255) -> length code (0..28) - length = 0; - for (code = 0; code < zip_LENGTH_CODES - 1; code++) { - zip_base_length[code] = length; - for (n = 0; n < (1 << zip_extra_lbits[code]); n++) { - zip_length_code[length++] = code; - } - } - // Assert (length == 256, "ct_init: length != 256"); - - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - zip_length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - zip_base_dist[code] = dist; - for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { - zip_dist_code[dist++] = code; - } - } - // Assert (dist == 256, "ct_init: dist != 256"); - dist >>= 7; // from now on, all distances are divided by 128 - n = code; - for (code = n; code < zip_D_CODES; code++) { - zip_base_dist[code] = dist << 7; - for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) { - zip_dist_code[256 + dist++] = code; - } - } - // Assert (dist == 256, "ct_init: 256+dist != 512"); - - // Construct the codes of the static literal tree - for (bits = 0; bits <= zip_MAX_BITS; bits++) { - zip_bl_count[bits] = 0; - } - n = 0; - while (n <= 143) { - zip_static_ltree[n++].dl = 8; - zip_bl_count[8]++; - } - while (n <= 255) { - zip_static_ltree[n++].dl = 9; - zip_bl_count[9]++; - } - while (n <= 279) { - zip_static_ltree[n++].dl = 7; - zip_bl_count[7]++; - } - while (n <= 287) { - zip_static_ltree[n++].dl = 8; - zip_bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); - - /* The static distance tree is trivial: */ - for (n = 0; n < zip_D_CODES; n++) { - zip_static_dtree[n].dl = 5; - zip_static_dtree[n].fc = zip_bi_reverse(n, 5); - } - - // Initialize the first block of the first file: - zip_init_block(); - }; - - - var zip_init_deflate = function () { - if (zip_eofile) { - return; - } - zip_bi_buf = 0; - zip_bi_valid = 0; - zip_ct_init(); - zip_lm_init(); - - zip_qhead = null; - zip_outcnt = 0; - zip_outoff = 0; - - if (zip_compr_level <= 3) { - zip_prev_length = zip_MIN_MATCH - 1; - zip_match_length = 0; - } else { - zip_match_length = zip_MIN_MATCH - 1; - zip_match_available = 0; - } - - zip_complete = false; - }; - - var zip_qcopy = function (buff, off, buff_size) { - var n, i, j; - - n = 0; - while (zip_qhead !== null && n < buff_size) { - i = buff_size - n; - if (i > zip_qhead.len) { - i = zip_qhead.len; - } - // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); - for (j = 0; j < i; j++) { - buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; - } - - zip_qhead.off += i; - zip_qhead.len -= i; - n += i; - if (zip_qhead.len === 0) { - var p; - p = zip_qhead; - zip_qhead = zip_qhead.next; - zip_reuse_queue(p); - } - } - - if (n === buff_size) { - return n; - } - - if (zip_outoff < zip_outcnt) { - i = buff_size - n; - if (i > zip_outcnt - zip_outoff) { - i = zip_outcnt - zip_outoff; - } - // System.arraycopy(outbuf, outoff, buff, off + n, i); - for (j = 0; j < i; j++) { - buff[off + n + j] = zip_outbuf[zip_outoff + j]; - } - zip_outoff += i; - n += i; - if (zip_outcnt === zip_outoff) { - zip_outcnt = zip_outoff = 0; - } - } - return n; - }; - - /* ========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ - var zip_deflate_internal = function (buff, off, buff_size) { - var n; - - if (!zip_initflag) { - zip_init_deflate(); - zip_initflag = true; - if (zip_lookahead === 0) { // empty - zip_complete = true; - return 0; - } - } - - if ((n = zip_qcopy(buff, off, buff_size)) === buff_size) { - return buff_size; - } - - if (zip_complete) { - return n; - } - - if (zip_compr_level <= 3) { // optimized for speed - zip_deflate_fast(); - } else { - zip_deflate_better(); - } - if (zip_lookahead === 0) { - if (zip_match_available !== 0) { - zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); - } - zip_flush_block(1); - zip_complete = true; - } - return n + zip_qcopy(buff, n + off, buff_size - n); - }; - - var zip_deflate = function (str, level) { - var i, j; - - zip_deflate_data = str; - zip_deflate_pos = 0; - if (typeof level === "undefined") { - level = zip_DEFAULT_LEVEL; - } - zip_deflate_start(level); - - var buff = new Array(1024); - var aout = []; - while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { - var cbuf = []; - cbuf.length = i; - for (j = 0; j < i; j++) { - cbuf[j] = String.fromCharCode(buff[j]); - } - aout[aout.length] = cbuf.join(""); - } - zip_deflate_data = null; // G.C. - return aout.join(""); - }; - - this.deflate = zip_deflate; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js deleted file mode 100644 index 0005ea56ea..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js +++ /dev/null @@ -1,790 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core*/ -/* - * $Id: rawinflate.js,v 0.2 2009/03/01 18:32:24 dankogai Exp $ - * - * original: - * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt - */ - -/** - * @constructor - */ -core.RawInflate = function RawInflate() { - -/* Copyright (C) 1999 Masanao Izumo - * Version: 1.0.0.1 - * LastModified: Dec 25 1999 - */ - -/* Interface: - * data = zip_inflate(src); - */ - -/* constant parameters */ -var zip_WSIZE = 32768; // Sliding Window size -var zip_STORED_BLOCK = 0; -var zip_STATIC_TREES = 1; -var zip_DYN_TREES = 2; - -/* for inflate */ -var zip_lbits = 9; // bits in base literal/length lookup table -var zip_dbits = 6; // bits in base distance lookup table -var zip_INBUFSIZ = 32768; // Input buffer size -var zip_INBUF_EXTRA = 64; // Extra buffer - -/* variables (inflate) */ -var zip_slide; -var zip_wp; // current position in slide -var zip_fixed_tl = null; // inflate static -var zip_fixed_td; // inflate static -var zip_fixed_bl, fixed_bd; // inflate static -var zip_bit_buf; // bit buffer -var zip_bit_len; // bits in bit buffer -var zip_method; -var zip_eof; -var zip_copy_leng; -var zip_copy_dist; -var zip_tl, zip_td; // literal/length and distance decoder tables -var zip_bl, zip_bd; // number of bits decoded by tl and td - -var zip_inflate_data; -var zip_inflate_pos; - - -/* constant tables (inflate) */ -var zip_MASK_BITS = new Array( - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff); -// Tables for deflate from PKZIP's appnote.txt. -var zip_cplens = new Array( // Copy lengths for literal codes 257..285 - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); -/* note: see note #13 above about the 258 in this list. */ -var zip_cplext = new Array( // Extra bits for literal codes 257..285 - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid -var zip_cpdist = new Array( // Copy offsets for distance codes 0..29 - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577); -var zip_cpdext = new Array( // Extra bits for distance codes - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13); -var zip_border = new Array( // Order of the bit length code lengths - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); -/* objects (inflate) */ - -/** - * @constructor - */ -var zip_HuftList = function() { - this.next = null; - this.list = null; -} - -/** - * @constructor - */ -var zip_HuftNode = function() { - this.e = 0; // number of extra bits or operation - this.b = 0; // number of bits in this code or subcode - - // union - this.n = 0; // literal, length base, or distance base - this.t = null; // (zip_HuftNode) pointer to next level of table -} - -/** - * @constructor - */ -var zip_HuftBuild = function(b, // code lengths in bits (all assumed <= BMAX) - n, // number of codes (assumed <= N_MAX) - s, // number of simple-valued codes (0..s-1) - d, // list of base values for non-simple codes - e, // list of extra bits for non-simple codes - mm // maximum lookup bits - ) { - this.BMAX = 16; // maximum bit length of any code - this.N_MAX = 288; // maximum number of codes in any set - this.status = 0; // 0: success, 1: incomplete table, 2: bad input - this.root = null; // (zip_HuftList) starting table - this.m = 0; // maximum lookup bits, returns actual - -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return zero on success, one if - the given code set is incomplete (the tables are still built in this - case), two if the input is invalid (all zero length codes or an - oversubscribed set of lengths), and three if not enough memory. - The code with value 256 is special, and the tables are constructed - so that no bits beyond that code are fetched when that code is - decoded. */ - { - var a; // counter for codes of length k - var c = new Array(this.BMAX+1); // bit length count table - var el; // length of EOB code (value 256) - var f; // i repeats in table every f entries - var g; // maximum code length - var h; // table level - var i; // counter, current code - var j; // counter - var k; // number of bits in current code - var lx = new Array(this.BMAX+1); // stack of bits per table - var p; // pointer into c[], b[], or v[] - var pidx; // index of p - var q; // (zip_HuftNode) points to current table - var r = new zip_HuftNode(); // table entry for structure assignment - var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack - var v = new Array(this.N_MAX); // values in order of bit length - var w; - var x = new Array(this.BMAX+1);// bit offsets, then code stack - var xp; // pointer into x or c - var y; // number of dummy codes added - var z; // number of entries in current table - var o; - var tail; // (zip_HuftList) - - tail = this.root = null; - for(i = 0; i < c.length; i++) - c[i] = 0; - for(i = 0; i < lx.length; i++) - lx[i] = 0; - for(i = 0; i < u.length; i++) - u[i] = null; - for(i = 0; i < v.length; i++) - v[i] = 0; - for(i = 0; i < x.length; i++) - x[i] = 0; - - // Generate counts for each bit length - el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any - p = b; pidx = 0; - i = n; - do { - c[p[pidx]]++; // assume all entries <= BMAX - pidx++; - } while(--i > 0); - if(c[0] == n) { // null input--all zero length codes - this.root = null; - this.m = 0; - this.status = 0; - return; - } - - // Find minimum and maximum length, bound *m by those - for(j = 1; j <= this.BMAX; j++) - if(c[j] != 0) - break; - k = j; // minimum code length - if(mm < j) - mm = j; - for(i = this.BMAX; i != 0; i--) - if(c[i] != 0) - break; - g = i; // maximum code length - if(mm > i) - mm = i; - - // Adjust last length count to fill out codes, if needed - for(y = 1 << j; j < i; j++, y <<= 1) - if((y -= c[j]) < 0) { - this.status = 2; // bad input: more codes than bits - this.m = mm; - return; - } - if((y -= c[i]) < 0) { - this.status = 2; - this.m = mm; - return; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = c; - pidx = 1; - xp = 2; - while(--i > 0) // note that i == g from above - x[xp++] = (j += p[pidx++]); - - // Make a table of values in order of bit lengths - p = b; pidx = 0; - i = 0; - do { - if((j = p[pidx++]) != 0) - v[x[j]++] = i; - } while(++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = v; pidx = 0; // grab values in bit order - h = -1; // no tables yet--level -1 - w = lx[0] = 0; // no bits decoded yet - q = null; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for(; k <= g; k++) { - a = c[k]; - while(a-- > 0) { - // here i is the Huffman code of length k bits for value p[pidx] - // make tables up to required level - while(k > w + lx[1 + h]) { - w += lx[1 + h]; // add bits already decoded - h++; - - // compute minimum size table less than or equal to *m bits - z = (z = g - w) > mm ? mm : z; // upper limit - if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table - // too few codes for k-w bit table - f -= a + 1; // deduct codes from patterns left - xp = k; - while(++j < z) { // try smaller tables up to z bits - if((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - if(w + j > el && w < el) - j = el - w; // make EOB code end at table - z = 1 << j; // table entries for j-bit table - lx[1 + h] = j; // set table size in stack - - // allocate and link in new table - q = new Array(z); - for(o = 0; o < z; o++) { - q[o] = new zip_HuftNode(); - } - - if(tail == null) - tail = this.root = new zip_HuftList(); - else - tail = tail.next = new zip_HuftList(); - tail.next = null; - tail.list = q; - u[h] = q; // table starts after link - - /* connect to last table, if there is one */ - if(h > 0) { - x[h] = i; // save pattern for backing up - r.b = lx[h]; // bits to dump before this table - r.e = 16 + j; // bits in this table - r.t = q; // pointer to this table - j = (i & ((1 << w) - 1)) >> (w - lx[h]); - u[h-1][j].e = r.e; - u[h-1][j].b = r.b; - u[h-1][j].n = r.n; - u[h-1][j].t = r.t; - } - } - - // set up table entry in r - r.b = k - w; - if(pidx >= n) - r.e = 99; // out of values--invalid code - else if(p[pidx] < s) { - r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code - r.n = p[pidx++]; // simple code is just the value - } else { - r.e = e[p[pidx] - s]; // non-simple--look up in lists - r.n = d[p[pidx++] - s]; - } - - // fill code-like entries with r // - f = 1 << (k - w); - for(j = i >> w; j < z; j += f) { - q[j].e = r.e; - q[j].b = r.b; - q[j].n = r.n; - q[j].t = r.t; - } - - // backwards increment the k-bit code i - for(j = 1 << (k - 1); (i & j) != 0; j >>= 1) - i ^= j; - i ^= j; - - // backup over finished tables - while((i & ((1 << w) - 1)) != x[h]) { - w -= lx[h]; // don't need to update q - h--; - } - } - } - - /* return actual size of base table */ - this.m = lx[1]; - - /* Return true (1) if we were given an incomplete table */ - this.status = ((y != 0 && g != 1) ? 1 : 0); - } /* end of constructor */ -} - - -/* routines (inflate) */ - -var zip_GET_BYTE = function() { - if(zip_inflate_data.length == zip_inflate_pos) - return -1; - return zip_inflate_data[zip_inflate_pos++]; -} - -var zip_NEEDBITS = function(n) { - while(zip_bit_len < n) { - zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; - zip_bit_len += 8; - } -} - -var zip_GETBITS = function(n) { - return zip_bit_buf & zip_MASK_BITS[n]; -} - -var zip_DUMPBITS = function(n) { - zip_bit_buf >>= n; - zip_bit_len -= n; -} - -var zip_inflate_codes = function(buff, off, size) { - /* inflate (decompress) the codes in a deflated (compressed) block. - Return an error code or zero if it all goes ok. */ - var e; // table entry flag/number of extra bits - var t; // (zip_HuftNode) pointer to table entry - var n; - - if(size == 0) - return 0; - - // inflate the coded data - n = 0; - for(;;) { // do until end of block - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - e = t.e; - while(e > 16) { - if(e == 99) - return -1; - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e; - } - zip_DUMPBITS(t.b); - - if(e == 16) { // then it's a literal - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = t.n; - if(n == size) - return size; - continue; - } - - // exit if end of block - if(e == 15) - break; - - // it's an EOB or a length - - // get length of block to copy - zip_NEEDBITS(e); - zip_copy_leng = t.n + zip_GETBITS(e); - zip_DUMPBITS(e); - - // decode distance of block to copy - zip_NEEDBITS(zip_bd); - t = zip_td.list[zip_GETBITS(zip_bd)]; - e = t.e; - - while(e > 16) { - if(e == 99) - return -1; - zip_DUMPBITS(t.b); - e -= 16; - zip_NEEDBITS(e); - t = t.t[zip_GETBITS(e)]; - e = t.e; - } - zip_DUMPBITS(t.b); - zip_NEEDBITS(e); - zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); - zip_DUMPBITS(e); - - // do the copy - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] - = zip_slide[zip_copy_dist++]; - } - - if(n == size) - return size; - } - - zip_method = -1; // done - return n; -} - -var zip_inflate_stored = function(buff, off, size) { - /* "decompress" an inflated type 0 (stored) block. */ - var n; - - // go to byte boundary - n = zip_bit_len & 7; - zip_DUMPBITS(n); - - // get the length and its complement - zip_NEEDBITS(16); - n = zip_GETBITS(16); - zip_DUMPBITS(16); - zip_NEEDBITS(16); - if(n != ((~zip_bit_buf) & 0xffff)) - return -1; // error in compressed data - zip_DUMPBITS(16); - - // read and output the compressed data - zip_copy_leng = n; - - n = 0; - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = - zip_GETBITS(8); - zip_DUMPBITS(8); - } - - if(zip_copy_leng == 0) - zip_method = -1; // done - return n; -} - -var zip_fixed_bd; -var zip_inflate_fixed = function(buff, off, size) { - /* decompress an inflated type 1 (fixed Huffman codes) block. We should - either replace this with a custom decoder, or at least precompute the - Huffman tables. */ - - // if first time, set up tables for fixed blocks - if(zip_fixed_tl == null) { - var i; // temporary variable - var l = new Array(288); // length list for huft_build - var h; // zip_HuftBuild - - // literal table - for(i = 0; i < 144; i++) - l[i] = 8; - for(; i < 256; i++) - l[i] = 9; - for(; i < 280; i++) - l[i] = 7; - for(; i < 288; i++) // make a complete, but wrong code set - l[i] = 8; - zip_fixed_bl = 7; - - h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, - zip_fixed_bl); - if(h.status != 0) { - alert("HufBuild error: "+h.status); - return -1; - } - zip_fixed_tl = h.root; - zip_fixed_bl = h.m; - - // distance table - for(i = 0; i < 30; i++) // make an incomplete code set - l[i] = 5; - zip_fixed_bd = 5; - - h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); - if(h.status > 1) { - zip_fixed_tl = null; - alert("HufBuild error: "+h.status); - return -1; - } - zip_fixed_td = h.root; - zip_fixed_bd = h.m; - } - - zip_tl = zip_fixed_tl; - zip_td = zip_fixed_td; - zip_bl = zip_fixed_bl; - zip_bd = zip_fixed_bd; - return zip_inflate_codes(buff, off, size); -} - -var zip_inflate_dynamic = function(buff, off, size) { - // decompress an inflated type 2 (dynamic Huffman codes) block. - var i; // temporary variables - var j; - var l; // last length - var n; // number of lengths to get - var t; // (zip_HuftNode) literal/length code table - var nb; // number of bit length codes - var nl; // number of literal/length codes - var nd; // number of distance codes - var ll = new Array(286+30); // literal/length and distance code lengths - var h; // (zip_HuftBuild) - - for(i = 0; i < ll.length; i++) - ll[i] = 0; - - // read in table lengths - zip_NEEDBITS(5); - nl = 257 + zip_GETBITS(5); // number of literal/length codes - zip_DUMPBITS(5); - zip_NEEDBITS(5); - nd = 1 + zip_GETBITS(5); // number of distance codes - zip_DUMPBITS(5); - zip_NEEDBITS(4); - nb = 4 + zip_GETBITS(4); // number of bit length codes - zip_DUMPBITS(4); - if(nl > 286 || nd > 30) - return -1; // bad lengths - - // read in bit-length-code lengths - for(j = 0; j < nb; j++) - { - zip_NEEDBITS(3); - ll[zip_border[j]] = zip_GETBITS(3); - zip_DUMPBITS(3); - } - for(; j < 19; j++) - ll[zip_border[j]] = 0; - - // build decoding table for trees--single level, 7 bit lookup - zip_bl = 7; - h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); - if(h.status != 0) - return -1; // incomplete code set - - zip_tl = h.root; - zip_bl = h.m; - - // read in literal and distance code lengths - n = nl + nd; - i = l = 0; - while(i < n) { - zip_NEEDBITS(zip_bl); - t = zip_tl.list[zip_GETBITS(zip_bl)]; - j = t.b; - zip_DUMPBITS(j); - j = t.n; - if(j < 16) // length of code in bits (0..15) - ll[i++] = l = j; // save last length in l - else if(j == 16) { // repeat last length 3 to 6 times - zip_NEEDBITS(2); - j = 3 + zip_GETBITS(2); - zip_DUMPBITS(2); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = l; - } else if(j == 17) { // 3 to 10 zero length codes - zip_NEEDBITS(3); - j = 3 + zip_GETBITS(3); - zip_DUMPBITS(3); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = 0; - l = 0; - } else { // j == 18: 11 to 138 zero length codes - zip_NEEDBITS(7); - j = 11 + zip_GETBITS(7); - zip_DUMPBITS(7); - if(i + j > n) - return -1; - while(j-- > 0) - ll[i++] = 0; - l = 0; - } - } - - // build the decoding tables for literal/length and distance codes - zip_bl = zip_lbits; - h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); - if(zip_bl == 0) // no literals or lengths - h.status = 1; - if(h.status != 0) { - //if(h.status == 1) - // ;// **incomplete literal tree** - return -1; // incomplete code set - } - zip_tl = h.root; - zip_bl = h.m; - - for(i = 0; i < nd; i++) - ll[i] = ll[i + nl]; - zip_bd = zip_dbits; - h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); - zip_td = h.root; - zip_bd = h.m; - - if(zip_bd == 0 && nl > 257) { // lengths but no distances - // **incomplete distance tree** - return -1; - } - - //if(h.status == 1) { -// ;// **incomplete distance tree** - //} - if(h.status != 0) - return -1; - - // decompress until an end-of-block code - return zip_inflate_codes(buff, off, size); -} - -var zip_inflate_start = function() { - var i; - - if(zip_slide == null) - zip_slide = new Array(2 * zip_WSIZE); - zip_wp = 0; - zip_bit_buf = 0; - zip_bit_len = 0; - zip_method = -1; - zip_eof = false; - zip_copy_leng = zip_copy_dist = 0; - zip_tl = null; -} - -var zip_inflate_internal = function(buff, off, size) { - // decompress an inflated entry - var n, i; - - n = 0; - while(n < size) { - if(zip_eof && zip_method == -1) - return n; - - if(zip_copy_leng > 0) { - if(zip_method != zip_STORED_BLOCK) { - // STATIC_TREES or DYN_TREES - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_copy_dist &= zip_WSIZE - 1; - zip_wp &= zip_WSIZE - 1; - buff[off + n++] = zip_slide[zip_wp++] = - zip_slide[zip_copy_dist++]; - } - } else { - while(zip_copy_leng > 0 && n < size) { - zip_copy_leng--; - zip_wp &= zip_WSIZE - 1; - zip_NEEDBITS(8); - buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); - zip_DUMPBITS(8); - } - if(zip_copy_leng == 0) - zip_method = -1; // done - } - if(n == size) - return n; - } - - if(zip_method == -1) { - if(zip_eof) - break; - - // read in last block bit - zip_NEEDBITS(1); - if(zip_GETBITS(1) != 0) - zip_eof = true; - zip_DUMPBITS(1); - - // read in block type - zip_NEEDBITS(2); - zip_method = zip_GETBITS(2); - zip_DUMPBITS(2); - zip_tl = null; - zip_copy_leng = 0; - } - - switch(zip_method) { - case 0: // zip_STORED_BLOCK - i = zip_inflate_stored(buff, off + n, size - n); - break; - - case 1: // zip_STATIC_TREES - if(zip_tl != null) - i = zip_inflate_codes(buff, off + n, size - n); - else - i = zip_inflate_fixed(buff, off + n, size - n); - break; - - case 2: // zip_DYN_TREES - if(zip_tl != null) - i = zip_inflate_codes(buff, off + n, size - n); - else - i = zip_inflate_dynamic(buff, off + n, size - n); - break; - - default: // error - i = -1; - break; - } - - if(i == -1) { - if(zip_eof) - return 0; - return -1; - } - n += i; - } - return n; -} - -var zip_inflate = function(data, size) { - var i, j; - - zip_inflate_start(); - zip_inflate_data = data; - zip_inflate_pos = 0; - - var buff = new runtime.ByteArray(size); - zip_inflate_internal(buff, 0, size); - zip_inflate_data = null; // G.C. - return buff; -} - -this.inflate = zip_inflate; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js deleted file mode 100644 index 4dbe1fa2c0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, Runtime: true, core: true*/ -/*jslint evil: true*/ -/** - * @interface - */ -core.UnitTest = function UnitTest() {"use strict";}; -/** - * @return {undefined} - */ -core.UnitTest.prototype.setUp = function () {"use strict";}; -/** - * @return {undefined} - */ -core.UnitTest.prototype.tearDown = function () {"use strict";}; -/** - * @return {!string} - */ -core.UnitTest.prototype.description = function () {"use strict";}; -/** - * @return {Array.} - */ -core.UnitTest.prototype.tests = function () {"use strict";}; -/** - * @return {Array.} - */ -core.UnitTest.prototype.asyncTests = function () {"use strict";}; - -/** - * @constructor - */ -core.UnitTestRunner = function UnitTestRunner() { - "use strict"; - var failedTests = 0; - function debug(msg) { - runtime.log(msg); - } - function testFailed(msg) { - failedTests += 1; - runtime.log("fail", msg); - } - function testPassed(msg) { - runtime.log("pass", msg); - } - function areArraysEqual(a, b) { - var i; - try { - if (a.length !== b.length) { - return false; - } - for (i = 0; i < a.length; i += 1) { - if (a[i] !== b[i]) { - return false; - } - } - } catch (ex) { - return false; - } - return true; - } - function isResultCorrect(actual, expected) { - if (expected === 0) { - return actual === expected && (1 / actual) === (1 / expected); - } - if (actual === expected) { - return true; - } - if (typeof expected === "number" && isNaN(expected)) { - return typeof actual === "number" && isNaN(actual); - } - if (Object.prototype.toString.call(expected) === - Object.prototype.toString.call([])) { - return areArraysEqual(actual, expected); - } - return false; - } - function stringify(v) { - if (v === 0 && 1 / v < 0) { - return "-0"; - } - return String(v); - } - /** - * @param {!Object} t - * @param {!string} a - * @param {!string} b - * @return {undefined} - */ - function shouldBe(t, a, b) { - if (typeof a !== "string" || typeof b !== "string") { - debug("WARN: shouldBe() expects string arguments"); - } - var exception, av, bv; - try { - av = eval(a); - } catch (e) { - exception = e; - } - bv = eval(b); - - if (exception) { - testFailed(a + " should be " + bv + ". Threw exception " + - exception); - } else if (isResultCorrect(av, bv)) { - testPassed(a + " is " + b); - } else if (typeof av === typeof bv) { - testFailed(a + " should be " + bv + ". Was " + stringify(av) + "."); - } else { - testFailed(a + " should be " + bv + " (of type " + typeof bv + - "). Was " + av + " (of type " + typeof av + ")."); - } - } - /** - * @param {!Object} t context in which values to be tested are placed - * @param {!string} a the value to be checked - * @return {undefined} - */ - function shouldBeNonNull(t, a) { - var exception, av; - try { - av = eval(a); - } catch (e) { - exception = e; - } - - if (exception) { - testFailed(a + " should be non-null. Threw exception " + exception); - } else if (av !== null) { - testPassed(a + " is non-null."); - } else { - testFailed(a + " should be non-null. Was " + av); - } - } - /** - * @param {!Object} t context in which values to be tested are placed - * @param {!string} a the value to be checked - * @return {undefined} - */ - function shouldBeNull(t, a) { - shouldBe(t, a, "null"); - } - this.shouldBeNull = shouldBeNull; - this.shouldBeNonNull = shouldBeNonNull; - this.shouldBe = shouldBe; - this.countFailedTests = function () { - return failedTests; - }; -}; - -/** - * @constructor - */ -core.UnitTester = function UnitTester() { - "use strict"; - var failedTests = 0, - results = {}; - /** - * @param {Function} TestClass the constructor for the test class - * @param {!function():undefined} callback - * @return {undefined} - */ - this.runTests = function (TestClass, callback) { - var testName = Runtime.getFunctionName(TestClass), - tname, - runner = new core.UnitTestRunner(), - test = new TestClass(runner), - testResults = {}, - i, - t, - tests, - lastFailCount; - - // check that this test has not been run or started yet - if (testName.hasOwnProperty(results)) { - runtime.log("Test " + testName + " has already run."); - return; - } - - runtime.log("Running " + testName + ": " + test.description()); - tests = test.tests(); - for (i = 0; i < tests.length; i += 1) { - t = tests[i]; - tname = Runtime.getFunctionName(t); - runtime.log("Running " + tname); - lastFailCount = runner.countFailedTests(); - test.setUp(); - t(); - test.tearDown(); - testResults[tname] = lastFailCount === runner.countFailedTests(); - } - function runAsyncTests(todo) { - if (todo.length === 0) { - results[testName] = testResults; - failedTests += runner.countFailedTests(); - callback(); - return; - } - t = todo[0]; - var tname = Runtime.getFunctionName(t); - runtime.log("Running " + tname); - lastFailCount = runner.countFailedTests(); - test.setUp(); - t(function () { - test.tearDown(); - testResults[tname] = lastFailCount === - runner.countFailedTests(); - runAsyncTests(todo.slice(1)); - }); - } - runAsyncTests(test.asyncTests()); - }; - /** - * @return {!number} - **/ - this.countFailedTests = function () { - return failedTests; - }; - /** - * @return {!Object} - **/ - this.results = function () { - return results; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js deleted file mode 100644 index 66f508ee39..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js +++ /dev/null @@ -1,600 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime, core, DOMParser*/ -/*jslint bitwise: true*/ -/* -* @preserve -* WebODF -* Copyright (c) 2010 Jos van den Oever -* Licensed under the ... License: -* -* Project home: http://www.webodf.org/ -*/ - -runtime.loadClass("core.RawInflate"); -runtime.loadClass("core.ByteArray"); -runtime.loadClass("core.ByteArrayWriter"); -runtime.loadClass("core.Base64"); - -/** - * @constructor - * @param {!string} url path to zip file, should be readable by the runtime - * @param {?function(?string, !core.Zip):undefined} entriesReadCallback callback - * indicating the zip - * has loaded this list of entries, the arguments are a string that - * indicates error if present and the created object - */ -core.Zip = function Zip(url, entriesReadCallback) { - "use strict"; - var /**@type{Array.}*/ entries, - /**@type{number}*/ filesize, - /**@type{number}*/ nEntries, - /**@type{Function}*/ inflate = new core.RawInflate().inflate, - /**@type{!core.Zip}*/ zip = this, - base64 = new core.Base64(); - - /** - * @param {!Runtime.ByteArray} data - * @return {!number} - */ - function crc32(data) { - // Calculate the crc32 polynomial of a string - // - // version: 1009.2513 - // discuss at: http:\/\/phpjs.org\/functions\/crc32 - // + original by: Webtoolkit.info (http:\/\/www.webtoolkit.info\/) - // + improved by: T0bsn - // - depends on: utf8_encode - // * example 1: crc32('Kevin van Zonneveld'); - // * returns 1: 1249991249 - var /**@const@type{!Array.}*/table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D], - /**@type{!number}*/ crc = 0, - /**@type{!number}*/ i, - /**@const@type{!number}*/ iTop = data.length, - /**@type{!number}*/ x = 0, - /**@type{!number}*/ y = 0; - crc = crc ^ (-1); - for (i = 0; i < iTop; i += 1) { - y = (crc ^ data[i]) & 0xFF; - x = table[y]; - crc = (crc >>> 8) ^ x; - } - return crc ^ (-1); - } - - /** - * @param {!number} dostime - * @return {!Date} - */ - function dosTime2Date(dostime) { - var /**@const@type{!number}*/ year = ((dostime >> 25) & 0x7f) + 1980, - /**@const@type{!number}*/ month = ((dostime >> 21) & 0x0f) - 1, - /**@const@type{!number}*/ mday = (dostime >> 16) & 0x1f, - /**@const@type{!number}*/ hour = (dostime >> 11) & 0x0f, - /**@const@type{!number}*/ min = (dostime >> 5) & 0x3f, - /**@const@type{!number}*/ sec = (dostime & 0x1f) << 1, - /**@const@type{!Date}*/ d - = new Date(year, month, mday, hour, min, sec); - return d; - } - /** - * @param {!Date} date - * @return {!number} - */ - function date2DosTime(date) { - var /**@const@type{!number}*/ y = date.getFullYear(); - return y < 1980 ? 0 : - ((y - 1980) << 25) | ((date.getMonth() + 1) << 21) | - (date.getDate() << 16) | (date.getHours() << 11) | - (date.getMinutes() << 5) | (date.getSeconds() >> 1); - } - /** - * Create a new ZipEntry. - * If the stream is not provided, the object should be initialized - * with ZipEntry.set() - * @constructor - * @param {!string} url - * @param {!core.ByteArray=} stream - */ - function ZipEntry(url, stream) { - var /**@const@type{!number}*/ sig, - /**@const@type{!number}*/ namelen, - /**@const@type{!number}*/ extralen, - /**@const@type{!number}*/ commentlen, - /**@const@type{!number}*/ compressionMethod, - /**@const@type{!number}*/ compressedSize, - /**@const@type{!number}*/ uncompressedSize, - /**@const@type{!number}*/ offset, - /**@const@type{!number}*/ crc, - /**@const@type{!ZipEntry}*/ entry = this; - - /** - * @param {!Runtime.ByteArray} data - * @param {!function(?string, ?Runtime.ByteArray)} callback - * @return {undefined} - */ - function handleEntryData(data, callback) { - var /**@const@type{!core.ByteArray}*/ stream - = new core.ByteArray(data), - /**@const@type{!number}*/ sig = stream.readUInt32LE(), - /**@const@type{!number}*/ filenamelen, - /**@const@type{!number}*/ extralen; - if (sig !== 0x04034b50) { - callback('File entry signature is wrong.' + sig.toString() + - ' ' + data.length.toString(), null); - return; - } - stream.pos += 22; - filenamelen = stream.readUInt16LE(); - extralen = stream.readUInt16LE(); - stream.pos += filenamelen + extralen; - if (compressionMethod) { - data = data.slice(stream.pos, stream.pos + compressedSize); - if (compressedSize !== data.length) { - callback("The amount of compressed bytes read was " + - data.length.toString() + " instead of " + - compressedSize.toString() + " for " + entry.filename + - " in " + url + ".", null); - return; - } - data = inflate(data, uncompressedSize); - } else { - data = data.slice(stream.pos, stream.pos + uncompressedSize); - } - if (uncompressedSize !== data.length) { - callback("The amount of bytes read was " + - data.length.toString() + - " instead of " + uncompressedSize.toString() + " for " + - entry.filename + " in " + url + ".", null); - return; - } -/* - * This check is disabled for performance reasons - if (crc !== crc32(data)) { - runtime.log("Warning: CRC32 for " + entry.filename + - " is wrong."); - } -*/ - entry.data = data; - callback(null, data); - } - /** - * @param {!function(?string, ?Runtime.ByteArray)} callback - * @return {undefined} - */ - function load(callback) { - // if data has already been downloaded, use that - if (entry.data !== undefined) { - callback(null, entry.data); - return; - } - // the 256 at the end is security for when local extra field is - // larger - var /**@type{!number}*/ size - = compressedSize + 34 + namelen + extralen + 256; - if (size + offset > filesize) { - size = filesize - offset; - } - runtime.read(url, offset, size, function (err, data) { - if (err) { - callback(err, data); - } else { - handleEntryData(data, callback); - } - }); - } - this.load = load; - /** - * @param {!string} filename - * @param {!Runtime.ByteArray} data - * @param {!boolean} compressed - * @param {!Date} date - * @return {undefined} - */ - function set(filename, data, compressed, date) { - entry.filename = filename; - entry.data = data; - entry.compressed = compressed; - entry.date = date; - } - this.set = set; - /** - * @type {?string} - */ - this.error = null; - - if (!stream) { - return; - } - sig = stream.readUInt32LE(); - - if (sig !== 0x02014b50) { - this.error = - "Central directory entry has wrong signature at position " + - (stream.pos - 4).toString() + ' for file "' + url + '": ' + - stream.data.length.toString(); - return; - } - // stream should be positioned at the start of the CDS entry for the - // file - stream.pos += 6; - compressionMethod = stream.readUInt16LE(); - this.date = dosTime2Date(stream.readUInt32LE()); - crc = stream.readUInt32LE(); - compressedSize = stream.readUInt32LE(); - uncompressedSize = stream.readUInt32LE(); - namelen = stream.readUInt16LE(); - extralen = stream.readUInt16LE(); - commentlen = stream.readUInt16LE(); - stream.pos += 8; - offset = stream.readUInt32LE(); - this.filename = runtime.byteArrayToString( - stream.data.slice(stream.pos, stream.pos + namelen), "utf8"); - stream.pos += namelen + extralen + commentlen; - } - /** - * @param {!Runtime.ByteArray} data - * @param {!function(?string, !core.Zip)} callback - * @return {undefined} - */ - function handleCentralDirectory(data, callback) { - // parse the central directory - var stream = new core.ByteArray(data), i, e; - entries = []; - for (i = 0; i < nEntries; i += 1) { - e = new ZipEntry(url, stream); - if (e.error) { - callback(e.error, zip); - return; - } - entries[entries.length] = e; - } - // report that entries are listed and no error occured - callback(null, zip); - } - /** - * @param {!Runtime.ByteArray} data - * @param {!function(?string, !core.Zip)} callback - * @return {undefined} - */ - function handleCentralDirectoryEnd(data, callback) { - if (data.length !== 22) { - callback("Central directory length should be 22.", zip); - return; - } - var stream = new core.ByteArray(data), sig, disk, cddisk, diskNEntries, - cdsSize, cdsOffset; - sig = stream.readUInt32LE(); - if (sig !== 0x06054b50) { - callback('Central directory signature is wrong: ' + sig.toString(), - zip); - return; - } - disk = stream.readUInt16LE(); - if (disk !== 0) { - callback('Zip files with non-zero disk numbers are not supported.', - zip); - return; - } - cddisk = stream.readUInt16LE(); - if (cddisk !== 0) { - callback('Zip files with non-zero disk numbers are not supported.', - zip); - return; - } - diskNEntries = stream.readUInt16LE(); - nEntries = stream.readUInt16LE(); - if (diskNEntries !== nEntries) { - callback('Number of entries is inconsistent.', zip); - return; - } - cdsSize = stream.readUInt32LE(); - cdsOffset = stream.readUInt16LE(); - cdsOffset = filesize - 22 - cdsSize; - - // for some reason cdsOffset is not always equal to offset calculated - // from the central directory size. The latter is reliable. - runtime.read(url, cdsOffset, filesize - cdsOffset, - function (err, data) { - handleCentralDirectory(data, callback); - }); - } - /** - * @param {!string} filename - * @param {!function(?string, ?Runtime.ByteArray)} callback receiving err and data - * @return {undefined} - */ - function load(filename, callback) { - var entry = null, - end = filesize, - e, - i; - for (i = 0; i < entries.length; i += 1) { - e = entries[i]; - if (e.filename === filename) { - entry = e; - break; - } - } - if (entry) { - if (entry.data) { - callback(null, entry.data); - } else { - entry.load(callback); - } - } else { - callback(filename + " not found.", null); - } - } - /** - * @param {!string} filename - * @param {!function(?string, ?string)} callback receiving err and data - * @return {undefined} - */ - function loadAsString(filename, callback) { - // the javascript implementation simply reads the file and converts to - // string - load(filename, function (err, data) { - if (err) { - return callback(err, null); - } - data = runtime.byteArrayToString(data, "utf8"); - callback(null, data); - }); - } - /** - * @param {!string} filename - * @param {!Object} handler - * @return {undefined} - */ - function loadContentXmlAsFragments(filename, handler) { - // the javascript implementation simply reads the file - loadAsString(filename, function (err, data) { - if (err) { - return handler.rootElementReady(err); - } - handler.rootElementReady(null, data, true); - }); - } - function loadAsDataURL(filename, mimetype, callback) { - load(filename, function (err, data) { - if (err) { - return callback(err, null); - } - var /**@const@type{!Runtime.ByteArray}*/p = data, - chunksize = 45000, // must be multiple of 3 and less than 50000 - i = 0, - url; - if (!mimetype) { - if (p[1] === 0x50 && p[2] === 0x4E && p[3] === 0x47) { - mimetype = "image/png"; - } else if (p[0] === 0xFF && p[1] === 0xD8 && p[2] === 0xFF) { - mimetype = "image/jpeg"; - } else if (p[0] === 0x47 && p[1] === 0x49 && p[2] === 0x46) { - mimetype = "image/gif"; - } else { - mimetype = ""; - } - } - url = 'data:' + mimetype + ';base64,'; - // to avoid exceptions, base64 encoding is done in chunks - // it would make sense to move this to base64.toBase64 - while (i < data.length) { - url += base64.convertUTF8ArrayToBase64( - p.slice(i, Math.min(i + chunksize, p.length)) - ); - i += chunksize; - } - callback(null, url); - }); - } - function loadAsDOM(filename, callback) { - loadAsString(filename, function (err, xmldata) { - if (err) { - callback(err, null); - return; - } - var parser = new DOMParser(); - xmldata = parser.parseFromString(xmldata, "text/xml"); - callback(null, xmldata); - }); - } - /** - * Add or replace an entry to the zip file. - * This data is not stored to disk yet, and therefore, no callback is - * necessary. - * @param {!string} filename - * @param {!Runtime.ByteArray} data - * @param {!boolean} compressed - * @param {!Date} date - * @return {undefined} - */ - function save(filename, data, compressed, date) { - var i, - entry; - for (i = 0; i < entries.length; i += 1) { - entry = entries[i]; - if (entry.filename === filename) { - entry.set(filename, data, compressed, date); - return; - } - } - entry = new ZipEntry(url); - entry.set(filename, data, compressed, date); - entries.push(entry); - } - /** - * @param {!ZipEntry} entry - * @return {!core.ByteArrayWriter} - */ - function writeEntry(entry) { - // each entry is currently stored uncompressed - var data = new core.ByteArrayWriter("utf8"), - length = 0; - data.appendArray([0x50, 0x4B, 0x03, 0x04, 0x14, 0, 0, 0, 0, 0]); - if (entry.data) { - length = entry.data.length; - } - data.appendUInt32LE(date2DosTime(entry.date)); - data.appendUInt32LE(crc32(entry.data)); - data.appendUInt32LE(length); // compressedSize - data.appendUInt32LE(length); // uncompressedSize - data.appendUInt16LE(entry.filename.length); // namelen - data.appendUInt16LE(0); // extralen - data.appendString(entry.filename); - if (entry.data) { - data.appendByteArray(entry.data); - } - return data; - } - /** - * @param {!ZipEntry} entry - * @param {!number} offset - * @return {!core.ByteArrayWriter} - */ - function writeCODEntry(entry, offset) { - // each entry is currently stored uncompressed - var data = new core.ByteArrayWriter("utf8"), - length = 0; - data.appendArray([0x50, 0x4B, 0x01, 0x02, 0x14, 0x00, 0x14, 0x00, - 0, 0, 0, 0]); - if (entry.data) { - length = entry.data.length; - } - data.appendUInt32LE(date2DosTime(entry.date)); - data.appendUInt32LE(crc32(entry.data)); - data.appendUInt32LE(length); // compressedSize - data.appendUInt32LE(length); // uncompressedSize - data.appendUInt16LE(entry.filename.length); // namelen - // extralen, commalen, diskno, file attributes - data.appendArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - data.appendUInt32LE(offset); - data.appendString(entry.filename); - return data; - } - /** - * @param {!number} position - * @param {!function(?string):undefined} callback - * @return {undefined} - */ - function loadAllEntries(position, callback) { - if (position === entries.length) { - callback(null); - return; - } - var entry = entries[position]; - if (entry.data !== undefined) { - loadAllEntries(position + 1, callback); - return; - } - entry.load(function (err) { - if (err) { - callback(err); - return; - } - loadAllEntries(position + 1, callback); - }); - } - /** - * Write the zipfile to the given path. - * @param {!function(?string):undefined} callback receiving possible err - * @return {undefined} - */ - function write(callback) { - // make sure all data is in memory, for each entry that has data - // undefined, try to load the entry - loadAllEntries(0, function (err) { - if (err) { - callback(err); - return; - } - var data = new core.ByteArrayWriter("utf8"), - i, e, codoffset, codsize, - offsets = [0]; - // write entries - for (i = 0; i < entries.length; i += 1) { - data.appendByteArrayWriter(writeEntry(entries[i])); - offsets.push(data.getLength()); - } - // write central directory - codoffset = data.getLength(); - for (i = 0; i < entries.length; i += 1) { - e = entries[i]; - data.appendByteArrayWriter(writeCODEntry(e, offsets[i])); - } - codsize = data.getLength() - codoffset; - data.appendArray([0x50, 0x4B, 0x05, 0x06, 0, 0, 0, 0]); - data.appendUInt16LE(entries.length); - data.appendUInt16LE(entries.length); - data.appendUInt32LE(codsize); - data.appendUInt32LE(codoffset); - data.appendArray([0, 0]); - runtime.writeFile(url, data.getByteArray(), callback); - }); - } - - this.load = load; - this.save = save; - this.write = write; - // a special function that makes faster odf loading possible - this.loadContentXmlAsFragments = loadContentXmlAsFragments; - this.loadAsString = loadAsString; - this.loadAsDOM = loadAsDOM; - this.loadAsDataURL = loadAsDataURL; - this.getEntries = function () { - return entries.slice(); - }; - - // determine the file size - filesize = -1; - // if no callback is defined, this is a new file - if (entriesReadCallback === null) { - entries = []; - return; - } - runtime.getFileSize(url, function (size) { - filesize = size; - if (filesize < 0) { - entriesReadCallback("File '" + url + "' cannot be read.", zip); - } else { - runtime.read(url, filesize - 22, 22, function (err, data) { - // todo: refactor entire zip class - if (err || entriesReadCallback === null) { - entriesReadCallback(err, zip); - } else { - handleCentralDirectoryEnd(data, entriesReadCallback); - } - }); - } - }); -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ b/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ deleted file mode 100644 index c14ec84411..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ +++ /dev/null @@ -1,21 +0,0 @@ -/*global exports require*/ -function createDummyXMLModel() { - var that = {}; - - function preserveWhitespace(node) { - return true; - } - - // return an array with child qnames or null for inserting text. - // the dummy implementation allows text everywhere, but no new elements - // "*" means all elements are allowed - // ["#PCDATA", "*"] means any element and text is allowed - function getAllowedChildren(node, position) { - return [null]; - } - - that.getAllowedChildren = getAllowedChildren; - that.preserveWhitespace = preserveWhitespace; - return that; -} -exports.createDummyXMLModel = createDummyXMLModel; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/export.js b/apps/files_odfviewer/src/webodf/webodf/lib/export.js deleted file mode 100644 index 08982cd424..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/export.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global window runtime odf*/ -/*jslint sub: true*/ - -window["runtime"] = runtime; -runtime["loadClass"] = runtime.loadClass; -window["odf"] = odf; -window["odf"]["OdfCanvas"] = odf.OdfCanvas; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js deleted file mode 100644 index 744b8b022a..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global gui*/ -/** - * Class that represents a caret in a document. In text nodes, a native caret is - * used via the HTML attribute contentEditable. Outside of text nodes, an empty - * element representing the caret is used. - * @constructor - */ -gui.Caret = function Caret(selection, rootNode) { - "use strict"; - var document = rootNode.ownerDocument, - cursorns, - cursorNode; - cursorns = 'urn:webodf:names:cursor'; - cursorNode = document.createElementNS(cursorns, 'cursor'); - /** - * Synchronize the cursor with the current selection. - * If there is a single collapsed selection range, the cursor will be placed - * there. If not, the cursor will be removed from the document tree. - * @return {undefined} - */ - this.updateToSelection = function () { - var range; -// removeCursor(); - if (selection.rangeCount === 1) { - range = selection.getRangeAt(0); -/* - if (range.collapsed) { - putCursor(range.startContainer, range.startOffset); - } -*/ - } - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js deleted file mode 100644 index c6553cc3af..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js +++ /dev/null @@ -1,246 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - Tobias Hintze - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ - -/*global runtime, gui, odf, core, xmldom, document, window*/ -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); - -gui.PresenterUI = (function () { - "use strict"; - var s2css = new odf.Style2CSS(), - xpath = new xmldom.XPath(), - nsResolver = s2css.namespaceResolver; - - return function PresenterUI(odf_element) { - var self = this; - - self.setInitialSlideMode = function () { - self.startSlideMode('single'); - }; - - self.keyDownHandler = function (ev) { - if (ev.target.isContentEditable) { return; } - if (ev.target.nodeName === 'input') { return; } - switch (ev.keyCode) { - case 84: // t - hide/show toolbar - self.toggleToolbar(); - break; - case 37: // left - case 8: // left - self.prevSlide(); - break; - case 39: // right - case 32: // space - self.nextSlide(); - break; - case 36: // pos1 - self.firstSlide(); - break; - case 35: // end - self.lastSlide(); - break; - } - }; - - self.root = function () { return self.odf_canvas.odfContainer().rootElement; }; - - self.firstSlide = function () { self.slideChange(function (old, pc) { return 0; }); }; - self.lastSlide = function () { self.slideChange(function (old, pc) { return pc - 1; }); }; - - self.nextSlide = function () { - self.slideChange(function (old, pc) { return old + 1 < pc ? old + 1 : -1; }); - }; - self.prevSlide = function () { - self.slideChange(function (old, pc) { return old < 1 ? -1 : old - 1; }); - }; - // indexChanger gets (idx,pagecount) as parameter and returns the new index - self.slideChange = function (indexChanger) { - var pages = self.getPages(self.odf_canvas.odfContainer().rootElement), - last = -1, - i = 0, - newidx, - pagelist; - pages.forEach(function (tuple) { - var name = tuple[0], - node = tuple[1]; - if (node.hasAttribute('slide_current')) { - last = i; - node.removeAttribute('slide_current'); - } - i += 1; - }); - newidx = indexChanger(last, pages.length); - if (newidx === -1) { newidx = last; } - pages[newidx][1].setAttribute('slide_current', '1'); - pagelist = document.getElementById('pagelist'); - pagelist.selectedIndex = newidx; - // FIXME this needs to become a sane callback/listener mechanism - // (and the mode probably a class/instance..) - if (self.slide_mode === 'cont') { - window.scrollBy(0, pages[newidx][1].getBoundingClientRect().top - 30); - } - }; - - self.selectSlide = function (idx) { - self.slideChange(function (old, pc) { - if (idx >= pc) { return -1; } - if (idx < 0) { return -1; } - return idx; - }); - }; - - // make one specific slide visible in cont-mode - self.scrollIntoContView = function (idx) { - var pages = self.getPages(self.odf_canvas.odfContainer().rootElement); - if (pages.length === 0) { return; } - /* - if (false) { - // works in chrome - pages[idx][1].scrollIntoView(); - } else { - */ - // works in ff - window.scrollBy(0, pages[idx][1].getBoundingClientRect().top - 30); - /*}*/ - }; - - // return a list of tuples (pagename, pagenode) - self.getPages = function (root) { - var pagenodes = root.getElementsByTagNameNS(nsResolver('draw'), 'page'), - pages = [], - i; - for (i = 0; i < pagenodes.length; i += 1) { - pages.push([ - pagenodes[i].getAttribute('draw:name'), - pagenodes[i] - ]); - } - return pages; - }; - - // fill a html-select with options, one option per page in odf (odp) - self.fillPageList = function (odfdom_root, html_select) { - var pages = self.getPages(odfdom_root), - i, - html_option, - res, - page_denom; - - // empty the pagelist - while (html_select.firstChild) { - html_select.removeChild(html_select.firstChild); - } - - // populate it - for (i = 0; i < pages.length; i += 1) { - html_option = document.createElement('option'); - res = xpath.getODFElementsWithXPath(pages[i][1], - './draw:frame[@presentation:class="title"]//draw:text-box/text:p', - xmldom.XPath); - page_denom = (res.length > 0) ? res[0].textContent : pages[i][0]; - html_option.textContent = (i + 1) + ": " + page_denom; - html_select.appendChild(html_option); - } - }; - - self.startSlideMode = function (mode) { - var pagelist = document.getElementById('pagelist'), - css = self.odf_canvas.slidevisibilitycss().sheet; - self.slide_mode = mode; - while (css.cssRules.length > 0) { css.deleteRule(0); } - // start on slide 0 - self.selectSlide(0); - if (self.slide_mode === 'single') { - css.insertRule("draw|page { position:fixed; left:0px;top:30px; z-index:1; }", 0); - css.insertRule("draw|page[slide_current] { z-index:2;}", 1); - css.insertRule("draw|page { -webkit-transform: scale(1);}", 2); - self.fitToWindow(); - window.addEventListener('resize', self.fitToWindow, false); - - } else if (self.slide_mode === 'cont') { - window.removeEventListener('resize', self.fitToWindow, false); - } - - self.fillPageList(self.odf_canvas.odfContainer().rootElement, pagelist); - }; - - // toggle (show/hide) toolbar - self.toggleToolbar = function () { - var css, found, i; - css = self.odf_canvas.slidevisibilitycss().sheet; - found = -1; - for (i = 0; i < css.cssRules.length; i += 1) { - if (css.cssRules[i].cssText.substring(0, 8) === ".toolbar") { - found = i; - break; - } - } - if (found > -1) { - css.deleteRule(found); - } else { - css.insertRule(".toolbar { position:fixed; left:0px;top:-200px; z-index:0; }", 0); - } - }; - - // adapt css-transform to window-size - self.fitToWindow = function () { - function ruleByFactor(f) { - return "draw|page { \n" + - "-moz-transform: scale(" + f + "); \n" + - "-moz-transform-origin: 0% 0%; " + - "-webkit-transform-origin: 0% 0%; -webkit-transform: scale(" + f + "); " + - "-o-transform-origin: 0% 0%; -o-transform: scale(" + f + "); " + - "-ms-transform-origin: 0% 0%; -ms-transform: scale(" + f + "); " + - "}"; - } - var pages = self.getPages(self.root()), - factorVert = ((window.innerHeight - 40) / pages[0][1].clientHeight), - factorHoriz = ((window.innerWidth - 10) / pages[0][1].clientWidth), - factor = factorVert < factorHoriz ? factorVert : factorHoriz, - css = self.odf_canvas.slidevisibilitycss().sheet; - css.deleteRule(2); - css.insertRule(ruleByFactor(factor), 2); - }; - - self.load = function (url) { - self.odf_canvas.load(url); - }; - - self.odf_element = odf_element; - self.odf_canvas = new odf.OdfCanvas(self.odf_element); - self.odf_canvas.addListener("statereadychange", self.setInitialSlideMode); - self.slide_mode = 'undefined'; - document.addEventListener('keydown', self.keyDownHandler, false); - }; -}()); - diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js deleted file mode 100644 index 2356c2c8c0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, gui: true*/ -runtime.loadClass("core.Cursor"); -/** - * This class modifies the selection in different ways. - * @constructor - * @param {Selection} selection - * @param {!core.PointWalker} pointWalker - * @return {!gui.SelectionMover} - */ -gui.SelectionMover = function SelectionMover(selection, pointWalker) { - "use strict"; - var doc = pointWalker.node().ownerDocument, - cursor = new core.Cursor(selection, doc); - /** - * Return the last range in the selection. Create one if the selection is - * empty. - */ - function getActiveRange(node) { - var range; - if (selection.rangeCount === 0) { - selection.addRange(node.ownerDocument.createRange()); - } - return selection.getRangeAt(selection.rangeCount - 1); - } - function setStart(node, offset) { - // selection interface is cumbersome and in Chrome it is buggy - // as a workaround all ranges are removed. The last one is updated and - // all ranges are placed back - var ranges = [], i, range; - for (i = 0; i < selection.rangeCount; i += 1) { - ranges[i] = selection.getRangeAt(i); - } - selection.removeAllRanges(); - if (ranges.length === 0) { - ranges[0] = node.ownerDocument.createRange(); - } - ranges[ranges.length - 1].setStart(pointWalker.node(), - pointWalker.position()); - for (i = 0; i < ranges.length; i += 1) { - selection.addRange(ranges[i]); - } - } - function doMove(extend, move) { - if (selection.rangeCount === 0) { - return; - } - var range = selection.getRangeAt(0), - /**@type{Element}*/ element; - if (!range.startContainer || range.startContainer.nodeType !== 1) { - return; - } - element = /**@type{!Element}*/(range.startContainer); - pointWalker.setPoint(element, range.startOffset); - move(); - setStart(pointWalker.node(), pointWalker.position()); - } - function doMoveForward(extend, move) { - if (selection.rangeCount === 0) { - return; - } - move(); - var range = selection.getRangeAt(0), - /**@type{Element}*/ element; - if (!range.startContainer || range.startContainer.nodeType !== 1) { - return; - } - element = /**@type{!Element}*/(range.startContainer); - pointWalker.setPoint(element, range.startOffset); - } -/* - function fallbackMoveLineUp() { - // put an element at the current position and call - // pointWalker.stepForward until the y position increases and x position - // is comparable to the previous one - cursor.updateToSelection(); - // retrieve cursor x and y position, then move selection/cursor left - // until, y offset is less and x offset about equal - var rect = cursor.getNode().getBoundingClientRect(), - x = rect.left, - y = rect.top, - arrived = false, - allowedSteps = 200; - while (!arrived && allowedSteps) { - allowedSteps -= 1; - cursor.remove(); - pointWalker.setPoint(selection.focusNode, selection.focusOffset); - pointWalker.stepForward(); - moveCursor(walker.node(), walker.position()); - moveCursorLeft(); - rect = cursor.getNode().getBoundingClientRect(); - arrived = rect.top !== y && rect.left < x; - } - } -*/ - function moveCursor(node, offset, selectMode) { - if (selectMode) { - selection.extend(node, offset); - } else { - selection.collapse(node, offset); - } - cursor.updateToSelection(); - } - function moveCursorLeft() { - var /**@type{Element}*/ element; - if (!selection.focusNode || selection.focusNode.nodeType !== 1) { - return; - } - element = /**@type{!Element}*/(selection.focusNode); - pointWalker.setPoint(element, selection.focusOffset); - pointWalker.stepBackward(); - moveCursor(pointWalker.node(), pointWalker.position(), false); - } - function moveCursorRight() { - cursor.remove(); - var /**@type{Element}*/ element; - if (!selection.focusNode || selection.focusNode.nodeType !== 1) { - return; - } - element = /**@type{!Element}*/(selection.focusNode); - pointWalker.setPoint(element, selection.focusOffset); - pointWalker.stepForward(); - moveCursor(pointWalker.node(), pointWalker.position(), false); - } - function moveCursorUp() { - // retrieve cursor x and y position, then move selection/cursor left - // until, y offset is less and x offset about equal - var rect = cursor.getNode().getBoundingClientRect(), - x = rect.left, - y = rect.top, - arrived = false, - left = 200; - while (!arrived && left) { - left -= 1; - moveCursorLeft(); - rect = cursor.getNode().getBoundingClientRect(); - arrived = rect.top !== y && rect.left < x; - } - } - function moveCursorDown() { - // retrieve cursor x and y position, then move selection/cursor right - // until, x offset is less - cursor.updateToSelection(); - var rect = cursor.getNode().getBoundingClientRect(), - x = rect.left, - y = rect.top, - arrived = false, - left = 200; - while (!arrived) { - left -= 1; - moveCursorRight(); - rect = cursor.getNode().getBoundingClientRect(); - arrived = rect.top !== y && rect.left > x; - } -//alert(left + " " + y + " " + x + " " + rect.top + " " + rect.left); - } - /** - * Move selection forward one point. - * @param {boolean} extend true if range is to be expanded from the current - * point - * @return {undefined} - **/ - this.movePointForward = function (extend) { - doMove(extend, pointWalker.stepForward); - }; - this.movePointBackward = function (extend) { - doMove(extend, pointWalker.stepBackward); - }; - this.moveLineForward = function (extend) { - if (selection.modify) { - // TODO add a way to - selection.modify(extend ? "extend" : "move", "forward", "line"); - } else { - doMove(extend, moveCursorDown); - } - }; - this.moveLineBackward = function (extend) { - if (selection.modify) { - selection.modify(extend ? "extend" : "move", "backward", "line"); - } else { - doMove(extend, function () { - }); - } - }; - return this; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js deleted file mode 100644 index aee0bd5e7d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, gui: true*/ -runtime.loadClass("core.PointWalker"); -runtime.loadClass("core.Cursor"); -//runtime.loadClass("gui.Caret"); -/** - * @constructor - */ -gui.XMLEdit = function XMLEdit(element, stylesheet) { - "use strict"; - var simplecss, - cssprefix, - documentElement, - customNS = "customns", - walker = null; - - if (!element.id) { - element.id = "xml" + String(Math.random()).substring(2); - } -// element.contentEditable = true; - cssprefix = "#" + element.id + " "; - - function installHandlers() { - } - - // generic css for doing xml formatting: color tags and do indentation - simplecss = cssprefix + "*," + cssprefix + ":visited, " + cssprefix + ":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n" + - cssprefix + ":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n" + - cssprefix + ":after {color: blue; content: '';}\n" + - cssprefix + "{overflow: auto;}\n"; - - function listenEvent(eventTarget, eventType, eventHandler) { - if (eventTarget.addEventListener) { - eventTarget.addEventListener(eventType, eventHandler, false); - } else if (eventTarget.attachEvent) { - eventType = "on" + eventType; - eventTarget.attachEvent(eventType, eventHandler); - } else { - eventTarget["on" + eventType] = eventHandler; - } - } - function cancelEvent(event) { - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - } - - function isCaretMoveCommand(charCode) { - if (charCode >= 16 && charCode <= 20) { - return true; - } - if (charCode >= 33 && charCode <= 40) { //arrows,home,end,pgup,pgdown - return true; - } - return false; - } - - function syncSelectionWithWalker() { - var sel = element.ownerDocument.defaultView.getSelection(), - r; - if (!sel || sel.rangeCount <= 0 || !walker) { - return; - } - r = sel.getRangeAt(0); - walker.setPoint(r.startContainer, r.startOffset); - } - - function syncWalkerWithSelection() { - var sel = element.ownerDocument.defaultView.getSelection(), - n, r; - sel.removeAllRanges(); - if (!walker || !walker.node()) { - return; - } - n = walker.node(); - r = n.ownerDocument.createRange(); - r.setStart(n, walker.position()); - r.collapse(true); - sel.addRange(r); - } - - function handleKeyDown(event) { - var charCode = event.charCode || event.keyCode; - // cursor movement - walker = null; - if (walker && charCode === 39) { // right arrow - syncSelectionWithWalker(); - walker.stepForward(); - syncWalkerWithSelection(); - } else if (walker && charCode === 37) { //left arrow - syncSelectionWithWalker(); - walker.stepBackward(); - syncWalkerWithSelection(); - } else if (isCaretMoveCommand(charCode)) { - return; - } - cancelEvent(event); - } - - function handleKeyPress(event) { -// handleKeyDown(event); - } - - function handleClick(event) { -// alert(event.target.nodeName); - var sel = element.ownerDocument.defaultView.getSelection(), - r = sel.getRangeAt(0), - n = r.startContainer; - // if cursor is in customns node, move up to the top one - /* - if (n.parentNode.namespaceURI === customNS) { - while (n.parentNode.namespaceURI === customNS) { - n = n.parentNode; - } - r = n.ownerDocument.createRange(); - r.setStart(n.nextSibling, 0); - r.collapse(true); - sel.removeAllRanges(); - sel.addRange(r); - } -*/ -/* - r = element.ownerDocument.createRange(); - r.setStart(event.target.nodeName, 0); - r.collapse(true); - sel.removeAllRanges(); - sel.addRange(r); -*/ -//alert(sel.getRangeAt(0).startContainer.nodeName + " " + sel.getRangeAt(0).startOffset); - - cancelEvent(event); - } - - function initElement(element) { - listenEvent(element, "click", handleClick); - listenEvent(element, "keydown", handleKeyDown); - listenEvent(element, "keypress", handleKeyPress); - //listenEvent(element, "mouseup", handleMouseUp); - // ignore drop events, dragstart, drag, dragenter, dragover are ok for now - listenEvent(element, "drop", cancelEvent); - listenEvent(element, "dragend", cancelEvent); - // pasting is also disallowed for now - listenEvent(element, "beforepaste", cancelEvent); - listenEvent(element, "paste", cancelEvent); - } - - // remove all textnodes that contain only whitespace - function cleanWhitespace(node) { - var n = node.firstChild, p, - re = /^\s*$/; - while (n && n !== node) { - p = n; - n = n.nextSibling || n.parentNode; - if (p.nodeType === 3 && re.test(p.nodeValue)) { - p.parentNode.removeChild(p); - } - } - } - /** - * @param {!Node} node - * @return {undefined} - */ - function setCssHelperAttributes(node) { - var atts, attsv, a, i; - // write all attributes in a string that is shown via the css - atts = node.attributes; - attsv = ""; - for (i = atts.length - 1; i >= 0; i -= 1) { - a = atts.item(i); - attsv = attsv + " " + a.nodeName + "=\"" + a.nodeValue + "\""; - } - node.setAttribute("customns_name", node.nodeName); - node.setAttribute("customns_atts", attsv); - } - /** - * @param {!Node} node - * @return {undefined} - */ - function addExplicitAttributes(node) { - var n = node.firstChild; - // recurse over the dom - while (n && n !== node) { - if (n.nodeType === 1) { - addExplicitAttributes(n); - } - n = n.nextSibling || n.parentNode; - } - setCssHelperAttributes(node); - cleanWhitespace(node); - } - - function getNamespacePrefixes(node, prefixes) { - var n = node.firstChild, atts, att, i; - while (n && n !== node) { - if (n.nodeType === 1) { - getNamespacePrefixes(n, prefixes); - atts = n.attributes; - for (i = atts.length - 1; i >= 0; i -= 1) { - att = atts.item(i); - // record the prefix that the document uses for namespaces - if (att.namespaceURI === "http://www.w3.org/2000/xmlns/") { - if (!prefixes[att.nodeValue]) { - prefixes[att.nodeValue] = att.localName; - } - } - } - } - n = n.nextSibling || n.parentNode; - } - } - - /** - * Give each namespace a unique prefix. - * @param {Object.} prefixes Map with namespace as key and - * prefix as value - * @return {undefined} - */ - function generateUniquePrefixes(prefixes) { - var taken = {}, - ns, p, n = 0; - for (ns in prefixes) { - if (prefixes.hasOwnProperty(ns) && ns) { - p = prefixes[ns]; - if (!p || taken.hasOwnProperty(p) || p === "xmlns") { - do { - p = "ns" + n; - n += 1; - } while (taken.hasOwnProperty(p)); - prefixes[ns] = p; - } - taken[p] = true; - } - } - } - - // the CSS neededed for the XML edit view depends on the prefixes - function createCssFromXmlInstance(node) { - // collect all prefixes and elements - var prefixes = {}, // namespace prefixes as they occur in the XML - css = "@namespace customns url(customns);\n", - name, pre, ns, names, csssel; - getNamespacePrefixes(node, prefixes); - generateUniquePrefixes(prefixes); -/* - for (ns in prefixes) { - if (ns) { - css = css + "@namepace " + prefixes[ns] + " url(" + ns + ");\n"; - } - } - for (ns in prefixes) { - if (ns) { - pre = cssprefix + prefixes[ns] + "|"; - css = css + pre + ":before { content: '<" + prefixes[ns] + - ":' attr(customns_name); }\n" + - pre + ":after { content: ''; }\n"; - } - } -*/ - return css; - } - - // Adapt the CSS to the current settings. - function updateCSS() { - var css = element.ownerDocument.createElement("style"), - text = createCssFromXmlInstance(element); - css.type = "text/css"; - text = text + simplecss; - css.appendChild(element.ownerDocument.createTextNode(text)); - stylesheet = stylesheet.parentNode.replaceChild(css, stylesheet); - } - function getXML() { - return documentElement; - } - function setXML(xml) { - var node = xml.documentElement || xml; - node = element.ownerDocument.importNode(node, true); - documentElement = node; - - addExplicitAttributes(node); - - while (element.lastChild) { - element.removeChild(element.lastChild); - } - element.appendChild(node); - - updateCSS(); - - walker = new core.PointWalker(node); - } - - initElement(element); - - this.updateCSS = updateCSS; - this.setXML = setXML; - this.getXML = getXML; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js b/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js deleted file mode 100644 index 1a185b85b9..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js +++ /dev/null @@ -1,34 +0,0 @@ -(function () { - "use strict"; - return [ - "core/Async.js", - "core/Base64.js", - "core/ByteArray.js", - "core/ByteArrayWriter.js", - "core/Cursor.js", - "core/JSLint.js", - "core/PointWalker.js", - "core/RawDeflate.js", - "core/RawInflate.js", - "core/UnitTester.js", - "core/Zip.js", - "gui/Caret.js", - "gui/SelectionMover.js", - "gui/XMLEdit.js", - "gui/PresenterUI.js", - "odf/FontLoader.js", - "odf/Formatting.js", - "odf/OdfCanvas.js", - "odf/OdfContainer.js", - "odf/Style2CSS.js", - "odf/StyleInfo.js", - "xmldom/LSSerializer.js", - "xmldom/LSSerializerFilter.js", - "xmldom/OperationalTransformDOM.js", - "xmldom/OperationalTransformInterface.js", - "xmldom/RelaxNG.js", - "xmldom/RelaxNG2.js", - "xmldom/RelaxNGParser.js", - "xmldom/XPath.js" - ]; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js deleted file mode 100644 index f6d51f666a..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*jslint sub: true*/ -/*global runtime, odf, core, document, xmldom*/ -runtime.loadClass("core.Base64"); -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); -/** - * This class loads embedded fonts into the CSS - * @constructor - **/ -odf.FontLoader = (function () { - "use strict"; - var style2CSS = new odf.Style2CSS(), - xpath = new xmldom.XPath(), - base64 = new core.Base64(); - /** - * @param {!Element} fontFaceDecls - * @return {!Object.} - */ - function getEmbeddedFontDeclarations(fontFaceDecls) { - var decls = {}, - fonts, - i, font, name, uris, href; - if (!fontFaceDecls) { - return decls; - } - fonts = xpath.getODFElementsWithXPath(fontFaceDecls, - "style:font-face[svg:font-face-src]", - style2CSS.namespaceResolver); - for (i = 0; i < fonts.length; i += 1) { - font = fonts[i]; - name = font.getAttributeNS(style2CSS.namespaces["style"], "name"); - uris = xpath.getODFElementsWithXPath(font, - "svg:font-face-src/svg:font-face-uri", - style2CSS.namespaceResolver); - if (uris.length > 0) { - href = uris[0].getAttributeNS(style2CSS.namespaces["xlink"], - "href"); - decls[name] = {href: href}; - } - } - return decls; - } - function addFontToCSS(name, font, fontdata, stylesheet) { - // hack: get the first stylesheet - stylesheet = document.styleSheets[0]; - var rule = "@font-face { font-family: \"" + name + "\"; src: " + - "url(data:application/x-font-ttf;charset=binary;base64," + - base64.convertUTF8ArrayToBase64(fontdata) + - ") format(\"truetype\"); }"; - try { - stylesheet.insertRule(rule, stylesheet.cssRules.length); - } catch (e) { - runtime.log("Problem inserting rule in CSS: " + rule); - } - } - function loadFontIntoCSS(embeddedFontDeclarations, zip, pos, stylesheet, - callback) { - var name, i = 0, n; - for (n in embeddedFontDeclarations) { - if (embeddedFontDeclarations.hasOwnProperty(n)) { - if (i === pos) { - name = n; - } - i += 1; - } - } - if (!name) { - return callback(); - } - zip.load(embeddedFontDeclarations[name].href, function (err, fontdata) { - if (err) { - runtime.log(err); - } else { - addFontToCSS(name, embeddedFontDeclarations[name], fontdata, - stylesheet); - } - return loadFontIntoCSS(embeddedFontDeclarations, zip, pos + 1, - stylesheet, callback); - }); - } - function loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) { - loadFontIntoCSS(embeddedFontDeclarations, zip, 0, stylesheet, - function () {}); - } - /** - * @constructor - */ - odf.FontLoader = function FontLoader() { - var self = this; - /** - * @param {!Element} fontFaceDecls - * @param {!core.Zip} zip - * @param {!StyleSheet} stylesheet - * @return {undefined} - */ - this.loadFonts = function (fontFaceDecls, zip, stylesheet) { - var embeddedFontDeclarations = getEmbeddedFontDeclarations( - fontFaceDecls); - loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet); - }; - }; - return odf.FontLoader; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js deleted file mode 100644 index cf42fcc50a..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global odf: true, runtime: true*/ -/** - * @constructor - */ -odf.Formatting = function Formatting() { - "use strict"; - var /**@type{odf.OdfContainer}*/ odfContainer, - /**@type{odf.StyleInfo}*/ styleInfo = new odf.StyleInfo(); - - /** - * Class that iterates over all elements that are part of the range. - * @constructor - * @param {!Range} range - * @return {undefined} - */ - function RangeElementIterator(range) { - /** - * @param {Node} parent - * @param {!number} n - * @return {Node} - */ - function getNthChild(parent, n) { - var c = parent && parent.firstChild; - while (c && n) { - c = c.nextSibling; - n -= 1; - } - return c; - } - var start = getNthChild(range.startContainer, range.startOffset), - end = getNthChild(range.endContainer, range.endOffset), - current = start; - /** - * @return {Element|null} - */ - this.next = function () { - var c = current; - if (c === null) { - return c; - } - return null; - }; - } - - /** - * @param {!Element} element - * @return {Element} - */ - function getParentStyle(element) { - var n = element.firstChild, e; - if (n.nodeType === 1) { // Element - e = /**@type{Element}*/(n); - return e; - } - return null; - } - /** - * @param {!Range} range - * @return {!Array.} - */ - function getParagraphStyles(range) { - var iter = new RangeElementIterator(range), e, styles = []; - e = iter.next(); - while (e) { - if (styleInfo.canElementHaveStyle("paragraph", e)) { - styles.push(e); - } - } - return styles; - } - - /** - * @param {!odf.OdfContainer} odfcontainer - * @return {undefined} - */ - this.setOdfContainer = function (odfcontainer) { - odfContainer = odfcontainer; - }; - /** - * Return true if all parts of the selection are bold. - * @param {!Array.} selection - * @return {!boolean} - */ - this.isCompletelyBold = function (selection) { - return false; - }; - /** - * Get the alignment or undefined if no uniform alignment is found - * @param {!Array.} selection - * @return {!string|undefined} - */ - this.getAlignment = function (selection) { - var styles = this.getParagraphStyles(selection), i, l = styles.length; - return undefined; - }; - /** - * Get the list of paragraph styles that covered by the current selection. - * @param {!Array.} selection - * @return {!Array.} - */ - this.getParagraphStyles = function (selection) { - var i, j, s, styles = []; - for (i = 0; i < selection.length; i += 0) { - s = getParagraphStyles(selection[i]); - for (j = 0; j < s.length; j += 1) { - if (styles.indexOf(s[j]) === -1) { - styles.push(s[j]); - } - } - } - return styles; - }; - /** - * Get the list of text styles that are covered by the current selection. - * @param {!Array.} selection - * @return {!Array.} - */ - this.getTextStyles = function (selection) { - return []; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js deleted file mode 100644 index b8077f8093..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js +++ /dev/null @@ -1,912 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*jslint sub: true*/ -/*global runtime, odf, xmldom */ -runtime.loadClass("odf.OdfContainer"); -runtime.loadClass("odf.Formatting"); -runtime.loadClass("xmldom.XPath"); -/** - * This class manages a loaded ODF document that is shown in an element. - * It takes care of giving visual feedback on loading, ensures that the - * stylesheets are loaded. - * @constructor - * @param {!Element} element Put and ODF Canvas inside this element. - **/ -odf.OdfCanvas = (function () { - "use strict"; - /** - * A loading queue where various tasks related to loading can be placed - * and will be run with 10 ms between them. This gives the ui a change to - * to update. - * @constructor - */ - function LoadingQueue() { - var queue = [], - taskRunning = false; - /** - * @param {Function} task - * @return {undefined} - */ - function run(task) { - taskRunning = true; - runtime.setTimeout(function () { - try { - task(); - } catch (e) { - runtime.log(e); - } - taskRunning = false; - if (queue.length > 0) { - run(queue.pop()); - } - }, 10); - } - /** - * @return {undefined} - */ - this.clearQueue = function () { - queue.length = 0; - }; - /** - * @param {Function} loadingTask - * @return {undefined} - */ - this.addToQueue = function (loadingTask) { - if (queue.length === 0 && !taskRunning) { - return run(loadingTask); - } - queue.push(loadingTask); - }; - } - /** - * @constructor - * @param css - */ - function PageSwitcher(css) { - var sheet = css.sheet, - position = 1; - function updateCSS() { - while (sheet.cssRules.length > 0) { - sheet.deleteRule(0); - } - sheet.insertRule('office|presentation draw|page {display:none;}', 0); - sheet.insertRule("office|presentation draw|page:nth-child(" + - position + ") {display:block;}", 1); - } - /** - * @return {undefined} - */ - this.showNextPage = function () { - position += 1; - updateCSS(); - }; - /** - * @return {undefined} - */ - this.showPreviousPage = function () { - if (position > 1) { - position -= 1; - updateCSS(); - } - }; - this.css = css; - } - /** - * Register event listener on DOM element. - * @param {!Element} eventTarget - * @param {!string} eventType - * @param {!Function} eventHandler - * @return {undefined} - */ - function listenEvent(eventTarget, eventType, eventHandler) { - if (eventTarget.addEventListener) { - eventTarget.addEventListener(eventType, eventHandler, false); - } else if (eventTarget.attachEvent) { - eventType = "on" + eventType; - eventTarget.attachEvent(eventType, eventHandler); - } else { - eventTarget["on" + eventType] = eventHandler; - } - } - /** - * Class that listens to events and sends a signal if the selection changes. - * @constructor - * @param {!Element} element - */ - function SelectionWatcher(element) { - var selection = [], count = 0, listeners = []; - /** - * @param {!Element} ancestor - * @param {Node} descendant - * @return {!boolean} - */ - function isAncestorOf(ancestor, descendant) { - while (descendant) { - if (descendant === ancestor) { - return true; - } - descendant = descendant.parentNode; - } - return false; - } - /** - * @param {!Element} element - * @param {!Range} range - * @return {!boolean} - */ - function fallsWithin(element, range) { - return isAncestorOf(element, range.startContainer) && - isAncestorOf(element, range.endContainer); - } - /** - * @return {!Array.} - */ - function getCurrentSelection() { - var s = [], selection = runtime.getWindow().getSelection(), i, r; - for (i = 0; i < selection.rangeCount; i += 1) { - r = selection.getRangeAt(i); - // check if the nodes in the range fall completely within the - // element - if (r !== null && fallsWithin(element, r)) { - s.push(r); - } - } - return s; - } - /** - * @param {Range} rangeA - * @param {Range} rangeB - * @return {!boolean} - */ - function rangesNotEqual(rangeA, rangeB) { - if (rangeA === rangeB) { - return false; - } - if (rangeA === null || rangeB === null) { - return true; - } - return rangeA.startContainer !== rangeB.startContainer || - rangeA.startOffset !== rangeB.startOffset || - rangeA.endContainer !== rangeB.endContainer || - rangeA.endOffset !== rangeB.endOffset; - } - /** - * @return {undefined} - */ - function emitNewSelection() { - var i, l = listeners.length; - for (i = 0; i < l; i += 1) { - listeners[i](element, selection); - } - } - /** - * @param {!Array.} selection - * @return {!Array.} - */ - function copySelection(selection) { - var s = [selection.length], i, oldr, r, - doc = element.ownerDocument; - for (i = 0; i < selection.length; i += 1) { - oldr = selection[i]; - r = doc.createRange(); - r.setStart(oldr.startContainer, oldr.startOffset); - r.setEnd(oldr.endContainer, oldr.endOffset); - s[i] = r; - } - return s; - } - /** - * @return {undefined} - */ - function checkSelection() { - var s = getCurrentSelection(), i; - if (s.length === selection.length) { - for (i = 0; i < s.length; i += 1) { - if (rangesNotEqual(s[i], selection[i])) { - break; - } - } - if (i === s.length) { - return; // no change - } - } - selection = s; - selection = copySelection(s); - emitNewSelection(); - } - /** - * @param {!string} eventName - * @param {!function(!Element, !Array.)} handler - * @return {undefined} - */ - this.addListener = function (eventName, handler) { - var i, l = listeners.length; - for (i = 0; i < l; i += 1) { - if (listeners[i] === handler) { - return; - } - } - listeners.push(handler); - }; - listenEvent(element, "mouseup", checkSelection); - listenEvent(element, "keyup", checkSelection); - listenEvent(element, "keydown", checkSelection); - } - var style2CSS = new odf.Style2CSS(), - namespaces = style2CSS.namespaces, - drawns = namespaces.draw, - fons = namespaces.fo, - officens = namespaces.office, - svgns = namespaces.svg, - textns = namespaces.text, - xlinkns = namespaces.xlink, - window = runtime.getWindow(), - xpath = new xmldom.XPath(), - /**@const@type{!Object.>}*/ - eventHandlers = {}, - editparagraph, - loadingQueue = new LoadingQueue(); - - /** - * Register an event handler - * @param {!string} eventType - * @param {!Function} eventHandler - * @return {undefined} - */ - function addEventListener(eventType, eventHandler) { - var handlers = eventHandlers[eventType]; - if (handlers === undefined) { - handlers = eventHandlers[eventType] = []; - } - if (eventHandler && handlers.indexOf(eventHandler) === -1) { - handlers.push(eventHandler); - } - } - /** - * Fire an event - * @param {!string} eventType - * @param {Array.=} args - * @return {undefined} - */ - function fireEvent(eventType, args) { - if (!eventHandlers.hasOwnProperty(eventType)) { - return; - } - var handlers = eventHandlers[eventType], i; - for (i = 0; i < handlers.length; i += 1) { - handlers[i](args); - } - } - /** - * @param {!Element} element - * @return {undefined} - */ - function clear(element) { - while (element.firstChild) { - element.removeChild(element.firstChild); - } - } - /** - * A new styles.xml has been loaded. Update the live document with it. - * @param {!Element} odfelement - * @param {!HTMLStyleElement} stylesxmlcss - * @return {undefined} - **/ - function handleStyles(odfelement, stylesxmlcss) { - // update the css translation of the styles - var style2css = new odf.Style2CSS(); - style2css.style2css(stylesxmlcss.sheet, odfelement.styles, - odfelement.automaticStyles); - } - /** - * @param {!string} id - * @param {!Element} frame - * @param {!StyleSheet} stylesheet - * @return {undefined} - **/ - function setFramePosition(id, frame, stylesheet) { - frame.setAttribute('styleid', id); - var rule, - anchor = frame.getAttributeNS(textns, 'anchor-type'), - x = frame.getAttributeNS(svgns, 'x'), - y = frame.getAttributeNS(svgns, 'y'), - width = frame.getAttributeNS(svgns, 'width'), - height = frame.getAttributeNS(svgns, 'height'), - minheight = frame.getAttributeNS(fons, 'min-height'), - minwidth = frame.getAttributeNS(fons, 'min-width'); - if (anchor === "as-char") { - rule = 'display: inline-block;'; - } else if (anchor || x || y) { - rule = 'position: absolute;'; - } else if (width || height || minheight || minwidth) { - rule = 'display: block;'; - } - if (x) { - rule += 'left: ' + x + ';'; - } - if (y) { - rule += 'top: ' + y + ';'; - } - if (width) { - rule += 'width: ' + width + ';'; - } - if (height) { - rule += 'height: ' + height + ';'; - } - if (minheight) { - rule += 'min-height: ' + minheight + ';'; - } - if (minwidth) { - rule += 'min-width: ' + minwidth + ';'; - } - if (rule) { - rule = 'draw|' + frame.localName + '[styleid="' + id + '"] {' + - rule + '}'; - stylesheet.insertRule(rule, stylesheet.cssRules.length); - } - } - /** - * @param {!Element} image - * @return {string} - **/ - function getUrlFromBinaryDataElement(image) { - var node = image.firstChild; - while (node) { - if (node.namespaceURI === officens && - node.localName === "binary-data") { - // TODO: detect mime-type, assuming png for now - return "data:image/png;base64," + node.textContent; - } - node = node.nextSibling; - } - return ""; - } - /** - * @param {!string} id - * @param {!Object} container - * @param {!Element} image - * @param {!StyleSheet} stylesheet - * @return {undefined} - **/ - function setImage(id, container, image, stylesheet) { - image.setAttribute('styleid', id); - var url = image.getAttributeNS(xlinkns, 'href'), - part, - node; - function callback(url) { - var rule = "background-image: url(" + url + ");"; - rule = 'draw|image[styleid="' + id + '"] {' + rule + '}'; - stylesheet.insertRule(rule, stylesheet.cssRules.length); - } - // look for a office:binary-data - if (url) { - try { - if (container.getPartUrl) { - url = container.getPartUrl(url); - callback(url); - } else { - part = container.getPart(url); - part.onchange = function (part) { - callback(part.url); - }; - part.load(); - } - } catch (e) { - runtime.log('slight problem: ' + e); - } - } else { - url = getUrlFromBinaryDataElement(image); - callback(url); - } - } - function formatParagraphAnchors(odfbody) { - var runtimens = "urn:webodf", - n, - i, - nodes = xpath.getODFElementsWithXPath(odfbody, - ".//*[*[@text:anchor-type='paragraph']]", - style2CSS.namespaceResolver); - for (i = 0; i < nodes.length; i += 1) { - n = nodes[i]; - if (n.setAttributeNS) { - n.setAttributeNS(runtimens, "containsparagraphanchor", true); - } - } - } - /** - * @param {!Object} container - * @param {!Element} odfbody - * @param {!StyleSheet} stylesheet - * @return {undefined} - **/ - function modifyImages(container, odfbody, stylesheet) { - var node, - frames, - i, - images; - function namespaceResolver(prefix) { - return namespaces[prefix]; - } - // find all the frame elements - frames = []; - node = odfbody.firstChild; - while (node && node !== odfbody) { - if (node.namespaceURI === drawns) { - frames[frames.length] = node; - } - if (node.firstChild) { - node = node.firstChild; - } else { - while (node && node !== odfbody && !node.nextSibling) { - node = node.parentNode; - } - if (node && node.nextSibling) { - node = node.nextSibling; - } - } - } - // adjust all the frame positions - for (i = 0; i < frames.length; i += 1) { - node = frames[i]; - setFramePosition('frame' + String(i), node, stylesheet); - } - formatParagraphAnchors(odfbody); - } - /** - * Load all the images that are inside an odf element. - * @param {!Object} container - * @param {!Element} odffragment - * @param {!StyleSheet} stylesheet - * @return {undefined} - */ - function loadImages(container, odffragment, stylesheet) { - var i, - images, - node; - // do delayed loading for all the images - function loadImage(name, container, node, stylesheet) { - // load image with a small delay to give the html ui a chance to - // update - loadingQueue.addToQueue(function () { - setImage(name, container, node, stylesheet); - }); - } - images = odffragment.getElementsByTagNameNS(drawns, 'image'); - for (i = 0; i < images.length; i += 1) { - node = /**@type{!Element}*/(images.item(i)); - loadImage('image' + String(i), container, node, stylesheet); - } - } - /** - * @param {!string} id - * @param {!Object} container - * @param {!Element} plugin - * @param {!StyleSheet} stylesheet - * @return {undefined} - **/ - function setVideo(id, container, plugin, stylesheet) { - var video, source, url, videoType, doc = plugin.ownerDocument, part, node; - - url = plugin.getAttributeNS(xlinkns, 'href'); - - function callback(url, mimetype) { - // test for video mimetypes - if (mimetype.substr(0, 6) === 'video/') { - video = doc.createElementNS(doc.documentElement.namespaceURI, "video"); - video.setAttribute('controls', 'controls'); - - source = doc.createElement('source'); - source.setAttribute('src', url); - source.setAttribute('type', mimetype); - - video.appendChild(source); - plugin.parentNode.appendChild(video); - } else { - plugin.innerHtml = 'Unrecognised Plugin'; - } - } - // look for a office:binary-data - if (url) { - try { - if (container.getPartUrl) { - url = container.getPartUrl(url); - callback(url, 'video/mp4'); - } else { - part = container.getPart(url); - part.onchange = function (part) { - callback(part.url, part.mimetype); - }; - part.load(); - } - } catch (e) { - runtime.log('slight problem: ' + e); - } - } else { - // this will fail atm - following function assumes PNG data] - runtime.log('using MP4 data fallback'); - url = getUrlFromBinaryDataElement(plugin); - callback(url, 'video/mp4'); - } - } - /** - * Load all the video that are inside an odf element. - * @param {!Object} container - * @param {!Element} odffragment - * @param {!StyleSheet} stylesheet - * @return {undefined} - */ - function loadVideos(container, odffragment, stylesheet) { - var i, - plugins, - node; - // do delayed loading for all the videos - function loadVideo(name, container, node, stylesheet) { - // load video with a small delay to give the html ui a chance to - // update - loadingQueue.addToQueue(function () { - setVideo(name, container, node, stylesheet); - }); - } - // embedded video is stored in a draw:plugin element - plugins = odffragment.getElementsByTagNameNS(drawns, 'plugin'); - runtime.log('Loading Videos:'); - - for (i = 0; i < plugins.length; i += 1) { - runtime.log('...Found a video.'); - node = /**@type{!Element}*/(plugins.item(i)); - loadVideo('video' + String(i), container, node, stylesheet); - } - } - /** - * @param {Document} document Put and ODF Canvas inside this element. - */ - function addStyleSheet(document) { - var styles = document.getElementsByTagName("style"), - head = document.getElementsByTagName('head')[0], - text = '', - prefix, - a = "", - b; - // use cloneNode on an exisiting HTMLStyleElement, because in - // Chromium 12, document.createElement('style') does not give a - // HTMLStyleElement - if (styles && styles.length > 0) { - styles = styles[0].cloneNode(false); - } else { - styles = document.createElement('style'); - } - for (prefix in namespaces) { - if (namespaces.hasOwnProperty(prefix) && prefix) { - text += "@namespace " + prefix + " url(" + namespaces[prefix] + - ");\n"; - } - } - styles.appendChild(document.createTextNode(text)); - head.appendChild(styles); - return styles; - } - /** - * @constructor - * @param {!Element} element Put and ODF Canvas inside this element. - */ - odf.OdfCanvas = function OdfCanvas(element) { - var self = this, - document = element.ownerDocument, - /**@type{odf.OdfContainer}*/ odfcontainer, - /**@type{!odf.Formatting}*/ formatting = new odf.Formatting(), - selectionWatcher = new SelectionWatcher(element), - slidecssindex = 0, - pageSwitcher = new PageSwitcher(addStyleSheet(document)), - stylesxmlcss = addStyleSheet(document), - positioncss = addStyleSheet(document), - editable = false, - zoomLevel = 1; - - function fixContainerSize() { - var sizer = element.firstChild, - odfdoc = sizer.firstChild; - if (!odfdoc) { - return; - } - element.style.WebkitTransform = 'scale(' + zoomLevel + ')'; - element.style.WebkitTransformOrigin = 'left top'; - element.style.width = Math.round(zoomLevel * odfdoc.offsetWidth) - + "px"; - element.style.height = Math.round(zoomLevel * odfdoc.offsetHeight) - + "px"; - } - /** - * A new content.xml has been loaded. Update the live document with it. - * @param {!Object} container - * @param {!Element} odfnode - * @return {undefined} - **/ - function handleContent(container, odfnode) { - var css = positioncss.sheet, sizer; - modifyImages(container, odfnode.body, css); -/* - slidecssindex = css.insertRule( - 'office|presentation draw|page:nth-child(1n) {display:block;}', - css.cssRules.length - ); -*/ - // FIXME: this is a hack to have a defined background now - // should be removed as soon as we have sane background - // handling for pages - css.insertRule('draw|page { background-color:#fff; }', - css.cssRules.length); - - // only append the content at the end - clear(element); - sizer = document.createElement('div'); - sizer.style.display = "inline-block"; - sizer.style.background = "white"; - sizer.appendChild(odfnode); - element.appendChild(sizer); - loadImages(container, odfnode.body, css); - loadVideos(container, odfnode.body, css); - fixContainerSize(); - } - /** - * @param {!odf.OdfContainer} container - * @return {undefined} - **/ - function refreshOdf(container) { - if (odfcontainer !== container) { - return; - } - - // synchronize the object a window.odfcontainer with the view - function callback() { - clear(element); - element.style.display = "inline-block"; - var odfnode = container.rootElement; - element.ownerDocument.importNode(odfnode, true); - - formatting.setOdfContainer(container); - handleStyles(odfnode, stylesxmlcss); - // do content last, because otherwise the document is constantly - // updated whenever the css changes - handleContent(container, odfnode); - fireEvent("statereadychange"); - } - - if (odfcontainer.state === odf.OdfContainer.DONE) { - callback(); - } else { - odfcontainer.onchange = callback; - } - } - - this.odfContainer = function () { - return odfcontainer; - }; - this.slidevisibilitycss = function () { - return pageSwitcher.css; - }; - /** - * @param {!string} url - * @return {undefined} - */ - this["load"] = this.load = function (url) { - loadingQueue.clearQueue(); - element.innerHTML = 'loading ' + url; - // open the odf container - odfcontainer = new odf.OdfContainer(url, function (container) { - odfcontainer = container; - refreshOdf(container); - }); - odfcontainer.onstatereadychange = refreshOdf; - }; - - function stopEditing() { - if (!editparagraph) { - return; - } - var fragment = editparagraph.ownerDocument.createDocumentFragment(); - while (editparagraph.firstChild) { - fragment.insertBefore(editparagraph.firstChild, null); - } - editparagraph.parentNode.replaceChild(fragment, editparagraph); - } - - this.save = function (callback) { - stopEditing(); - odfcontainer.save(callback); - }; - - function cancelPropagation(event) { - if (event.stopPropagation) { - event.stopPropagation(); - } else { - event.cancelBubble = true; - } - } - - function cancelEvent(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - } - - this.setEditable = function (iseditable) { - editable = iseditable; - if (!editable) { - stopEditing(); - } - }; - - function processClick(evt) { - evt = evt || window.event; - // go up until we find a text:p, if we find it, wrap it in

    and - // make that editable - var e = evt.target, selection = window.getSelection(), - range = ((selection.rangeCount > 0) - ? selection.getRangeAt(0) : null), - startContainer = range && range.startContainer, - startOffset = range && range.startOffset, - endContainer = range && range.endContainer, - endOffset = range && range.endOffset; - - while (e && !((e.localName === "p" || e.localName === "h") && - e.namespaceURI === textns)) { - e = e.parentNode; - } - if (!editable) { - return; - } - // test code for enabling editing - if (!e || e.parentNode === editparagraph) { - return; - } - - if (!editparagraph) { - editparagraph = e.ownerDocument.createElement("p"); - if (!editparagraph.style) { - editparagraph = e.ownerDocument.createElementNS( - "http://www.w3.org/1999/xhtml", - "p" - ); - } - editparagraph.style.margin = "0px"; - editparagraph.style.padding = "0px"; - editparagraph.style.border = "0px"; - editparagraph.setAttribute("contenteditable", true); - } else if (editparagraph.parentNode) { - stopEditing(); - } - e.parentNode.replaceChild(editparagraph, e); - editparagraph.appendChild(e); - - // set the cursor or selection at the right position - editparagraph.focus(); // needed in FF to show cursor in the paragraph - if (range) { - selection.removeAllRanges(); - range = e.ownerDocument.createRange(); - range.setStart(startContainer, startOffset); - range.setEnd(endContainer, endOffset); - selection.addRange(range); - } - cancelEvent(evt); - } - - /** - * @param {!string} eventName - * @param {!function(*)} handler - * @return {undefined} - */ - this.addListener = function (eventName, handler) { - if (eventName === "selectionchange") { - selectionWatcher.addListener(eventName, handler); - } else { - addEventListener(eventName, handler); - } - }; - /** - * @return {!odf.Formatting} - */ - this.getFormatting = function () { - return formatting; - }; - /** - * @param {!number} zoom - * @return {undefined} - */ - this.setZoomLevel = function (zoom) { - zoomLevel = zoom; - fixContainerSize(); - }; - /** - * @return {!number} - */ - this.getZoomLevel = function () { - return zoomLevel; - }; - /** - * @param {!number} width - * @param {!number} height - * @return {undefined} - */ - this.fitToContainingElement = function (width, height) { - var realWidth = element.offsetWidth / zoomLevel, - realHeight = element.offsetHeight / zoomLevel; - zoomLevel = width / realWidth; - if (height / realHeight < zoomLevel) { - zoomLevel = height / realHeight; - } - fixContainerSize(); - }; - /** - * @param {!number} width - * @return {undefined} - */ - this.fitToWidth = function (width) { - var realWidth = element.offsetWidth / zoomLevel; - zoomLevel = width / realWidth; - fixContainerSize(); - }; - /** - * @param {!number} height - * @return {undefined} - */ - this.fitToHeight = function (height) { - var realHeight = element.offsetHeight / zoomLevel; - zoomLevel = height / realHeight; - fixContainerSize(); - }; - /** - * @return {undefined} - */ - this.showNextPage = function () { - pageSwitcher.showNextPage(); - }; - /** - * @return {undefined} - */ - this.showPreviousPage = function () { - pageSwitcher.showPreviousPage(); - }; - /** - * @return {undefined} - */ - this.showAllPages = function () { - }; - - listenEvent(element, "click", processClick); - }; - return odf.OdfCanvas; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js deleted file mode 100644 index 709addbecd..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js +++ /dev/null @@ -1,672 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, xmldom: true, odf: true, DOMParser: true, - document: true */ -runtime.loadClass("core.Base64"); -runtime.loadClass("core.Zip"); -runtime.loadClass("xmldom.LSSerializer"); -runtime.loadClass("odf.StyleInfo"); -runtime.loadClass("odf.Style2CSS"); -runtime.loadClass("odf.FontLoader"); -/** - * The OdfContainer class manages the various parts that constitues an ODF - * document. - * @constructor - * @param {!string} url - * @param {!Function|null} onstatereadychange - **/ -odf.OdfContainer = (function () { - "use strict"; - var styleInfo = new odf.StyleInfo(), - style2CSS = new odf.Style2CSS(), - namespaces = style2CSS.namespaces, - officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", - manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", - nodeorder = ['meta', 'settings', 'scripts', 'font-face-decls', 'styles', - 'automatic-styles', 'master-styles', 'body'], - base64 = new core.Base64(), - fontLoader = new odf.FontLoader(), - partMimetypes = {}; - /** - * @param {?Node} node - * @param {!string} ns - * @param {!string} name - * @return {?Node} - */ - function getDirectChild(node, ns, name) { - node = (node) ? node.firstChild : null; - while (node) { - if (node.localName === name && node.namespaceURI === ns) { - return node; - } - node = node.nextSibling; - } - return null; - } - /** - * Return the position the node should get according to the ODF flat format. - * @param {!Node} child - * @return {!number} - */ - function getNodePosition(child) { - var childpos = 0, i, l = nodeorder.length; - for (i = 0; i < l; i += 1) { - if (child.namespaceURI === officens && - child.localName === nodeorder[i]) { - return i; - } - } - return -1; - } - /** - * Class that filters runtime specific nodes from the DOM. - * @constructor - * @implements {xmldom.LSSerializerFilter} - * @param {!Element} odfroot - * @param {!Element=} usedStylesElement - */ - function OdfNodeFilter(odfroot, usedStylesElement) { - var automaticStyles = odfroot.automaticStyles, - usedKeysList; - if (usedStylesElement) { - usedKeysList = new styleInfo.UsedKeysList(usedStylesElement); - } - /** - * @param {!Node} node - * @return {!number} - */ - this.acceptNode = function (node) { - var styleName, styleFamily, result; - if (node.namespaceURI === "http://www.w3.org/1999/xhtml") { - result = 3; // FILTER_SKIP - } else if (usedKeysList && node.parentNode === automaticStyles && - node.nodeType === 1) { - if (usedKeysList.uses(node)) { - result = 1; // FILTER_ACCEPT - } else { - result = 2; // FILTER_REJECT - } - } else { - result = 1; // FILTER_ACCEPT - } - return result; - }; - } - /** - * Put the element at the right position in the parent. - * The right order is given by the value returned from getNodePosition. - * @param {!Node} node - * @param {?Node} child - * @return {undefined} - */ - function setChild(node, child) { - if (!child) { - return; - } - var childpos = getNodePosition(child), - pos, - c = node.firstChild; - if (childpos === -1) { - return; - } - while (c) { - pos = getNodePosition(c); - if (pos !== -1 && pos > childpos) { - break; - } - c = c.nextSibling; - } - node.insertBefore(child, c); - } - /** - * A DOM element that is part of and ODF part of a DOM. - * @constructor - * @extends {Element} - */ - function ODFElement() { - } - /** - * The root element of an ODF document. - * @constructor - * @extends {ODFElement} - */ - function ODFDocumentElement(odfcontainer) { - this.OdfContainer = odfcontainer; - } - ODFDocumentElement.prototype = new ODFElement(); - ODFDocumentElement.prototype.constructor = ODFDocumentElement; - ODFDocumentElement.namespaceURI = officens; - ODFDocumentElement.localName = 'document'; - // private constructor - /** - * @constructor - * @param {!string} name - * @param {!odf.OdfContainer} container - * @param {!core.Zip} zip - */ - function OdfPart(name, container, zip) { - var self = this, - privatedata; - - // declare public variables - this.size = 0; - this.type = null; - this.name = name; - this.container = container; - this.url = null; - this.mimetype = null; - this.document = null; - this.onreadystatechange = null; - this.onchange = null; - this.EMPTY = 0; - this.LOADING = 1; - this.DONE = 2; - this.state = this.EMPTY; - - // private functions - // public functions - this.load = function () { - var mimetype = partMimetypes[name]; - this.mimetype = mimetype; - zip.loadAsDataURL(name, mimetype, function (err, url) { - self.url = url; - if (self.onchange) { - self.onchange(self); - } - if (self.onstatereadychange) { - self.onstatereadychange(self); - } - }); - }; - this.abort = function () { - // TODO - }; - } - OdfPart.prototype.load = function () { - }; - OdfPart.prototype.getUrl = function () { - if (this.data) { - return 'data:;base64,' + base64.toBase64(this.data); - } - return null; - }; - /** - * @constructor - * @param {!odf.OdfContainer} odfcontainer - */ - function OdfPartList(odfcontainer) { - var self = this; - // declare public variables - this.length = 0; - this.item = function (index) { - }; - } - /** - * @constructor - * @param {!string} url - * @param {!Function|null} onstatereadychange - */ - odf.OdfContainer = function OdfContainer(url, onstatereadychange) { - var self = this, - zip = null, - contentXmlCompletelyLoaded = false; - - // NOTE each instance of OdfContainer has a copy of the private functions - // it would be better to have a class OdfContainerPrivate where the - // private functions can be defined via OdfContainerPrivate.prototype - // without exposing them - - // declare public variables - this.onstatereadychange = onstatereadychange; - this.onchange = null; - this.state = null; - this.rootElement = null; - this.parts = null; - - /** - * @param {!Element} element - * @return {undefined} - */ - function removeProcessingInstructions(element) { - var n = element.firstChild, next, e; - while (n) { - next = n.nextSibling; - if (n.nodeType === 1) { // ELEMENT - e = /**@type{!Element}*/(n); - removeProcessingInstructions(e); - } else if (n.nodeType === 7) { // PROCESSING_INSTRUCTION_NODE - element.removeChild(n); - } - n = next; - } - } - - // private functions - /** - * Import the document elementnode into the DOM of OdfContainer. - * Any processing instructions are removed, since importing them - * gives an exception. - * @param {!Document} xmldoc - * @return {!Node} - */ - function importRootNode(xmldoc) { - var doc = self.rootElement.ownerDocument, - node; - // remove all processing instructions - // TODO: replace cursor processing instruction with an element - if (xmldoc) { - removeProcessingInstructions(xmldoc.documentElement); - try { - node = doc.importNode(xmldoc.documentElement, true); - } catch (e) { - } - } - return node; - } - function setState(state) { - self.state = state; - if (self.onchange) { - self.onchange(self); - } - if (self.onstatereadychange) { - self.onstatereadychange(self); - } - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleFlatXml(xmldoc) { - var root = importRootNode(xmldoc); - if (!root || root.localName !== 'document' || - root.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return; - } - self.rootElement = root; - root.fontFaceDecls = getDirectChild(root, officens, 'font-face-decls'); - root.styles = getDirectChild(root, officens, 'styles'); - root.automaticStyles = getDirectChild(root, officens, - 'automatic-styles'); - root.masterStyles = getDirectChild(root, officens, 'master-styles'); - root.body = getDirectChild(root, officens, 'body'); - root.meta = getDirectChild(root, officens, 'meta'); - setState(OdfContainer.DONE); - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleStylesXml(xmldoc) { - var node = importRootNode(xmldoc), - root = self.rootElement; - if (!node || node.localName !== 'document-styles' || - node.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return; - } - root.fontFaceDecls = getDirectChild(node, officens, 'font-face-decls'); - setChild(root, root.fontFaceDecls); - root.styles = getDirectChild(node, officens, 'styles'); - setChild(root, root.styles); - root.automaticStyles = getDirectChild(node, officens, - 'automatic-styles'); - setChild(root, root.automaticStyles); - root.masterStyles = getDirectChild(node, officens, 'master-styles'); - setChild(root, root.masterStyles); - //removeUnusedAutomaticStyles(root.automaticStyles, - // root.masterStyles); - fontLoader.loadFonts(root.fontFaceDecls, zip, null); - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleContentXml(xmldoc) { - var node = importRootNode(xmldoc), - root, - automaticStyles, - fontFaceDecls, - c; - if (!node || node.localName !== 'document-content' || - node.namespaceURI !== officens) { - setState(OdfContainer.INVALID); - return; - } - root = self.rootElement; - fontFaceDecls = getDirectChild(node, officens, 'font-face-decls'); - if (root.fontFaceDecls && fontFaceDecls) { - c = fontFaceDecls.firstChild; - while (c) { - root.fontFaceDecls.appendChild(c); - c = fontFaceDecls.firstChild; - } - } else if (fontFaceDecls) { - root.fontFaceDecls = fontFaceDecls; - setChild(root, fontFaceDecls); - } - automaticStyles = getDirectChild(node, officens, 'automatic-styles'); - if (root.automaticStyles && automaticStyles) { - c = automaticStyles.firstChild; - while (c) { - root.automaticStyles.appendChild(c); - c = automaticStyles.firstChild; // works because node c moved - } - } else if (automaticStyles) { - root.automaticStyles = automaticStyles; - setChild(root, automaticStyles); - } - root.body = getDirectChild(node, officens, 'body'); - setChild(root, root.body); - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleMetaXml(xmldoc) { - var node = importRootNode(xmldoc), - root; - if (!node || node.localName !== 'document-meta' || - node.namespaceURI !== officens) { - return; - } - root = self.rootElement; - root.meta = getDirectChild(node, officens, 'meta'); - setChild(root, root.meta); - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleSettingsXml(xmldoc) { - var node = importRootNode(xmldoc), - root; - if (!node || node.localName !== 'document-settings' || - node.namespaceURI !== officens) { - return; - } - root = self.rootElement; - root.settings = getDirectChild(node, officens, 'settings'); - setChild(root, root.settings); - } - /** - * @param {!Document} xmldoc - * @return {undefined} - */ - function handleManifestXml(xmldoc) { - var node = importRootNode(xmldoc), - root, - n; - if (!node || node.localName !== 'manifest' || - node.namespaceURI !== manifestns) { - return; - } - root = self.rootElement; - root.manifest = node; - n = root.manifest.firstChild; - while (n) { - if (n.nodeType === 1 && n.localName === "file-entry" && - n.namespaceURI === manifestns) { - partMimetypes[n.getAttributeNS(manifestns, "full-path")] = - n.getAttributeNS(manifestns, "media-type"); - } - n = n.nextSibling; - } - } - /** - * @param {!function(?string,?Document)} callback - * @return {undefined} - */ - function getContentXmlNode(callback) { - var handler = { - rootElementReady: function (err, rootxml, done) { - contentXmlCompletelyLoaded = err || done; - if (err) { - return callback(err, null); - } - var parser = new DOMParser(); - rootxml = parser.parseFromString(rootxml, "text/xml"); - callback(null, rootxml); - }, - bodyChildElementsReady: function (err, nodes, done) { - // TODO - } - }; - zip.loadContentXmlAsFragments("content.xml", handler); - } - /** - * @param {!string} filepath - * @param {!function(?string,?Document)} callback - * @return {undefined} - */ - function getXmlNode(filepath, callback) { - zip.loadAsDOM(filepath, callback); - } - /** - * @return {undefined} - */ - function loadComponents() { - // always load content.xml, meta.xml, styles.xml and settings.xml - getXmlNode('styles.xml', function (err, xmldoc) { - handleStylesXml(xmldoc); - if (self.state === OdfContainer.INVALID) { - return; - } - getXmlNode('content.xml', function (err, xmldoc) { - handleContentXml(xmldoc); - if (self.state === OdfContainer.INVALID) { - return; - } - getXmlNode('meta.xml', function (err, xmldoc) { - handleMetaXml(xmldoc); - if (self.state === OdfContainer.INVALID) { - return; - } - getXmlNode('settings.xml', function (err, xmldoc) { - if (xmldoc) { - handleSettingsXml(xmldoc); - } - getXmlNode('META-INF/manifest.xml', function (err, - xmldoc) { - if (xmldoc) { - handleManifestXml(xmldoc); - } - if (self.state !== OdfContainer.INVALID) { - setState(OdfContainer.DONE); - } - }); - }); - }); - }); - }); - } - function documentElement(name, map) { - var s = "", i; - for (i in map) { - if (map.hasOwnProperty(i)) { - s += " xmlns:" + i + "=\"" + map[i] + "\""; - } - } - return ""; - } - /** - * @return {!string} - */ - function serializeMetaXml() { - var nsmap = style2CSS.namespaces, - serializer = new xmldom.LSSerializer(), - /**@type{!string}*/ s = documentElement("document-meta", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement); - s += serializer.writeToString(self.rootElement.meta, nsmap); - s += ""; - return s; - } - /** - * @return {!string} - */ - function serializeSettingsXml() { - var nsmap = style2CSS.namespaces, - serializer = new xmldom.LSSerializer(), - /**@type{!string}*/ s = documentElement("document-settings", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement); - s += serializer.writeToString(self.rootElement.settings, nsmap); - s += ""; - return s; - } - /** - * @return {!string} - */ - function serializeStylesXml() { - var nsmap = style2CSS.namespaces, - serializer = new xmldom.LSSerializer(), - /**@type{!string}*/ s = documentElement("document-styles", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement, - self.rootElement.masterStyles); - s += serializer.writeToString(self.rootElement.fontFaceDecls, nsmap); - s += serializer.writeToString(self.rootElement.styles, nsmap); - s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); - s += serializer.writeToString(self.rootElement.masterStyles, nsmap); - s += ""; - return s; - } - /** - * @return {!string} - */ - function serializeContentXml() { - var nsmap = style2CSS.namespaces, - serializer = new xmldom.LSSerializer(), - /**@type{!string}*/ s = documentElement("document-content", nsmap); - serializer.filter = new OdfNodeFilter(self.rootElement, - self.rootElement.body); - // Until there is code to determine if a font is referenced only - // from all font declaratios will be stored in styles.xml - s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); - s += serializer.writeToString(self.rootElement.body, nsmap); - s += ""; - return s; - } - function createElement(Type) { - var original = document.createElementNS( - Type.namespaceURI, - Type.localName - ), - method, - iface = new Type(); - for (method in iface) { - if (iface.hasOwnProperty(method)) { - original[method] = iface[method]; - } - } - return original; - } - function loadFromXML(url, callback) { - runtime.loadXML(url, function (err, dom) { - if (err) { - callback(err); - } else { - handleFlatXml(dom); - } - }); - } - // public functions - /** - * Open file and parse it. Return the XML Node. Return the root node of - * the file or null if this is not possible. - * For 'content.xml', 'styles.xml', 'meta.xml', and 'settings.xml', the - * elements 'document-content', 'document-styles', 'document-meta', or - * 'document-settings' will be returned respectively. - * @param {!string} partname - * @return {!OdfPart} - **/ - this.getPart = function (partname) { - return new OdfPart(partname, self, zip); - }; - /** - * @param {function(?string):undefined} callback - * @return {undefined} - */ - this.save = function (callback) { - // the assumption so far is that all ODF parts are serialized - // already, but meta, settings, styles and content should be - // refreshed - // update the zip entries with the data from the live ODF DOM - var data; - data = runtime.byteArrayFromString(serializeSettingsXml(), "utf8"); - zip.save("settings.xml", data, true, new Date()); - data = runtime.byteArrayFromString(serializeMetaXml(), "utf8"); - zip.save("meta.xml", data, true, new Date()); - data = runtime.byteArrayFromString(serializeStylesXml(), "utf8"); - zip.save("styles.xml", data, true, new Date()); - data = runtime.byteArrayFromString(serializeContentXml(), "utf8"); - zip.save("content.xml", data, true, new Date()); - zip.write(function (err) { - callback(err); - }); - }; - - // initialize public variables - this.state = OdfContainer.LOADING; - this.rootElement = createElement(ODFDocumentElement); - this.parts = new OdfPartList(this); - - // initialize private variables - zip = new core.Zip(url, function (err, zipobject) { - zip = zipobject; - if (err) { - loadFromXML(url, function (xmlerr) { - if (err) { - zip.error = err + "\n" + xmlerr; - setState(OdfContainer.INVALID); - } - }); - } else { - loadComponents(); - } - }); - }; - odf.OdfContainer.EMPTY = 0; - odf.OdfContainer.LOADING = 1; - odf.OdfContainer.DONE = 2; - odf.OdfContainer.INVALID = 3; - odf.OdfContainer.SAVING = 4; - odf.OdfContainer.MODIFIED = 5; - /** - * @param {!string} url - * @return {!odf.OdfContainer} - */ - odf.OdfContainer.getContainer = function (url) { - return new odf.OdfContainer(url, null); - }; - return odf.OdfContainer; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js deleted file mode 100644 index f33e3faef4..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js +++ /dev/null @@ -1,632 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global odf: true, runtime: true*/ -/** - * @constructor - */ -odf.Style2CSS = function Style2CSS() { - "use strict"; - // helper constants - var xlinkns = 'http://www.w3.org/1999/xlink', - drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", - fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", - officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", - presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", - stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", - svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", - tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", - textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", - namespaces = { - "draw": drawns, - "fo": fons, - "office": officens, - "presentation": presentationns, - "style": stylens, - "svg": svgns, - "table": tablens, - "text": textns, - "xlink": xlinkns - }, - - familynamespaceprefixes = { - 'graphic': 'draw', - 'paragraph': 'text', - 'presentation': 'presentation', - 'ruby': 'text', - 'section': 'text', - 'table': 'table', - 'table-cell': 'table', - 'table-column': 'table', - 'table-row': 'table', - 'text': 'text', - 'list': 'text' - }, - - familytagnames = { - 'graphic': ['circle', 'connected', 'control', 'custom-shape', - 'ellipse', 'frame', 'g', 'line', 'measure', 'page', - 'page-thumbnail', 'path', 'polygon', 'polyline', 'rect', - 'regular-polygon' ], - 'paragraph': ['alphabetical-index-entry-template', 'h', - 'illustration-index-entry-template', 'index-source-style', - 'object-index-entry-template', 'p', - 'table-index-entry-template', 'table-of-content-entry-template', - 'user-index-entry-template'], - 'presentation': ['caption', 'circle', 'connector', 'control', - 'custom-shape', 'ellipse', 'frame', 'g', 'line', 'measure', - 'page-thumbnail', 'path', 'polygon', 'polyline', 'rect', - 'regular-polygon'], - 'ruby': ['ruby', 'ruby-text'], - 'section': ['alphabetical-index', 'bibliography', - 'illustration-index', 'index-title', 'object-index', 'section', - 'table-of-content', 'table-index', 'user-index'], - 'table': ['background', 'table'], - 'table-cell': ['body', 'covered-table-cell', 'even-columns', - 'even-rows', 'first-column', 'first-row', 'last-column', - 'last-row', 'odd-columns', 'odd-rows', 'table-cell'], - 'table-column': ['table-column'], - 'table-row': ['table-row'], - 'text': ['a', 'index-entry-chapter', 'index-entry-link-end', - 'index-entry-link-start', 'index-entry-page-number', - 'index-entry-span', 'index-entry-tab-stop', 'index-entry-text', - 'index-title-template', 'linenumbering-configuration', - 'list-level-style-number', 'list-level-style-bullet', - 'outline-level-style', 'span'], - 'list': ['list-item'] - }, - - textPropertySimpleMapping = [ - [ fons, 'color', 'color' ], - // this sets the element background, not just the text background - [ fons, 'background-color', 'background-color' ], - [ fons, 'font-weight', 'font-weight' ], - [ fons, 'font-style', 'font-style' ], - [ fons, 'font-size', 'font-size' ] - ], - - bgImageSimpleMapping = [ - [ stylens, 'repeat', 'background-repeat' ] - ], - - paragraphPropertySimpleMapping = [ - [ fons, 'background-color', 'background-color' ], - [ fons, 'text-align', 'text-align' ], - [ fons, 'padding-left', 'padding-left' ], - [ fons, 'padding-right', 'padding-right' ], - [ fons, 'padding-top', 'padding-top' ], - [ fons, 'padding-bottom', 'padding-bottom' ], - [ fons, 'border-left', 'border-left' ], - [ fons, 'border-right', 'border-right' ], - [ fons, 'border-top', 'border-top' ], - [ fons, 'border-bottom', 'border-bottom' ], - [ fons, 'margin-left', 'margin-left' ], - [ fons, 'margin-right', 'margin-right' ], - [ fons, 'margin-top', 'margin-top' ], - [ fons, 'margin-bottom', 'margin-bottom' ], - [ fons, 'border', 'border' ] - ], - - graphicPropertySimpleMapping = [ - [ drawns, 'fill-color', 'background-color' ], - [ drawns, 'fill', 'background' ], - [ fons, 'min-height', 'min-height' ], - [ drawns, 'stroke', 'border' ], - [ svgns, 'stroke-color', 'border-color' ] - ], - - tablecellPropertySimpleMapping = [ - [ fons, 'background-color', 'background-color' ], - [ fons, 'border-left', 'border-left' ], - [ fons, 'border-right', 'border-right' ], - [ fons, 'border-top', 'border-top' ], - [ fons, 'border-bottom', 'border-bottom' ] - ]; - - // helper functions - /** - * @param {string} prefix - * @return {string} - */ - function namespaceResolver(prefix) { - return namespaces[prefix] || null; - } - /** - * @param {!Document} doc - * @param {!Element} stylesnode - * @return {!Object} - */ - function getStyleMap(doc, stylesnode) { - // put all style elements in a hash map by family and name - var stylemap = {}, node, name, family, map; - if (!stylesnode) { - return stylemap; - } - node = stylesnode.firstChild; - while (node) { - if (node.namespaceURI === stylens && node.localName === 'style') { - family = node.getAttributeNS(stylens, 'family'); - } else if (node.namespaceURI === textns && - node.localName === 'list-style') { - family = "list"; - } - name = family && node.getAttributeNS && - node.getAttributeNS(stylens, 'name'); - if (name) { - if (!stylemap[family]) { - stylemap[family] = {}; - } - stylemap[family][name] = node; - } - node = node.nextSibling; - } - return stylemap; - } - /** - * @param {?Object} stylestree - * @param {?string} name - * @return {?string} - */ - function findStyle(stylestree, name) { - if (!name || !stylestree) { - return null; - } - if (stylestree[name]) { - return stylestree[name]; - } - var derivedStyles = stylestree.derivedStyles, - n, style; - for (n in stylestree) { - if (stylestree.hasOwnProperty(n)) { - style = findStyle(stylestree[n].derivedStyles, name); - if (style) { - return style; - } - } - } - return null; - } - /** - * @param {!string} stylename - * @param {!Object} stylesmap - * @param {!Object} stylestree - * @return {undefined} - */ - function addStyleToStyleTree(stylename, stylesmap, stylestree) { - var style = stylesmap[stylename], parentname, parentstyle; - if (!style) { - return; - } - parentname = style.getAttributeNS(stylens, 'parent-style-name'); - parentstyle = null; - if (parentname) { - parentstyle = findStyle(stylestree, parentname); - if (!parentstyle && stylesmap[parentname]) { - // parent style has not been handled yet, do that now - addStyleToStyleTree(parentname, stylesmap, stylestree); - parentstyle = stylesmap[parentname]; - stylesmap[parentname] = null; - } - } - if (parentstyle) { - if (!parentstyle.derivedStyles) { - parentstyle.derivedStyles = {}; - } - parentstyle.derivedStyles[stylename] = style; - } else { - // no parent so add the root - stylestree[stylename] = style; - } - } - /** - * @param {!Object} stylesmap - * @param {!Object} stylestree - * @return {undefined} - */ - function addStyleMapToStyleTree(stylesmap, stylestree) { - var name; - for (name in stylesmap) { - if (stylesmap.hasOwnProperty(name)) { - addStyleToStyleTree(name, stylesmap, stylestree); - stylesmap[name] = null; - } - } - } - /** - * @param {!string} family - * @param {!string} name - * @return {?string} - */ - function createSelector(family, name) { - var prefix = familynamespaceprefixes[family], - namepart, - selector = "", - first = true; - if (prefix === null) { - return null; - } - namepart = '[' + prefix + '|style-name="' + name + '"]'; - if (prefix === 'presentation') { - prefix = 'draw'; - namepart = '[presentation|style-name="' + name + '"]'; - } - return prefix + '|' + familytagnames[family].join( - namepart + ',' + prefix + '|') + namepart; - } - /** - * @param {!string} family - * @param {!string} name - * @param {!Element} node - * @return {!Array} - */ - function getSelectors(family, name, node) { - var selectors = [], n, ss, s; - selectors.push(createSelector(family, name)); - for (n in node.derivedStyles) { - if (node.derivedStyles.hasOwnProperty(n)) { - ss = getSelectors(family, n, node.derivedStyles[n]); - for (s in ss) { - if (ss.hasOwnProperty(s)) { - selectors.push(ss[s]); - } - } - } - } - return selectors; - } - /** - * @param {?Element} node - * @param {!string} ns - * @param {!string} name - * @return {?Element} - */ - function getDirectChild(node, ns, name) { - if (!node) { - return null; - } - var c = node.firstChild, e; - while (c) { - if (c.namespaceURI === ns && c.localName === name) { - e = /**@type{Element}*/(c); - return e; - } - c = c.nextSibling; - } - return null; - } - /** - * @param {!Element} props - * @param {!Object} mapping - * @return {!string} - */ - function applySimpleMapping(props, mapping) { - var rule = '', r, value; - for (r in mapping) { - if (mapping.hasOwnProperty(r)) { - r = mapping[r]; - value = props.getAttributeNS(r[0], r[1]); - if (value) { - rule += r[2] + ':' + value + ';'; - } - } - } - return rule; - } - /** - * @param {!string} name - * @return {!string} - */ - function getFontDeclaration(name) { - return '"' + name + '"'; - } - /** - * @param {!Element} props - * @return {!string} - */ - function getTextProperties(props) { - var rule = '', value; - rule += applySimpleMapping(props, textPropertySimpleMapping); - value = props.getAttributeNS(stylens, 'text-underline-style'); - if (value === 'solid') { - rule += 'text-decoration: underline;'; - } - value = props.getAttributeNS(stylens, 'font-name'); - if (value) { - value = getFontDeclaration(value); - if (value) { - rule += 'font-family: ' + value + ';'; - } - } - return rule; - } - /** - * @param {!Element} props - * @return {!string} - */ - function getParagraphProperties(props) { - var rule = '', imageProps, url, element; - rule += applySimpleMapping(props, paragraphPropertySimpleMapping); - imageProps = props.getElementsByTagNameNS(stylens, 'background-image'); - if (imageProps.length > 0) { - url = imageProps.item(0).getAttributeNS(xlinkns, 'href'); - if (url) { - rule += "background-image: url('odfkit:" + url + "');"; - //rule += "background-repeat: repeat;"; //FIXME test - element = /**@type{!Element}*/(imageProps.item(0)); - rule += applySimpleMapping(element, bgImageSimpleMapping); - } - } - return rule; - } - /** - * @param {!Element} props - * @return {!string} - */ - function getGraphicProperties(props) { - var rule = ''; - rule += applySimpleMapping(props, graphicPropertySimpleMapping); - return rule; - } - /** - * @param {!Element} props - * @return {!string} - */ - function getTableCellProperties(props) { - var rule = ''; - rule += applySimpleMapping(props, tablecellPropertySimpleMapping); - return rule; - } - /** - * @param {!StyleSheet} sheet - * @param {!string} family - * @param {!string} name - * @param {!Element} node - * @return {undefined} - */ - function addStyleRule(sheet, family, name, node) { - var selectors = getSelectors(family, name, node), - selector = selectors.join(','), - rule = '', - properties = getDirectChild(node, stylens, 'text-properties'); - if (properties) { - rule += getTextProperties(properties); - } - properties = getDirectChild(node, stylens, 'paragraph-properties'); - if (properties) { - rule += getParagraphProperties(properties); - } - properties = getDirectChild(node, stylens, 'graphic-properties'); - if (properties) { - rule += getGraphicProperties(properties); - } - properties = getDirectChild(node, stylens, 'table-cell-properties'); - if (properties) { - rule += getTableCellProperties(properties); - } - if (rule.length === 0) { - return; - } - rule = selector + '{' + rule + '}'; - try { - sheet.insertRule(rule, sheet.cssRules.length); - } catch (e) { - throw e; - } - } - /** - * @param {!Element} node - * @return {!string} - */ - function getNumberRule(node) { - var style = node.getAttributeNS(stylens, "num-format"), - suffix = node.getAttributeNS(stylens, "num-suffix"), - prefix = node.getAttributeNS(stylens, "num-prefix"), - rule = "", - stylemap = {'1': 'decimal', 'a': 'lower-latin', 'A': 'upper-latin', - 'i': 'lower-roman', 'I': 'upper-roman'}, - content = ""; - content = prefix || ""; - if (stylemap.hasOwnProperty(style)) { - content += " counter(list, " + stylemap[style] + ")"; - } else if (style) { - content += "'" + style + "';"; - } else { - content += " ''"; - } - if (suffix) { - content += " '" + suffix + "'"; - } - rule = "content: " + content + ";"; - return rule; - } - /** - * @param {!Element} node - * @return {!string} - */ - function getImageRule(node) { - var rule = "content: none;"; - return rule; - } - /** - * @param {!Element} node - * @return {!string} - */ - function getBulletRule(node) { - var rule = "", - bulletChar = node.getAttributeNS(textns, "bullet-char"); - return "content: '" + bulletChar + "';"; - } - /** - * @param {!StyleSheet} sheet - * @param {!string} name - * @param {!Element} node - * @return {undefined} - */ - function addListStyleRule(sheet, name, node, itemrule) { - var selector = 'text|list[text|style-name="' + name + - '"]', - level = node.getAttributeNS(textns, "level"), - rule = ""; - level = level && parseInt(level, 10); - while (level > 1) { - selector += " > text|list-item > text|list"; - level -= 1; - } - selector += " > list-item:before"; - rule = itemrule; - rule = selector + '{' + rule + '}'; - try { - sheet.insertRule(rule, sheet.cssRules.length); - } catch (e) { - throw e; - } - } - /** - * @param {!StyleSheet} sheet - * @param {!string} name - * @param {!Element} node - * @return {undefined} - */ - function addListStyleRules(sheet, name, node) { - var n = node.firstChild, e, itemrule; - while (n) { - if (n.namespaceURI === textns) { - e = /**@type{!Element}*/(n); - if (n.localName === "list-level-style-number") { - itemrule = getNumberRule(e); - addListStyleRule(sheet, name, e, itemrule); - } else if (n.localName === "list-level-style-image") { - itemrule = getImageRule(e); - addListStyleRule(sheet, name, e, itemrule); - } else if (n.localName === "list-level-style-bullet") { - itemrule = getBulletRule(e); - addListStyleRule(sheet, name, e, itemrule); - } - } - n = n.nextSibling; - } - } - /** - * @param {!StyleSheet} sheet - * @param {!string} family - * @param {!string} name - * @param {!Element} node - * @return {undefined} - */ - function addRule(sheet, family, name, node) { - if (family === "list") { - addListStyleRules(sheet, name, node); - } else { - addStyleRule(sheet, family, name, node); - } - } - /** - * @param {!StyleSheet} sheet - * @param {!string} family - * @param {!string} name - * @param {!Element} node - * @return {undefined} - */ - function addRules(sheet, family, name, node) { - addRule(sheet, family, name, node); - var n; - for (n in node.derivedStyles) { - if (node.derivedStyles.hasOwnProperty(n)) { - addRules(sheet, family, n, node.derivedStyles[n]); - } - } - } - - // css vs odf styles - // ODF styles occur in families. A family is a group of odf elements to - // which an element applies. ODF families can be mapped to a group of css - // elements - - this.namespaces = namespaces; - this.namespaceResolver = namespaceResolver; - this.namespaceResolver.lookupNamespaceURI = this.namespaceResolver; - - /** - * @param {!StyleSheet} stylesheet - * @param {!Element} styles - * @param {!Element} autostyles - * @return {undefined} - */ - this.style2css = function (stylesheet, styles, autostyles) { - var doc, prefix, styletree, tree, name, rule, family, - stylenodes, styleautonodes; - // make stylesheet empty - while (stylesheet.cssRules.length) { - stylesheet.deleteRule(stylesheet.cssRules.length - 1); - } - doc = null; - if (styles) { - doc = styles.ownerDocument; - } - if (autostyles) { - doc = autostyles.ownerDocument; - } - if (!doc) { - return; - } - // add @namespace rules - for (prefix in namespaces) { - if (namespaces.hasOwnProperty(prefix)) { - rule = '@namespace ' + prefix + ' url(' + namespaces[prefix] + ');'; - try { - stylesheet.insertRule(rule, stylesheet.cssRules.length); - } catch (e) { - // WebKit can throw an exception here, but it will have - // retained the namespace declarations anyway. - } - } - } - - // add the various styles - stylenodes = getStyleMap(doc, styles); - styleautonodes = getStyleMap(doc, autostyles); - styletree = {}; - for (family in familynamespaceprefixes) { - if (familynamespaceprefixes.hasOwnProperty(family)) { - tree = styletree[family] = {}; - addStyleMapToStyleTree(stylenodes[family], tree); - addStyleMapToStyleTree(styleautonodes[family], tree); - - for (name in tree) { - if (tree.hasOwnProperty(name)) { - addRules(stylesheet, family, name, tree[name]); - } - } - } - } - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js deleted file mode 100644 index 9b76d13bed..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js +++ /dev/null @@ -1,424 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global odf*/ -/** - * @constructor - */ -odf.StyleInfo = function StyleInfo() { - "use strict"; - // helper constants - var chartns = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0", - dbns = "urn:oasis:names:tc:opendocument:xmlns:database:1.0", - dr3dns = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", - drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", - fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", - formns = "urn:oasis:names:tc:opendocument:xmlns:form:1.0", - numberns = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0", - officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", - presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", - stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", - svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", - tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", - textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", - elementstyles = { - "text": [ - { ens: stylens, en: 'tab-stop', ans: stylens, a: 'leader-text-style'}, - { ens: stylens, en: 'drop-cap', ans: stylens, a: 'style-name'}, - { ens: textns, en: 'notes-configuration', ans: textns, a: 'citation-body-style-name'}, - { ens: textns, en: 'notes-configuration', ans: textns, a: 'citation-style-name'}, - { ens: textns, en: 'a', ans: textns, a: 'style-name'}, - { ens: textns, en: 'alphabetical-index', ans: textns, a: 'style-name'}, - { ens: textns, en: 'linenumbering-configuration', ans: textns, a: 'style-name'}, - { ens: textns, en: 'list-level-style-number', ans: textns, a: 'style-name'}, - { ens: textns, en: 'ruby-text', ans: textns, a: 'style-name'}, - { ens: textns, en: 'span', ans: textns, a: 'style-name'}, - { ens: textns, en: 'a', ans: textns, a: 'visited-style-name'}, - { ens: stylens, en: 'text-properties', ans: stylens, a: 'text-line-through-text-style'}, - { ens: textns, en: 'alphabetical-index-source', ans: textns, a: 'main-entry-style-name'}, - { ens: textns, en: 'index-entry-bibliography', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-chapter', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-link-end', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-link-start', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-page-number', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-span', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-tab-stop', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-entry-text', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-title-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'list-level-style-bullet', ans: textns, a: 'style-name'}, - { ens: textns, en: 'outline-level-style', ans: textns, a: 'style-name'} - ], - "paragraph": [ - { ens: drawns, en: 'caption', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'circle', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'connector', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'control', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'custom-shape', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'ellipse', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'frame', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'line', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'measure', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'path', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'polygon', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'polyline', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'rect', ans: drawns, a: 'text-style-name'}, - { ens: drawns, en: 'regular-polygon', ans: drawns, a: 'text-style-name'}, - { ens: officens, en: 'annotation', ans: drawns, a: 'text-style-name'}, - { ens: formns, en: 'column', ans: formns, a: 'text-style-name'}, - { ens: stylens, en: 'style', ans: stylens, a: 'next-style-name'}, - { ens: tablens, en: 'body', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'even-columns', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'even-rows', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'first-column', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'first-row', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'last-column', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'last-row', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'odd-columns', ans: tablens, a: 'paragraph-style-name'}, - { ens: tablens, en: 'odd-rows', ans: tablens, a: 'paragraph-style-name'}, - { ens: textns, en: 'notes-configuration', ans: textns, a: 'default-style-name'}, - { ens: textns, en: 'alphabetical-index-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'bibliography-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'h', ans: textns, a: 'style-name'}, - { ens: textns, en: 'illustration-index-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-source-style', ans: textns, a: 'style-name'}, - { ens: textns, en: 'object-index-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'p', ans: textns, a: 'style-name'}, - { ens: textns, en: 'table-index-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'table-of-content-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'table-index-entry-template', ans: textns, a: 'style-name'}, - { ens: textns, en: 'user-index-entry-template', ans: textns, a: 'style-name'}, - { ens: stylens, en: 'page-layout-properties', ans: stylens, a: 'register-truth-ref-style-name'} - ], - "chart": [ - { ens: chartns, en: 'axis', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'chart', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'data-label', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'data-point', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'equation', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'error-indicator', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'floor', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'footer', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'grid', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'legend', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'mean-value', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'plot-area', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'regression-curve', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'series', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'stock-gain-marker', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'stock-loss-marker', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'stock-range-line', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'subtitle', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'title', ans: chartns, a: 'style-name'}, - { ens: chartns, en: 'wall', ans: chartns, a: 'style-name'} - ], - "section": [ - { ens: textns, en: 'alphabetical-index', ans: textns, a: 'style-name'}, - { ens: textns, en: 'bibliography', ans: textns, a: 'style-name'}, - { ens: textns, en: 'illustration-index', ans: textns, a: 'style-name'}, - { ens: textns, en: 'index-title', ans: textns, a: 'style-name'}, - { ens: textns, en: 'object-index', ans: textns, a: 'style-name'}, - { ens: textns, en: 'section', ans: textns, a: 'style-name'}, - { ens: textns, en: 'table-of-content', ans: textns, a: 'style-name'}, - { ens: textns, en: 'table-index', ans: textns, a: 'style-name'}, - { ens: textns, en: 'user-index', ans: textns, a: 'style-name'} - ], - "ruby": [ - { ens: textns, en: 'ruby', ans: textns, a: 'style-name'} - ], - "table": [ - { ens: dbns, en: 'query', ans: dbns, a: 'style-name'}, - { ens: dbns, en: 'table-representation', ans: dbns, a: 'style-name'}, - { ens: tablens, en: 'background', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'table', ans: tablens, a: 'style-name'} - ], - "table-column": [ - { ens: dbns, en: 'column', ans: dbns, a: 'style-name'}, - { ens: tablens, en: 'table-column', ans: tablens, a: 'style-name'} - ], - "table-row": [ - { ens: dbns, en: 'query', ans: dbns, a: 'default-row-style-name'}, - { ens: dbns, en: 'table-representation', ans: dbns, a: 'default-row-style-name'}, - { ens: tablens, en: 'table-row', ans: tablens, a: 'style-name'} - ], - "table-cell": [ - { ens: dbns, en: 'column', ans: dbns, a: 'default-cell-style-name'}, - { ens: tablens, en: 'table-column', ans: tablens, a: 'default-cell-style-name'}, - { ens: tablens, en: 'table-row', ans: tablens, a: 'default-cell-style-name'}, - { ens: tablens, en: 'body', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'covered-table-cell', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'even-columns', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'covered-table-cell', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'even-columns', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'even-rows', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'first-column', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'first-row', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'last-column', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'last-row', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'odd-columns', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'odd-rows', ans: tablens, a: 'style-name'}, - { ens: tablens, en: 'table-cell', ans: tablens, a: 'style-name'} - ], - "graphic": [ - { ens: dr3dns, en: 'cube', ans: drawns, a: 'style-name'}, - { ens: dr3dns, en: 'extrude', ans: drawns, a: 'style-name'}, - { ens: dr3dns, en: 'rotate', ans: drawns, a: 'style-name'}, - { ens: dr3dns, en: 'scene', ans: drawns, a: 'style-name'}, - { ens: dr3dns, en: 'sphere', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'caption', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'circle', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'connector', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'control', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'custom-shape', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'ellipse', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'frame', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'g', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'line', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'measure', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'page-thumbnail', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'path', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'polygon', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'polyline', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'rect', ans: drawns, a: 'style-name'}, - { ens: drawns, en: 'regular-polygon', ans: drawns, a: 'style-name'}, - { ens: officens, en: 'annotation', ans: drawns, a: 'style-name'} - ], - "presentation": [ - { ens: dr3dns, en: 'cube', ans: presentationns, a: 'style-name'}, - { ens: dr3dns, en: 'extrude', ans: presentationns, a: 'style-name'}, - { ens: dr3dns, en: 'rotate', ans: presentationns, a: 'style-name'}, - { ens: dr3dns, en: 'scene', ans: presentationns, a: 'style-name'}, - { ens: dr3dns, en: 'sphere', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'caption', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'circle', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'connector', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'control', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'custom-shape', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'ellipse', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'frame', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'g', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'line', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'measure', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'page-thumbnail', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'path', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'polygon', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'polyline', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'rect', ans: presentationns, a: 'style-name'}, - { ens: drawns, en: 'regular-polygon', ans: presentationns, a: 'style-name'}, - { ens: officens, en: 'annotation', ans: presentationns, a: 'style-name'} - ], - "drawing-page": [ - { ens: drawns, en: 'page', ans: drawns, a: 'style-name'}, - { ens: presentationns, en: 'notes', ans: drawns, a: 'style-name'}, - { ens: stylens, en: 'handout-master', ans: drawns, a: 'style-name'}, - { ens: stylens, en: 'master-page', ans: drawns, a: 'style-name'} - ], - "list-style": [ - { ens: textns, en: 'list', ans: textns, a: 'style-name'}, - { ens: textns, en: 'numbered-paragraph', ans: textns, a: 'style-name'}, - { ens: textns, en: 'list-item', ans: textns, a: 'style-override'}, - { ens: stylens, en: 'style', ans: stylens, a: 'list-style-name'}, - { ens: stylens, en: 'style', ans: stylens, a: 'data-style-name'}, - { ens: stylens, en: 'style', ans: stylens, a: 'percentage-data-style-name'}, - { ens: presentationns, en: 'date-time-decl', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'creation-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'creation-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'database-display', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'editing-duration', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'expression', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'meta-field', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'modification-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'modification-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'print-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'print-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'table-formula', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-defined', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-field-get', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-field-input', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-get', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-input', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-set', ans: stylens, a: 'data-style-name'} - ], - "data": [ - { ens: stylens, en: 'style', ans: stylens, a: 'data-style-name'}, - { ens: stylens, en: 'style', ans: stylens, a: 'percentage-data-style-name'}, - { ens: presentationns, en: 'date-time-decl', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'creation-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'creation-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'database-display', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'editing-duration', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'expression', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'meta-field', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'modification-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'modification-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'print-date', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'print-time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'table-formula', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'time', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-defined', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-field-get', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'user-field-input', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-get', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-input', ans: stylens, a: 'data-style-name'}, - { ens: textns, en: 'variable-set', ans: stylens, a: 'data-style-name'} - ], - "page-layout": [ - { ens: presentationns, en: 'notes', ans: stylens, a: 'page-layout-name'}, - { ens: stylens, en: 'handout-master', ans: stylens, a: 'page-layout-name'}, - { ens: stylens, en: 'master-page', ans: stylens, a: 'page-layout-name'} - ] - }, - elements; - - /** - * Return if a particular element can have a style for a particular family. - * @param {!string} family - * @param {!Element} element - * @return {!boolean} - */ - function canElementHaveStyle(family, element) { - var elname = elements[element.localName], - elns = elname && elname[element.namespaceURI], - length = elns ? elns.length : 0, - i; - return elns && elns.length > 0; - } - - /** - * @param {!string} family - * @param {!Element} element - * @return {{name:string,family:string}|null} - */ - function getStyleRef(family, element) { - var elname = elements[element.localName], - elns = elname && elname[element.namespaceURI], - length = elns ? elns.length : 0, - i, attr; - for (i = 0; i < length; i += 1) { - attr = element.getAttributeNS(elns[i].ns, elns[i].localname); -/* - if (attr) { // a style has been found! - return attr; - } -*/ - } - return null; - } - - /** - * @param {!Element} element - * @param {!Object.>} keys - * @return {undefined} - */ - function getUsedStylesForAutomatic(element, keys) { - var elname = elements[element.localName], - elns = elname && elname[element.namespaceURI], - length = elns ? elns.length : 0, - i, attr, group, map, e; - for (i = 0; i < length; i += 1) { - attr = element.getAttributeNS(elns[i].ns, elns[i].localname); - if (attr) { // a style has been found! - group = elns[i].keygroup; - map = keys[group]; - if (!map) { - map = keys[group] = {}; - } - map[attr] = 1; - } - } - i = element.firstChild; - while (i) { - if (i.nodeType === 1) { - e = /**@type{!Element}*/(i); - getUsedStylesForAutomatic(e, keys); - } - i = i.nextSibling; - } - } - - /** - * @param {!Object.>>} elementstyles - */ - function inverse(elementstyles) { - var keyname, i, list, item, l, elements = {}, map, array; - for (keyname in elementstyles) { - if (elementstyles.hasOwnProperty(keyname)) { - list = elementstyles[keyname]; - l = list.length; - for (i = 0; i < l; i += 1) { - item = list[i]; - map = elements[item.en] = elements[item.en] || {}; - array = map[item.ens] = map[item.ens] || []; - array.push( - {ns: item.ans, localname: item.a, keygroup: keyname}); - } - } - } - return elements; - } - - /** - * @constructor - * @param {!Element} element - */ - this.UsedKeysList = function (element) { - var usedKeys = {}; - - /** - * @param {!Element} element - * @return {!boolean} - */ - this.uses = function (element) { - var localName = element.localName, - name = element.getAttributeNS(drawns, "name") || - element.getAttributeNS(stylens, "name"), - keyName, map; - if (localName === "style") { - keyName = element.getAttributeNS(stylens, "family"); - } else if (element.namespaceURI === numberns) { - keyName = "data"; - } else { - keyName = localName; // list-style or page-layout - } - map = usedKeys[keyName]; - return map ? (map[name] > 0) : false; - }; - - getUsedStylesForAutomatic(element, usedKeys); - }; - - this.canElementHaveStyle = canElementHaveStyle; - - elements = inverse(elementstyles); -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/packages.js b/apps/files_odfviewer/src/webodf/webodf/lib/packages.js deleted file mode 100644 index 7277a833f9..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/packages.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @license - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/** - * @namespace The core package. - */ -var core = {}; -/** - * @namespace The gui package. - */ -var gui = {}; -/** - * @namespace The xmldom package. - */ -var xmldom = {}; -/** - * @namespace The ODF package. - */ -var odf = {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js b/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js deleted file mode 100644 index 99ded6f1d3..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js +++ /dev/null @@ -1,1117 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*jslint nomen: true, evil: true, bitwise: true */ -/*global window: true, XMLHttpRequest: true, require: true, console: true, - process: true, __dirname: true, setTimeout: true, Packages: true, print: true, - readFile: true, quit: true, Buffer: true, ArrayBuffer: true, Uint8Array: true, - navigator: true, VBArray: true */ -/** - * Three implementations of a runtime for browser, node.js and rhino. - */ - -/** - * Abstraction of the runtime environment. - * @class - * @interface - */ -function Runtime() {"use strict"; } -/** - * Abstraction of byte arrays. - * @constructor - * @extends {Array} - * @param {!number} size - */ -Runtime.ByteArray = function (size) {"use strict"; }; -/** - * @param {!number} start - * @param {!number} end - * @return {!Runtime.ByteArray} - */ -Runtime.ByteArray.prototype.slice = function (start, end) {"use strict"; }; -/** - * @param {!Array.} array - * @return {!Runtime.ByteArray} - */ -Runtime.prototype.byteArrayFromArray = function (array) {"use strict"; }; -/** - * @param {!string} string - * @param {!string} encoding - * @return {!Runtime.ByteArray} - */ -Runtime.prototype.byteArrayFromString = function (string, encoding) {"use strict"; }; -/** - * @param {!Runtime.ByteArray} bytearray - * @param {!string} encoding - * @return {!string} - */ -Runtime.prototype.byteArrayToString = function (bytearray, encoding) {"use strict"; }; -/** - * @param {!Runtime.ByteArray} bytearray1 - * @param {!Runtime.ByteArray} bytearray2 - * @return {!Runtime.ByteArray} - */ -Runtime.prototype.concatByteArrays = function (bytearray1, bytearray2) {"use strict"; }; -/** - * @param {!string} path - * @param {!number} offset - * @param {!number} length - * @param {!function(string,Runtime.ByteArray):undefined} callback - * @return {undefined} - */ -Runtime.prototype.read = function (path, offset, length, callback) {"use strict"; }; -/** - * Read the contents of a file. Returns the result via a callback. If the - * encoding is 'binary', the result is returned as a Runtime.ByteArray, - * otherwise, it is returned as a string. - * @param {!string} path - * @param {!string} encoding text encoding or 'binary' - * @param {!function(string,(string|Runtime.ByteArray)):undefined} callback - * @return {undefined} - */ -Runtime.prototype.readFile = function (path, encoding, callback) {"use strict"; }; -/** - * @param {!string} path - * @param {!string} encoding text encoding or 'binary' - * @return {!string} - */ -Runtime.prototype.readFileSync = function (path, encoding) {"use strict"; }; -/** - * @param {!string} path - * @param {!function((string|Document)):undefined} callback - * @return {undefined} - */ -Runtime.prototype.loadXML = function (path, callback) {"use strict"; }; -/** - * @param {!string} path - * @param {!Runtime.ByteArray} data - * @param {!function(?string):undefined} callback - * @return {undefined} - */ -Runtime.prototype.writeFile = function (path, data, callback) {"use strict"; }; -/** - * @param {!string} path - * @param {!function(boolean):undefined} callback - * @return {undefined} - */ -Runtime.prototype.isFile = function (path, callback) {"use strict"; }; -/** - * @param {!string} path - * @param {!function(number):undefined} callback - * @return {undefined} - */ -Runtime.prototype.getFileSize = function (path, callback) {"use strict"; }; -/** - * @param {!string} path - * @param {!function(?string):undefined} callback - * @return {undefined} - */ -Runtime.prototype.deleteFile = function (path, callback) {"use strict"; }; -/** - * @param {!string} msgOrCategory - * @param {!string=} msg - * @return {undefined} - */ -Runtime.prototype.log = function (msgOrCategory, msg) {"use strict"; }; -/** - * @param {!function():undefined} callback - * @param {!number} milliseconds - * @return {undefined} - */ -Runtime.prototype.setTimeout = function (callback, milliseconds) {"use strict"; }; -/** - * @return {!Array.} - */ -Runtime.prototype.libraryPaths = function () {"use strict"; }; -/** - * @return {string} - */ -Runtime.prototype.type = function () {"use strict"; }; -/** - * @return {?DOMImplementation} - */ -Runtime.prototype.getDOMImplementation = function () {"use strict"; }; -/** - * @return {?Window} - */ -Runtime.prototype.getWindow = function () {"use strict"; }; - -/** @define {boolean} */ -var IS_COMPILED_CODE = false; - -/** - * @this {Runtime} - * @param {!Runtime.ByteArray} bytearray - * @param {!string} encoding - * @return {!string} - */ -Runtime.byteArrayToString = function (bytearray, encoding) { - "use strict"; - function byteArrayToString(bytearray) { - var s = "", i, l = bytearray.length; - for (i = 0; i < l; i += 1) { - s += String.fromCharCode(bytearray[i] & 0xff); - } - return s; - } - function utf8ByteArrayToString(bytearray) { - var s = "", i, l = bytearray.length, - c0, c1, c2; - for (i = 0; i < l; i += 1) { - c0 = bytearray[i]; - if (c0 < 0x80) { - s += String.fromCharCode(c0); - } else { - i += 1; - c1 = bytearray[i]; - if (c0 < 0xe0) { - s += String.fromCharCode(((c0 & 0x1f) << 6) | (c1 & 0x3f)); - } else { - i += 1; - c2 = bytearray[i]; - s += String.fromCharCode(((c0 & 0x0f) << 12) | - ((c1 & 0x3f) << 6) | (c2 & 0x3f)); - } - } - } - return s; - } - var result; - if (encoding === "utf8") { - result = utf8ByteArrayToString(bytearray); - } else { - if (encoding !== "binary") { - this.log("Unsupported encoding: " + encoding); - } - result = byteArrayToString(bytearray); - } - return result; -}; -Runtime.getFunctionName = function getFunctionName(f) { - "use strict"; - var m; - if (f.name === undefined) { - m = new RegExp("function\\s+(\\w+)").exec(f); - return m && m[1]; - } - return f.name; -}; -/** - * @class - * @constructor - * @augments Runtime - * @implements {Runtime} - * @param {Element} logoutput - */ -function BrowserRuntime(logoutput) { - "use strict"; - var self = this, - cache = {}, - useNativeArray = window.ArrayBuffer && window.Uint8Array; - /** - * @constructor - * @augments Runtime.ByteArray - * @inner - * @extends {Runtime.ByteArray} - * @param {!number} size - */ - this.ByteArray = (useNativeArray) - // if Uint8Array is available, use that - ? function ByteArray(size) { - Uint8Array.prototype.slice = function (begin, end) { - if (end === undefined) { - if (begin === undefined) { - begin = 0; - } - end = this.length; - } - var view = this.subarray(begin, end), array, i; - end -= begin; - array = new Uint8Array(new ArrayBuffer(end)); - for (i = 0; i < end; i += 1) { - array[i] = view[i]; - } - return array; - }; - return new Uint8Array(new ArrayBuffer(size)); - } - : function ByteArray(size) { - var a = []; - a.length = size; - return a; - }; - this.concatByteArrays = (useNativeArray) - ? function (bytearray1, bytearray2) { - var i, l1 = bytearray1.length, l2 = bytearray2.length, - a = new this.ByteArray(l1 + l2); - for (i = 0; i < l1; i += 1) { - a[i] = bytearray1[i]; - } - for (i = 0; i < l2; i += 1) { - a[i + l1] = bytearray2[i]; - } - return a; - } - : function (bytearray1, bytearray2) { - return bytearray1.concat(bytearray2); - }; - function utf8ByteArrayFromString(string) { - var l = string.length, bytearray, i, n, j = 0; - // first determine the length in bytes - for (i = 0; i < l; i += 1) { - n = string.charCodeAt(i); - j += 1 + (n > 0x80) + (n > 0x800); - } - // allocate a buffer and convert to a utf8 array - bytearray = new self.ByteArray(j); - j = 0; - for (i = 0; i < l; i += 1) { - n = string.charCodeAt(i); - if (n < 0x80) { - bytearray[j] = n; - j += 1; - } else if (n < 0x800) { - bytearray[j] = 0xc0 | (n >>> 6); - bytearray[j + 1] = 0x80 | (n & 0x3f); - j += 2; - } else { - bytearray[j] = 0xe0 | ((n >>> 12) & 0x0f); - bytearray[j + 1] = 0x80 | ((n >>> 6) & 0x3f); - bytearray[j + 2] = 0x80 | (n & 0x3f); - j += 3; - } - } - return bytearray; - } - function byteArrayFromString(string) { - // ignore encoding for now - var l = string.length, - a = new self.ByteArray(l), - i; - for (i = 0; i < l; i += 1) { - a[i] = string.charCodeAt(i) & 0xff; - } - return a; - } - this.byteArrayFromArray = function (array) { - return array.slice(); - }; - this.byteArrayFromString = function (string, encoding) { - var result; - if (encoding === "utf8") { - result = utf8ByteArrayFromString(string); - } else { - if (encoding !== "binary") { - self.log("unknown encoding: " + encoding); - } - result = byteArrayFromString(string); - } - return result; - }; - this.byteArrayToString = Runtime.byteArrayToString; - - /** - * @param {!string} msgOrCategory - * @param {string=} msg - * @return {undefined} - */ - function log(msgOrCategory, msg) { - var node, doc, category; - if (msg) { - category = msgOrCategory; - } else { - msg = msgOrCategory; - } - if (logoutput) { - doc = logoutput.ownerDocument; - if (category) { - node = doc.createElement("span"); - node.className = category; - node.appendChild(doc.createTextNode(category)); - logoutput.appendChild(node); - logoutput.appendChild(doc.createTextNode(" ")); - } - node = doc.createElement("span"); - node.appendChild(doc.createTextNode(msg)); - logoutput.appendChild(node); - logoutput.appendChild(doc.createElement("br")); - } else if (console) { - console.log(msg); - } - } - function readFile(path, encoding, callback) { - if (cache.hasOwnProperty(path)) { - callback(null, cache[path]); - return; - } - var xhr = new XMLHttpRequest(); - function handleResult() { - var data; - if (xhr.readyState === 4) { - if (xhr.status === 0 && !xhr.responseText) { - // for local files there is no difference between missing - // and empty files, so empty files are considered as errors - callback("File " + path + " is empty."); - } else if (xhr.status === 200 || xhr.status === 0) { - // report file - if (encoding === "binary") { - if (typeof VBArray !== "undefined") { // IE9 - data = new VBArray(xhr.responseBody).toArray(); - } else { - data = self.byteArrayFromString(xhr.responseText, - "binary"); - } - } else { - data = xhr.responseText; - } - cache[path] = data; - callback(null, data); - } else { - // report error - callback(xhr.responseText || xhr.statusText); - } - } - } - xhr.open('GET', path, true); - xhr.onreadystatechange = handleResult; - if (xhr.overrideMimeType) { - if (encoding !== "binary") { - xhr.overrideMimeType("text/plain; charset=" + encoding); - } else { - xhr.overrideMimeType("text/plain; charset=x-user-defined"); - } - } - try { - xhr.send(null); - } catch (e) { - callback(e.message); - } - } - function read(path, offset, length, callback) { - if (cache.hasOwnProperty(path)) { - callback(null, cache[path].slice(offset, offset + length)); - return; - } - var xhr = new XMLHttpRequest(); - function handleResult() { - var data; - if (xhr.readyState === 4) { - if (xhr.status === 0 && !xhr.responseText) { - // for local files there is no difference between missing - // and empty files, so empty files are considered as errors - callback("File " + path + " is empty."); - } else if (xhr.status === 200 || xhr.status === 0) { - // report file - if (typeof VBArray !== "undefined") { - data = new VBArray(xhr.responseBody).toArray(); - } else { - data = self.byteArrayFromString(xhr.responseText, "binary"); - } - cache[path] = data; - callback(null, data.slice(offset, offset + length)); - } else { - // report error - callback(xhr.responseText || xhr.statusText); - } - } - } - xhr.open('GET', path, true); - xhr.onreadystatechange = handleResult; - if (xhr.overrideMimeType) { - xhr.overrideMimeType("text/plain; charset=x-user-defined"); - } - //xhr.setRequestHeader('Range', 'bytes=' + offset + '-' + - // (offset + length - 1)); - try { - xhr.send(null); - } catch (e) { - callback(e.message); - } - } - function readFileSync(path, encoding) { - var xhr = new XMLHttpRequest(), - result; - xhr.open('GET', path, false); - if (xhr.overrideMimeType) { - if (encoding !== "binary") { - xhr.overrideMimeType("text/plain; charset=" + encoding); - } else { - xhr.overrideMimeType("text/plain; charset=x-user-defined"); - } - } - try { - xhr.send(null); - if (xhr.status === 200 || xhr.status === 0) { - result = xhr.responseText; - } - } catch (e) { - } - return result; - } - function writeFile(path, data, callback) { - cache[path] = data; - var xhr = new XMLHttpRequest(); - function handleResult() { - if (xhr.readyState === 4) { - if (xhr.status === 0 && !xhr.responseText) { - // for local files there is no difference between missing - // and empty files, so empty files are considered as errors - callback("File " + path + " is empty."); - } else if ((xhr.status >= 200 && xhr.status < 300) || - xhr.status === 0) { - // report success - callback(null); - } else { - // report error - callback("Status " + String(xhr.status) + ": " + - xhr.responseText || xhr.statusText); - } - } - } - xhr.open('PUT', path, true); - xhr.onreadystatechange = handleResult; - // ArrayBufferView will have an ArrayBuffer property, in WebKit, XHR can send() - // an ArrayBuffer, In Firefox, one must use sendAsBinary with a string - if (data.buffer && !xhr.sendAsBinary) { - data = data.buffer; // webkit supports sending an ArrayBuffer - } else { - // encode into a string, this works in FireFox >= 3 - data = self.byteArrayToString(data, "binary"); - } - try { - if (xhr.sendAsBinary) { - xhr.sendAsBinary(data); - } else { - xhr.send(data); - } - } catch (e) { - self.log("HUH? " + e + " " + data); - callback(e.message); - } - } - function deleteFile(path, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('DELETE', path, true); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status < 200 && xhr.status >= 300) { - callback(xhr.responseText); - } else { - callback(null); - } - } - }; - xhr.send(null); - } - function loadXML(path, callback) { - var xhr = new XMLHttpRequest(); - function handleResult() { - if (xhr.readyState === 4) { - if (xhr.status === 0 && !xhr.responseText) { - callback("File " + path + " is empty."); - } else if (xhr.status === 200 || xhr.status === 0) { - // report file - callback(null, xhr.responseXML); - } else { - // report error - callback(xhr.responseText); - } - } - } - xhr.open("GET", path, true); - if (xhr.overrideMimeType) { - xhr.overrideMimeType("text/xml"); - } - xhr.onreadystatechange = handleResult; - try { - xhr.send(null); - } catch (e) { - callback(e.message); - } - } - function isFile(path, callback) { - self.getFileSize(path, function (size) { - callback(size !== -1); - }); - } - function getFileSize(path, callback) { - var xhr = new XMLHttpRequest(); - xhr.open("HEAD", path, true); - xhr.onreadystatechange = function () { - if (xhr.readyState !== 4) { - return; - } - var cl = xhr.getResponseHeader("Content-Length"); - if (cl) { - callback(parseInt(cl, 10)); - } else { - callback(-1); - } - }; - xhr.send(null); - } - function wrap(nativeFunction, nargs) { - if (!nativeFunction) { - return null; - } - return function () { - // clear cache - cache = {}; - // assume the last argument is a callback function - var callback = arguments[nargs], - args = Array.prototype.slice.call(arguments, 0, nargs), - callbackname = "callback" + String(Math.random()).substring(2); - window[callbackname] = function () { - delete window[callbackname]; - callback.apply(this, arguments); - }; - args.push(callbackname); - nativeFunction.apply(this, args); - }; - } - this.readFile = readFile; - this.read = read; - this.readFileSync = readFileSync; - this.writeFile = writeFile; - this.deleteFile = deleteFile; - this.loadXML = loadXML; - this.isFile = isFile; - this.getFileSize = getFileSize; - this.log = log; - this.setTimeout = function (f, msec) { - setTimeout(function () { - f(); - }, msec); - }; - this.libraryPaths = function () { - return ["lib"]; // TODO: find a good solution - // probably let html app specify it - }; - this.setCurrentDirectory = function (dir) { - }; - this.type = function () { - return "BrowserRuntime"; - }; - this.getDOMImplementation = function () { - return window.document.implementation; - }; - this.exit = function (exitCode) { - log("Calling exit with code " + String(exitCode) + - ", but exit() is not implemented."); - }; - this.getWindow = function () { - return window; - }; -} - -/** - * @constructor - * @implements {Runtime} - */ -function NodeJSRuntime() { - "use strict"; - var self = this, - fs = require('fs'), - currentDirectory = ""; - - /** - * @constructor - * @extends {Runtime.ByteArray} - * @param {!number} size - */ - this.ByteArray = function (size) { - return new Buffer(size); - }; - - this.byteArrayFromArray = function (array) { - var ba = new Buffer(array.length), - i, - l = array.length; - for (i = 0; i < l; i += 1) { - ba[i] = array[i]; - } - return ba; - }; - - this.concatByteArrays = function (a, b) { - var ba = new Buffer(a.length + b.length); - a.copy(ba, 0, 0); - b.copy(ba, a.length, 0); - return ba; - }; - - this.byteArrayFromString = function (string, encoding) { - return new Buffer(string, encoding); - }; - - this.byteArrayToString = function (bytearray, encoding) { - return bytearray.toString(encoding); - }; - - function isFile(path, callback) { - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - fs.stat(path, function (err, stats) { - callback(!err && stats.isFile()); - }); - } - function loadXML(path, callback) { - throw "Not implemented."; - } - this.readFile = function (path, encoding, callback) { - if (encoding !== "binary") { - fs.readFile(path, encoding, callback); - } else { - fs.readFile(path, null, callback); -/* - // we have to encode the returned buffer to a string - // it would be nice if we would have a blob or buffer object - fs.readFile(path, null, function (err, data) { - if (err) { - callback(err); - return; - } - callback(null, data.toString("binary")); - }); -*/ - } - }; - this.writeFile = function (path, data, callback) { - fs.writeFile(path, data, "binary", function (err) { - callback(err || null); - }); - }; - this.deleteFile = fs.unlink; - this.read = function (path, offset, length, callback) { - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - fs.open(path, "r+", 666, function (err, fd) { - if (err) { - callback(err); - return; - } - var buffer = new Buffer(length); - fs.read(fd, buffer, 0, length, offset, function (err, bytesRead) { - fs.close(fd); - callback(err, buffer); - }); - }); - }; - this.readFileSync = function (path, encoding) { - if (!encoding) { - return ""; - } - return fs.readFileSync(path, encoding); - }; - this.loadXML = loadXML; - this.isFile = isFile; - this.getFileSize = function (path, callback) { - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - fs.stat(path, function (err, stats) { - if (err) { - callback(-1); - } else { - callback(stats.size); - } - }); - }; - this.log = function (msg) { - process.stderr.write(msg + '\n'); - }; - this.setTimeout = function (f, msec) { - setTimeout(function () { - f(); - }, msec); - }; - this.libraryPaths = function () { - return [__dirname]; - }; - this.setCurrentDirectory = function (dir) { - currentDirectory = dir; - }; - this.currentDirectory = function () { - return currentDirectory; - }; - this.type = function () { - return "NodeJSRuntime"; - }; - this.getDOMImplementation = function () { - return null; - }; - this.exit = process.exit; - this.getWindow = function () { - return null; - }; -} - -/** - * @constructor - * @implements {Runtime} - */ -function RhinoRuntime() { - "use strict"; - var self = this, - dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), - builder, - entityresolver, - currentDirectory = ""; - dom.setValidating(false); - dom.setNamespaceAware(true); - dom.setExpandEntityReferences(false); - dom.setSchema(null); - entityresolver = Packages.org.xml.sax.EntityResolver({ - resolveEntity: function (publicId, systemId) { - var file, open = function (path) { - var reader = new Packages.java.io.FileReader(path), - source = new Packages.org.xml.sax.InputSource(reader); - return source; - }; - file = systemId; - //file = /[^\/]*$/.exec(systemId); // what should this do? - return open(file); - } - }); - //dom.setEntityResolver(entityresolver); - builder = dom.newDocumentBuilder(); - builder.setEntityResolver(entityresolver); - - /** - * @constructor - * @param {!number} size - */ - this.ByteArray = function ByteArray(size) { - return [size]; - }; - this.byteArrayFromArray = function (array) { - return array; - }; - this.byteArrayFromString = function (string, encoding) { - // ignore encoding for now - var a = [], i, l = string.length; - for (i = 0; i < l; i += 1) { - a[i] = string.charCodeAt(i) & 0xff; - } - return a; - }; - this.byteArrayToString = Runtime.byteArrayToString; - this.concatByteArrays = function (bytearray1, bytearray2) { - return bytearray1.concat(bytearray2); - }; - - function loadXML(path, callback) { - var file = new Packages.java.io.File(path), - document; - try { - document = builder.parse(file); - } catch (err) { - print(err); - callback(err); - return; - } - callback(null, document); - } - function runtimeReadFile(path, encoding, callback) { - var file = new Packages.java.io.File(path), - data, - // read binary, seems hacky but works - rhinoencoding = (encoding === "binary") ? "latin1" : encoding; - if (!file.isFile()) { - callback(path + " is not a file."); - } else { - data = readFile(path, rhinoencoding); - if (encoding === "binary") { - data = self.byteArrayFromString(data, "binary"); - } - callback(null, data); - } - } - /** - * @param {!string} path - * @param {!string} encoding - * @return {?string} - */ - function runtimeReadFileSync(path, encoding) { - var file = new Packages.java.io.File(path), data, i; - if (!file.isFile()) { - return null; - } - if (encoding === "binary") { - encoding = "latin1"; // read binary, seems hacky but works - } - return readFile(path, encoding); - } - function isFile(path, callback) { - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - var file = new Packages.java.io.File(path); - callback(file.isFile()); - } - this.loadXML = loadXML; - this.readFile = runtimeReadFile; - this.writeFile = function (path, data, callback) { - var out = new Packages.java.io.FileOutputStream(path), - i, - l = data.length; - for (i = 0; i < l; i += 1) { - out.write(data[i]); - } - out.close(); - callback(null); - }; - this.deleteFile = function (path, callback) { - var file = new Packages.java.io.File(path); - if (file['delete']()) { - callback(null); - } else { - callback("Could not delete " + path); - } - }; - this.read = function (path, offset, length, callback) { - // TODO: adapt to read only a part instead of the whole file - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - var data = runtimeReadFileSync(path, "binary"); - if (data) { - callback(null, this.byteArrayFromString( - data.substring(offset, offset + length), - "binary" - )); - } else { - callback("Cannot read " + path); - } - }; - this.readFileSync = function (path, encoding) { - if (!encoding) { - return ""; - } - return readFile(path, encoding); - }; - this.isFile = isFile; - this.getFileSize = function (path, callback) { - if (currentDirectory) { - path = currentDirectory + "/" + path; - } - var file = new Packages.java.io.File(path); - callback(file.length()); - }; - this.log = print; - this.setTimeout = function (f, msec) { - f(); - }; - this.libraryPaths = function () { - return ["lib"]; - }; - this.setCurrentDirectory = function (dir) { - currentDirectory = dir; - }; - this.currentDirectory = function () { - return currentDirectory; - }; - this.type = function () { - return "RhinoRuntime"; - }; - this.getDOMImplementation = function () { - return builder.getDOMImplementation(); - }; - this.exit = quit; - this.getWindow = function () { - return null; - }; -} - -/** - * @const - * @type {Runtime} - */ -var runtime = (function () { - "use strict"; - var result; - if (typeof window !== "undefined") { - result = new BrowserRuntime(window.document.getElementById("logoutput")); - } else if (typeof require !== "undefined") { - result = new NodeJSRuntime(); - } else { - result = new RhinoRuntime(); - } - return result; -}()); -/*jslint sloppy: true*/ -(function () { - var cache = {}, - dircontents = {}; - function getOrDefinePackage(packageNameComponents) { - var topname = packageNameComponents[0], - i, - pkg; - // ensure top level package exists - pkg = eval("if (typeof " + topname + " === 'undefined') {" + - "eval('" + topname + " = {};');}" + topname); - for (i = 1; i < packageNameComponents.length - 1; i += 1) { - if (!pkg.hasOwnProperty(packageNameComponents[i])) { - pkg = pkg[packageNameComponents[i]] = {}; - } - } - return pkg[packageNameComponents[packageNameComponents.length - 1]]; - } - /** - * @param {string} classpath - * @returns {undefined} - */ - runtime.loadClass = function (classpath) { - if (IS_COMPILED_CODE) { - return; - } - if (cache.hasOwnProperty(classpath)) { - return; - } - var names = classpath.split("."), - impl; - impl = getOrDefinePackage(names); - if (impl) { - cache[classpath] = true; - return; - } - function getPathFromManifests(classpath) { - var path = classpath.replace(".", "/") + ".js", - dirs = runtime.libraryPaths(), - i, - dir, - code; - if (runtime.currentDirectory) { - dirs.push(runtime.currentDirectory()); - } - for (i = 0; i < dirs.length; i += 1) { - dir = dirs[i]; - if (!dircontents.hasOwnProperty(dir)) { - code = runtime.readFileSync(dirs[i] + "/manifest.js", - "utf8"); - if (code && code.length) { - try { - dircontents[dir] = eval(code); - } catch (e1) { - dircontents[dir] = null; - runtime.log("Cannot load manifest for " + dir + - "."); - } - } else { - dircontents[dir] = null; - } - } - code = null; - dir = dircontents[dir]; - if (dir && dir.indexOf && dir.indexOf(path) !== -1) { - return dirs[i] + "/" + path; - } - } - return null; - } - function load(classpath) { - var code, path; - path = getPathFromManifests(classpath); - if (!path) { - throw classpath + " is not listed in any manifest.js."; - } - try { - code = runtime.readFileSync(path, "utf8"); - } catch (e2) { - runtime.log("Error loading " + classpath + " " + e2); - throw e2; - } - if (code === undefined) { - throw "Cannot load class " + classpath; - } - try { - code = eval(classpath + " = eval(code);"); - } catch (e4) { - runtime.log("Error loading " + classpath + " " + e4); - throw e4; - } - return code; - } - // check if the class in context already - impl = load(classpath); - if (!impl || Runtime.getFunctionName(impl) !== - names[names.length - 1]) { - runtime.log("Loaded code is not for " + names[names.length - 1]); - throw "Loaded code is not for " + names[names.length - 1]; - } - cache[classpath] = true; - }; -}()); -(function (args) { - args = Array.prototype.slice.call(args); - function run(argv) { - if (!argv.length) { - return; - } - var script = argv[0]; - runtime.readFile(script, "utf8", function (err, code) { - var path = "", - paths = runtime.libraryPaths(); - if (script.indexOf("/") !== -1) { - path = script.substring(0, script.indexOf("/")); - } - runtime.setCurrentDirectory(path); - function run() { - var script, path, paths, args, argv, result; // hide variables - // execute script and make arguments available via argv - result = eval(code); - if (result) { - runtime.exit(result); - } - return; - } - if (err) { - runtime.log(err); - runtime.exit(1); - } else { - // run the script with arguments bound to arguments parameter - run.apply(null, argv); - } - }); - } - // if rhino or node.js, run the scripts provided as arguments - if (runtime.type() === "NodeJSRuntime") { - run(process.argv.slice(2)); - } else if (runtime.type() === "RhinoRuntime") { - run(args); - } else { - run(args.slice(1)); - } -}(typeof arguments !== "undefined" && arguments)); - diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js deleted file mode 100644 index 12b3219f81..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global xmldom*/ -/*jslint sub: true*/ -if (typeof Object.create !== 'function') { - Object['create'] = function (o) { - "use strict"; - /** - * @constructor - */ - var F = function () {}; - F.prototype = o; - return new F(); - }; -} - -/** - * Partial implementation of LSSerializer - * @constructor - */ -xmldom.LSSerializer = function LSSerializer() { - "use strict"; - var /**@const@type{!LSSerializer}*/ self = this; - - /** - * @param {!string} prefix - * @param {!Attr} attr - * @return {!string} - */ - function serializeAttribute(prefix, attr) { - var /**@type{!string}*/ s = prefix + attr.localName + "=\"" + - attr.nodeValue + "\""; - return s; - } - /** - * @param {!Object.} nsmap - * @param {string} prefix - * @param {string} ns - * @return {!string} - */ - function attributePrefix(nsmap, prefix, ns) { - // TODO: check for double prefix definitions, this needs a special class - if (nsmap.hasOwnProperty(ns)) { - return nsmap[ns] + ":"; - } - if (nsmap[ns] !== prefix) { - nsmap[ns] = prefix; - } - return prefix + ":"; - } - /** - * @param {!Object.} nsmap - * @param {!Node} node - * @return {!string} - */ - function startNode(nsmap, node) { - var /**@type{!string}*/ s = "", - /**@const@type{!NamedNodeMap}*/ atts = node.attributes, - /**@const@type{!number}*/ length, - /**@type{!number}*/ i, - /**@type{!Attr}*/ attr, - /**@type{!string}*/ attstr = "", - /**@type{!number}*/ accept, - /**@type{!string}*/ prefix; - if (atts) { // ELEMENT - if (nsmap[node.namespaceURI] !== node.prefix) { - nsmap[node.namespaceURI] = node.prefix; - } - s += "<" + node.nodeName; - length = atts.length; - for (i = 0; i < length; i += 1) { - attr = /**@type{!Attr}*/(atts.item(i)); - if (attr.namespaceURI !== "http://www.w3.org/2000/xmlns/") { - accept = (self.filter) ? self.filter.acceptNode(attr) : 1; - if (accept === 1) { - // xml attributes always need a prefix for a namespace - if (attr.namespaceURI) { - prefix = attributePrefix(nsmap, attr.prefix, - attr.namespaceURI); - } else { - prefix = ""; - } - attstr += " " + serializeAttribute(prefix, attr); - } - } - } - for (i in nsmap) { - if (nsmap.hasOwnProperty(i)) { - prefix = nsmap[i]; - if (!prefix) { - s += " xmlns=\"" + i + "\""; - } else if (prefix !== "xmlns") { - s += " xmlns:" + nsmap[i] + "=\"" + i + "\""; - } - } - } - s += attstr + ">"; - } - return s; - } - /** - * @param {!Node} node - * @return {!string} - */ - function endNode(node) { - var /**@type{!string}*/ s = ""; - if (node.nodeType === 1) { // ELEMENT - s += ""; - } - return s; - } - /** - * @param {!Object.} parentnsmap - * @param {!Node} node - * @return {!string} - */ - function serializeNode(parentnsmap, node) { - var /**@type{!string}*/ s = "", - /**@const@type{!Object.}*/ nsmap - = Object.create(parentnsmap), - /**@const@type{!number}*/ accept - = (self.filter) ? self.filter.acceptNode(node) : 1, - /**@type{Node}*/child; - if (accept === 1) { - s += startNode(nsmap, node); - } - if (accept === 1 || accept === 3) { - child = node.firstChild; - while (child) { - s += serializeNode(nsmap, child); - child = child.nextSibling; - } - if (node.nodeValue) { - s += node.nodeValue; - } - } - if (accept === 1) { - s += endNode(node); - } - return s; - } - function invertMap(map) { - var m = {}, i; - for (i in map) { - if (map.hasOwnProperty(i)) { - m[map[i]] = i; - } - } - return m; - } - /** - * @type {xmldom.LSSerializerFilter} - */ - this.filter = null; - /** - * @param {!Node} node - * @param {!Object.} nsmap - * @return {!string} - */ - this.writeToString = function (node, nsmap) { - if (!node) { - return ""; - } - nsmap = nsmap ? invertMap(nsmap) : {}; - return serializeNode(nsmap, node); - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js deleted file mode 100644 index 889428b831..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global xmldom*/ -/** - * Partial implementation of LSSerializerFilter - * @interface - */ -xmldom.LSSerializerFilter = function LSSerializerFilter() { - "use strict"; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js deleted file mode 100644 index 5e9f3abacf..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global xmldom*/ -/** - * @class - * @constructor - * @augments xmldom.OperationalTransformInterface - * @implements {xmldom.OperationalTransformInterface} - * @param {Element} root - * @param {xmldom.LSSerializer} serializer - */ -xmldom.OperationalTransformDOM = function OperationalTransformDOM(root, serializer) { - "use strict"; - var pos, length; - /** - * Skip in the document - * @param {!number} amount - * @return {undefined} - */ - function retain(amount) {} - /** - * Insert characters - * Can throw an exception if the current position does not allow insertion - * of characters. - * @param {!string} chars - * @return {undefined} - */ - function insertCharacters(chars) {} - /** - * Insert element start - * @param {!string} tagname - * @param {!Object} attributes - * @return {undefined} - */ - function insertElementStart(tagname, attributes) {} - /** - * Insert element end - * @return {undefined} - */ - function insertElementEnd() {} - /** - * Delete characters - * @param {!number} amount - * @return {undefined} - */ - function deleteCharacters(amount) {} - /** - * Delete element start - * @return {undefined} - */ - function deleteElementStart() {} - /** - * Delete element end - * @return {undefined} - */ - function deleteElementEnd() {} - /** - * Replace attributes - * @param {!Object} atts - * @return {undefined} - */ - function replaceAttributes(atts) {} - /** - * Update attributes - * @param {!Object} atts - * @return {undefined} - */ - function updateAttributes(atts) {} - /** - * @return {!boolean} - */ - function atEnd() { - return pos === length; - } - this.retain = retain; - this.insertCharacters = insertCharacters; - this.insertElementStart = insertElementStart; - this.insertElementEnd = insertElementEnd; - this.deleteCharacters = deleteCharacters; - this.deleteElementStart = deleteElementStart; - this.deleteElementEnd = deleteElementEnd; - this.replaceAttributes = replaceAttributes; - this.updateAttributes = updateAttributes; - this.atEnd = atEnd; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js deleted file mode 100644 index 03aab1232b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global xmldom*/ -/** - * This interface allows a document to be modified by operational - * transformations. The interface is modelled after Google Wave. - * Manual editing of XML documents will also be done via this interface. - * - * - * @class - * @interface - */ -xmldom.OperationalTransformInterface = function () {"use strict"; }; -/** - * Skip in the document - * @param {!number} amount - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.retain = function (amount) {"use strict"; }; -/** - * Insert characters - * Can throw an exception if the current position does not allow insertion of - * characters. - * @param {!string} chars - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.insertCharacters = function (chars) {"use strict"; }; -/** - * Insert element start - * @param {!string} tagname - * @param {!Object} attributes - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.insertElementStart = function (tagname, attributes) {"use strict"; }; -/** - * Insert element end - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.insertElementEnd = function () {"use strict"; }; -/** - * Delete characters - * @param {!number} amount - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.deleteCharacters = function (amount) {"use strict"; }; -/** - * Delete element start - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.deleteElementStart = function () {"use strict"; }; -/** - * Delete element end - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.deleteElementEnd = function () {"use strict"; }; -/** - * Replace attributes - * @param {!Object} atts - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.replaceAttributes = function (atts) {"use strict"; }; -/** - * Update attributes - * @param {!Object} atts - * @return {undefined} - */ -xmldom.OperationalTransformInterface.prototype.updateAttributes = function (atts) {"use strict"; }; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js deleted file mode 100644 index e04c3c7611..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js +++ /dev/null @@ -1,691 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, xmldom: true*/ - -/** - * RelaxNG can check a DOM tree against a Relax NG schema - * The RelaxNG implementation is currently not complete. Relax NG should not - * report errors on valid DOM trees, but it will not check all constraints that - * a Relax NG file can define. The current implementation does not load external - * parts of a Relax NG file. - * The main purpose of this Relax NG engine is to validate runtime ODF - * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker - * implementation can hide parts of a DOM tree. This is useful in WebODF, where - * special elements and attributes in the runtime DOM tree. - * - * implementation according to - * http://www.thaiopensource.com/relaxng/derivative.html - */ -runtime.loadClass("xmldom.RelaxNGParser"); -/** - * @constructor - */ -xmldom.RelaxNG = function RelaxNG() { - "use strict"; - var xmlnsns = "http://www.w3.org/2000/xmlns/", - createChoice, - createInterleave, - createGroup, - createAfter, - createOneOrMore, - createValue, - createAttribute, - createNameClass, - createData, - makePattern, - notAllowed = { - type: "notAllowed", - nullable: false, - hash: "notAllowed", - textDeriv: function () { return notAllowed; }, - startTagOpenDeriv: function () { return notAllowed; }, - attDeriv: function () { return notAllowed; }, - startTagCloseDeriv: function () { return notAllowed; }, - endTagDeriv: function () { return notAllowed; } - }, - empty = { - type: "empty", - nullable: true, - hash: "empty", - textDeriv: function () { return notAllowed; }, - startTagOpenDeriv: function () { return notAllowed; }, - attDeriv: function (context, attribute) { return notAllowed; }, - startTagCloseDeriv: function () { return empty; }, - endTagDeriv: function () { return notAllowed; } - }, - text = { - type: "text", - nullable: true, - hash: "text", - textDeriv: function () { return text; }, - startTagOpenDeriv: function () { return notAllowed; }, - attDeriv: function () { return notAllowed; }, - startTagCloseDeriv: function () { return text; }, - endTagDeriv: function () { return notAllowed; } - }, - applyAfter, - childDeriv, - rootPattern; - - function memoize0arg(func) { - return (function () { - var cache; - return function () { - if (cache === undefined) { - cache = func(); - } - return cache; - }; - }()); - } - function memoize1arg(type, func) { - return (function () { - var cache = {}, cachecount = 0; - return function (a) { - var ahash = a.hash || a.toString(), - v; - v = cache[ahash]; - if (v !== undefined) { - return v; - } - cache[ahash] = v = func(a); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v; - }; - }()); - } - function memoizeNode(func) { - return (function () { - var cache = {}; - return function (node) { - var v, m; - m = cache[node.localName]; - if (m === undefined) { - cache[node.localName] = m = {}; - } else { - v = m[node.namespaceURI]; - if (v !== undefined) { - return v; - } - } - m[node.namespaceURI] = v = func(node); - return v; - }; - }()); - } - function memoize2arg(type, fastfunc, func) { - return (function () { - var cache = {}, cachecount = 0; - return function (a, b) { - var v = fastfunc && fastfunc(a, b), - ahash, bhash, m; - if (v !== undefined) { return v; } - ahash = a.hash || a.toString(); - bhash = b.hash || b.toString(); - m = cache[ahash]; - if (m === undefined) { - cache[ahash] = m = {}; - } else { - v = m[bhash]; - if (v !== undefined) { - return v; - } - } - m[bhash] = v = func(a, b); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v; - }; - }()); - } - // this memoize function can be used for functions where the order of two - // arguments is not important - function unorderedMemoize2arg(type, fastfunc, func) { - return (function () { - var cache = {}, cachecount = 0; - return function (a, b) { - var v = fastfunc && fastfunc(a, b), - ahash, bhash, m; - if (v !== undefined) { return v; } - ahash = a.hash || a.toString(); - bhash = b.hash || b.toString(); - if (ahash < bhash) { - m = ahash; ahash = bhash; bhash = m; - m = a; a = b; b = m; - } - m = cache[ahash]; - if (m === undefined) { - cache[ahash] = m = {}; - } else { - v = m[bhash]; - if (v !== undefined) { - return v; - } - } - m[bhash] = v = func(a, b); - v.hash = type + cachecount.toString(); - cachecount += 1; - return v; - }; - }()); - } - function getUniqueLeaves(leaves, pattern) { - if (pattern.p1.type === "choice") { - getUniqueLeaves(leaves, pattern.p1); - } else { - leaves[pattern.p1.hash] = pattern.p1; - } - if (pattern.p2.type === "choice") { - getUniqueLeaves(leaves, pattern.p2); - } else { - leaves[pattern.p2.hash] = pattern.p2; - } - } - createChoice = memoize2arg("choice", function (p1, p2) { - if (p1 === notAllowed) { return p2; } - if (p2 === notAllowed) { return p1; } - if (p1 === p2) { return p1; } - }, function (p1, p2) { - function makeChoice(p1, p2) { - return { - type: "choice", - p1: p1, - p2: p2, - nullable: p1.nullable || p2.nullable, - textDeriv: function (context, text) { - return createChoice(p1.textDeriv(context, text), - p2.textDeriv(context, text)); - }, - startTagOpenDeriv: memoizeNode(function (node) { - return createChoice(p1.startTagOpenDeriv(node), - p2.startTagOpenDeriv(node)); - }), - attDeriv: function (context, attribute) { - return createChoice(p1.attDeriv(context, attribute), - p2.attDeriv(context, attribute)); - }, - startTagCloseDeriv: memoize0arg(function () { - return createChoice(p1.startTagCloseDeriv(), - p2.startTagCloseDeriv()); - }), - endTagDeriv: memoize0arg(function () { - return createChoice(p1.endTagDeriv(), p2.endTagDeriv()); - }) - }; - } - var leaves = {}, i; - getUniqueLeaves(leaves, {p1: p1, p2: p2}); - p1 = undefined; - p2 = undefined; - for (i in leaves) { - if (leaves.hasOwnProperty(i)) { - if (p1 === undefined) { - p1 = leaves[i]; - } else if (p2 === undefined) { - p2 = leaves[i]; - } else { - p2 = createChoice(p2, leaves[i]); - } - } - } - return makeChoice(p1, p2); - }); - createInterleave = unorderedMemoize2arg("interleave", function (p1, p2) { - if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } - if (p1 === empty) { return p2; } - if (p2 === empty) { return p1; } - }, function (p1, p2) { - return { - type: "interleave", - p1: p1, - p2: p2, - nullable: p1.nullable && p2.nullable, - textDeriv: function (context, text) { - return createChoice( - createInterleave(p1.textDeriv(context, text), p2), - createInterleave(p1, p2.textDeriv(context, text)) - ); - }, - startTagOpenDeriv: memoizeNode(function (node) { - return createChoice( - applyAfter(function (p) { return createInterleave(p, p2); }, - p1.startTagOpenDeriv(node)), - applyAfter(function (p) { return createInterleave(p1, p); }, - p2.startTagOpenDeriv(node))); - }), - attDeriv: function (context, attribute) { - return createChoice( - createInterleave(p1.attDeriv(context, attribute), p2), - createInterleave(p1, p2.attDeriv(context, attribute))); - }, - startTagCloseDeriv: memoize0arg(function () { - return createInterleave(p1.startTagCloseDeriv(), - p2.startTagCloseDeriv()); - }) - }; - }); - createGroup = memoize2arg("group", function (p1, p2) { - if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } - if (p1 === empty) { return p2; } - if (p2 === empty) { return p1; } - }, function (p1, p2) { - return { - type: "group", - p1: p1, - p2: p2, - nullable: p1.nullable && p2.nullable, - textDeriv: function (context, text) { - var p = createGroup(p1.textDeriv(context, text), p2); - if (p1.nullable) { - return createChoice(p, p2.textDeriv(context, text)); - } - return p; - }, - startTagOpenDeriv: function (node) { - var x = applyAfter(function (p) { return createGroup(p, p2); }, - p1.startTagOpenDeriv(node)); - if (p1.nullable) { - return createChoice(x, p2.startTagOpenDeriv(node)); - } - return x; - }, - attDeriv: function (context, attribute) { - return createChoice( - createGroup(p1.attDeriv(context, attribute), p2), - createGroup(p1, p2.attDeriv(context, attribute))); - }, - startTagCloseDeriv: memoize0arg(function () { - return createGroup(p1.startTagCloseDeriv(), - p2.startTagCloseDeriv()); - }) - }; - }); - createAfter = memoize2arg("after", function (p1, p2) { - if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } - }, function (p1, p2) { - return { - type: "after", - p1: p1, - p2: p2, - nullable: false, - textDeriv: function (context, text) { - return createAfter(p1.textDeriv(context, text), p2); - }, - startTagOpenDeriv: memoizeNode(function (node) { - return applyAfter(function (p) { return createAfter(p, p2); }, - p1.startTagOpenDeriv(node)); - }), - attDeriv: function (context, attribute) { - return createAfter(p1.attDeriv(context, attribute), p2); - }, - startTagCloseDeriv: memoize0arg(function () { - return createAfter(p1.startTagCloseDeriv(), p2); - }), - endTagDeriv: memoize0arg(function () { - return (p1.nullable) ? p2 : notAllowed; - }) - }; - }); - createOneOrMore = memoize1arg("oneormore", function (p) { - if (p === notAllowed) { return notAllowed; } - return { - type: "oneOrMore", - p: p, - nullable: p.nullable, - textDeriv: function (context, text) { - return createGroup(p.textDeriv(context, text), - createChoice(this, empty)); - }, - startTagOpenDeriv: function (node) { - var oneOrMore = this; - return applyAfter(function (pf) { - return createGroup(pf, createChoice(oneOrMore, empty)); - }, p.startTagOpenDeriv(node)); - }, - attDeriv: function (context, attribute) { - var oneOrMore = this; - return createGroup(p.attDeriv(context, attribute), - createChoice(oneOrMore, empty)); - }, - startTagCloseDeriv: memoize0arg(function () { - return createOneOrMore(p.startTagCloseDeriv()); - }) - }; - }); - function createElement(nc, p) { - return { - type: "element", - nc: nc, - nullable: false, - textDeriv: function () { return notAllowed; }, - startTagOpenDeriv: function (node) { - if (nc.contains(node)) { - return createAfter(p, empty); - } - return notAllowed; - }, - attDeriv: function (context, attribute) { return notAllowed; }, - startTagCloseDeriv: function () { return this; } - }; - } - function valueMatch(context, pattern, text) { - return (pattern.nullable && /^\s+$/.test(text)) || - pattern.textDeriv(context, text).nullable; - } - createAttribute = memoize2arg("attribute", undefined, function (nc, p) { - return { - type: "attribute", - nullable: false, - nc: nc, - p: p, - attDeriv: function (context, attribute) { - if (nc.contains(attribute) && valueMatch(context, p, - attribute.nodeValue)) { - return empty; - } - return notAllowed; - }, - startTagCloseDeriv: function () { return notAllowed; } - }; - }); - function createList() { - return { - type: "list", - nullable: false, - hash: "list", - textDeriv: function (context, text) { - return empty; - } - }; - } - createValue = memoize1arg("value", function (value) { - return { - type: "value", - nullable: false, - value: value, - textDeriv: function (context, text) { - return (text === value) ? empty : notAllowed; - }, - attDeriv: function () { return notAllowed; }, - startTagCloseDeriv: function () { return this; } - }; - }); - createData = memoize1arg("data", function (type) { - return { - type: "data", - nullable: false, - dataType: type, - textDeriv: function () { return empty; }, - attDeriv: function () { return notAllowed; }, - startTagCloseDeriv: function () { return this; } - }; - }); - function createDataExcept() { - return { - type: "dataExcept", - nullable: false, - hash: "dataExcept" - }; - } - applyAfter = function applyAfter(f, p) { - var result; - if (p.type === "after") { - result = createAfter(p.p1, f(p.p2)); - } else if (p.type === "choice") { - result = createChoice(applyAfter(f, p.p1), applyAfter(f, p.p2)); - } else { - result = p; - } - return result; - }; - function attsDeriv(context, pattern, attributes, position) { - if (pattern === notAllowed) { - return notAllowed; - } - if (position >= attributes.length) { - return pattern; - } - if (position === 0) { - // TODO: loop over attributes to update namespace mapping - position = 0; - } - var a = attributes.item(position); - while (a.namespaceURI === xmlnsns) { // always ok - position += 1; - if (position >= attributes.length) { - return pattern; - } - a = attributes.item(position); - } - a = attsDeriv(context, pattern.attDeriv(context, - attributes.item(position)), attributes, position + 1); - return a; - } - function childrenDeriv(context, pattern, walker) { - var element = walker.currentNode, - childNode = walker.firstChild(), - numberOfTextNodes = 0, - childNodes = [], i, p; - // simple incomplete implementation: only use non-empty text nodes - while (childNode) { - if (childNode.nodeType === 1) { - childNodes.push(childNode); - } else if (childNode.nodeType === 3 && - !/^\s*$/.test(childNode.nodeValue)) { - childNodes.push(childNode.nodeValue); - numberOfTextNodes += 1; - } - childNode = walker.nextSibling(); - } - // if there is no nodes at all, add an empty text node - if (childNodes.length === 0) { - childNodes = [""]; - } - p = pattern; - for (i = 0; p !== notAllowed && i < childNodes.length; i += 1) { - childNode = childNodes[i]; - if (typeof childNode === "string") { - if (/^\s*$/.test(childNode)) { - p = createChoice(p, p.textDeriv(context, childNode)); - } else { - p = p.textDeriv(context, childNode); - } - } else { - walker.currentNode = childNode; - p = childDeriv(context, p, walker); - } - } - walker.currentNode = element; - return p; - } - childDeriv = function childDeriv(context, pattern, walker) { - var childNode = walker.currentNode, p; - p = pattern.startTagOpenDeriv(childNode); - p = attsDeriv(context, p, childNode.attributes, 0); - p = p.startTagCloseDeriv(); - p = childrenDeriv(context, p, walker); - p = p.endTagDeriv(); - return p; - }; - function addNames(name, ns, pattern) { - if (pattern.e[0].a) { - name.push(pattern.e[0].text); - ns.push(pattern.e[0].a.ns); - } else { - addNames(name, ns, pattern.e[0]); - } - if (pattern.e[1].a) { - name.push(pattern.e[1].text); - ns.push(pattern.e[1].a.ns); - } else { - addNames(name, ns, pattern.e[1]); - } - } - createNameClass = function createNameClass(pattern) { - var name, ns, hash, i, result; - if (pattern.name === "name") { - name = pattern.text; - ns = pattern.a.ns; - result = { - name: name, - ns: ns, - hash: "{" + ns + "}" + name, - contains: function (node) { - return node.namespaceURI === ns && node.localName === name; - } - }; - } else if (pattern.name === "choice") { - name = []; - ns = []; - addNames(name, ns, pattern); - hash = ""; - for (i = 0; i < name.length; i += 1) { - hash += "{" + ns[i] + "}" + name[i] + ","; - } - result = { - hash: hash, - contains: function (node) { - var i; - for (i = 0; i < name.length; i += 1) { - if (name[i] === node.localName && - ns[i] === node.namespaceURI) { - return true; - } - } - return false; - } - }; - } else { - result = { - hash: "anyName", - contains: function () { return true; } - }; - } - return result; - }; - function resolveElement(pattern, elements) { - var element, p, i, hash; - // create an empty object in the store to enable circular - // dependencies - hash = "element" + pattern.id.toString(); - p = elements[pattern.id] = { hash: hash }; - element = createElement(createNameClass(pattern.e[0]), - makePattern(pattern.e[1], elements)); - // copy the properties of the new object into the predefined one - for (i in element) { - if (element.hasOwnProperty(i)) { - p[i] = element[i]; - } - } - return p; - } - makePattern = function makePattern(pattern, elements) { - var p, i; - if (pattern.name === "elementref") { - p = pattern.id || 0; - pattern = elements[p]; - if (pattern.name !== undefined) { - return resolveElement(pattern, elements); - } - return pattern; - } - switch (pattern.name) { - case 'empty': - return empty; - case 'notAllowed': - return notAllowed; - case 'text': - return text; - case 'choice': - return createChoice(makePattern(pattern.e[0], elements), - makePattern(pattern.e[1], elements)); - case 'interleave': - p = makePattern(pattern.e[0], elements); - for (i = 1; i < pattern.e.length; i += 1) { - p = createInterleave(p, makePattern(pattern.e[i], - elements)); - } - return p; - case 'group': - return createGroup(makePattern(pattern.e[0], elements), - makePattern(pattern.e[1], elements)); - case 'oneOrMore': - return createOneOrMore(makePattern(pattern.e[0], elements)); - case 'attribute': - return createAttribute(createNameClass(pattern.e[0]), - makePattern(pattern.e[1], elements)); - case 'value': - return createValue(pattern.text); - case 'data': - p = pattern.a && pattern.a.type; - if (p === undefined) { - p = ""; - } - return createData(p); - case 'list': - return createList(); - } - throw "No support for " + pattern.name; - }; - this.makePattern = function (pattern, elements) { - var copy = {}, i; - for (i in elements) { - if (elements.hasOwnProperty(i)) { - copy[i] = elements[i]; - } - } - i = makePattern(pattern, copy); - return i; - }; - /** - * Validate the elements pointed to by the TreeWalker - * @param {!TreeWalker} walker - * @param {!function(Array.):undefined} callback - * @return {undefined} - */ - this.validate = function validate(walker, callback) { - var errors; - walker.currentNode = walker.root; - errors = childDeriv(null, rootPattern, walker); - if (!errors.nullable) { - runtime.log("Error in Relax NG validation: " + errors); - callback(["Error in Relax NG validation: " + errors]); - } else { - callback(null); - } - }; - this.init = function init(rootPattern1) { - rootPattern = rootPattern1; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js deleted file mode 100644 index 185ef5236e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js +++ /dev/null @@ -1,416 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, xmldom: true*/ - -/** - * RelaxNG can check a DOM tree against a Relax NG schema - * The RelaxNG implementation is currently not complete. Relax NG should not - * report errors on valid DOM trees, but it will not check all constraints that - * a Relax NG file can define. The current implementation does not load external - * parts of a Relax NG file. - * The main purpose of this Relax NG engine is to validate runtime ODF - * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker - * implementation can hide parts of a DOM tree. This is useful in WebODF, where - * special elements and attributes in the runtime DOM tree. - */ -runtime.loadClass("xmldom.RelaxNGParser"); -/** - * @constructor - */ -xmldom.RelaxNG2 = function RelaxNG2() { - "use strict"; - var start, - validateNonEmptyPattern, - nsmap, - depth = 0, - p = " "; - - /** - * @constructor - * @param {!string} error - * @param {Node=} context - */ - function RelaxNGParseError(error, context) { - this.message = function () { - if (context) { - error += (context.nodeType === 1) ? " Element " : " Node "; - error += context.nodeName; - if (context.nodeValue) { - error += " with value '" + context.nodeValue + "'"; - } - error += "."; - } - return error; - }; -// runtime.log("[" + p.slice(0, depth) + this.message() + "]"); - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateOneOrMore(elementdef, walker, element) { - // The list of definitions in the elements list should be completely - // traversed at least once. If a second or later round fails, the walker - // should go back to the start of the last successful traversal - var node, i = 0, err; - do { - node = walker.currentNode; - err = validateNonEmptyPattern(elementdef.e[0], walker, element); - i += 1; - } while (!err && node !== walker.currentNode); - if (i > 1) { // at least one round was without error - // set position back to position of before last failed round - walker.currentNode = node; - return null; - } - return err; - } - /** - * @param {!Node} node - * @return {!string} - */ - function qName(node) { - return nsmap[node.namespaceURI] + ":" + node.localName; - } - /** - * @param {!Node} node - * @return {!boolean} - */ - function isWhitespace(node) { - return node && node.nodeType === 3 && /^\s+$/.test(node.nodeValue); - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @param {string=} data - * @return {Array.} - */ - function validatePattern(elementdef, walker, element, data) { - if (elementdef.name === "empty") { - return null; - } - return validateNonEmptyPattern(elementdef, walker, element, data); - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateAttribute(elementdef, walker, element) { - if (elementdef.e.length !== 2) { - throw "Attribute with wrong # of elements: " + elementdef.e.length; - } - var att, a, l = elementdef.localnames.length, i; - for (i = 0; i < l; i += 1) { - a = element.getAttributeNS(elementdef.namespaces[i], - elementdef.localnames[i]); - // if an element is not present, getAttributeNS will return an empty - // string but an empty string is possible attribute value, so an - // extra check is needed - if (a === "" && !element.hasAttributeNS(elementdef.namespaces[i], - elementdef.localnames[i])) { - a = undefined; - } - if (att !== undefined && a !== undefined) { - return [new RelaxNGParseError("Attribute defined too often.", - element)]; - } - att = a; - } - if (att === undefined) { - return [new RelaxNGParseError("Attribute not found: " + - elementdef.names, element)]; - } - return validatePattern(elementdef.e[1], walker, element, att); - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateTop(elementdef, walker, element) { - // notAllowed not implemented atm - return validatePattern(elementdef, walker, element); - } - /** - * Validate an element. - * Function forwards the walker until an element is met. - * If element if of the right type, it is entered and the validation - * continues inside the element. After validation, regardless of whether an - * error occurred, the walker is at the same depth in the dom tree. - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateElement(elementdef, walker, element) { - if (elementdef.e.length !== 2) { - throw "Element with wrong # of elements: " + elementdef.e.length; - } - depth += 1; - // forward until an element is seen, then check the name - var /**@type{Node}*/ node = walker.currentNode, - /**@type{number}*/ type = node ? node.nodeType : 0, - error = null; - // find the next element, skip text nodes with only whitespace - while (type > 1) { - if (type !== 8 && - (type !== 3 || - !/^\s+$/.test(walker.currentNode.nodeValue))) {// TEXT_NODE - depth -= 1; - return [new RelaxNGParseError("Not allowed node of type " + - type + ".")]; - } - node = walker.nextSibling(); - type = node ? node.nodeType : 0; - } - if (!node) { - depth -= 1; - return [new RelaxNGParseError("Missing element " + - elementdef.names)]; - } - if (elementdef.names && elementdef.names.indexOf(qName(node)) === -1) { - depth -= 1; - return [new RelaxNGParseError("Found " + node.nodeName + - " instead of " + elementdef.names + ".", node)]; - } - // the right element was found, now parse the contents - if (walker.firstChild()) { - // currentNode now points to the first child node of this element - error = validateTop(elementdef.e[1], walker, node); - // there should be no content left - while (walker.nextSibling()) { - type = walker.currentNode.nodeType; - if (!isWhitespace(walker.currentNode) && type !== 8) { - depth -= 1; - return [new RelaxNGParseError("Spurious content.", - walker.currentNode)]; - } - } - if (walker.parentNode() !== node) { - depth -= 1; - return [new RelaxNGParseError("Implementation error.")]; - } - } else { - error = validateTop(elementdef.e[1], walker, node); - } - depth -= 1; - // move to the next node - node = walker.nextSibling(); - return error; - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @param {string=} data - * @return {Array.} - */ - function validateChoice(elementdef, walker, element, data) { - // loop through child definitions and return if a match is found - if (elementdef.e.length !== 2) { - throw "Choice with wrong # of options: " + elementdef.e.length; - } - var node = walker.currentNode, err; - // if the first option is empty, just check the second one for debugging - // but the total choice is alwasy ok - if (elementdef.e[0].name === "empty") { - err = validateNonEmptyPattern(elementdef.e[1], walker, element, - data); - if (err) { - walker.currentNode = node; - } - return null; - } - err = validatePattern(elementdef.e[0], walker, element, data); - if (err) { - walker.currentNode = node; - err = validateNonEmptyPattern(elementdef.e[1], walker, element, - data); - } - return err; - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateInterleave(elementdef, walker, element) { - var l = elementdef.e.length, n = [l], err, i, todo = l, - donethisround, node, subnode, e; - // the interleave is done when all items are 'true' and no - while (todo > 0) { - donethisround = 0; - node = walker.currentNode; - for (i = 0; i < l; i += 1) { - subnode = walker.currentNode; - if (n[i] !== true && n[i] !== subnode) { - e = elementdef.e[i]; - err = validateNonEmptyPattern(e, walker, element); - if (err) { - walker.currentNode = subnode; - if (n[i] === undefined) { - n[i] = false; - } - } else if (subnode === walker.currentNode || - // this is a bit dodgy, there should be a rule to - // see if multiple elements are allowed - e.name === "oneOrMore" || - (e.name === "choice" && - (e.e[0].name === "oneOrMore" || - e.e[1].name === "oneOrMore"))) { - donethisround += 1; - n[i] = subnode; // no error and try this one again later - } else { - donethisround += 1; - n[i] = true; // no error and progress - } - } - } - if (node === walker.currentNode && donethisround === todo) { - return null; - } - if (donethisround === 0) { - for (i = 0; i < l; i += 1) { - if (n[i] === false) { - return [new RelaxNGParseError( - "Interleave does not match.", element)]; - } - } - return null; - } - todo = 0; - for (i = 0; i < l; i += 1) { - if (n[i] !== true) { - todo += 1; - } - } - } - return null; - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateGroup(elementdef, walker, element) { - if (elementdef.e.length !== 2) { - throw "Group with wrong # of members: " + elementdef.e.length; - } - //runtime.log(elementdef.e[0].name + " " + elementdef.e[1].name); - return validateNonEmptyPattern(elementdef.e[0], walker, element) || - validateNonEmptyPattern(elementdef.e[1], walker, element); - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @return {Array.} - */ - function validateText(elementdef, walker, element) { - var /**@type{Node}*/ node = walker.currentNode, - /**@type{number}*/ type = node ? node.nodeType : 0, - error = null; - // find the next element, skip text nodes with only whitespace - while (node !== element && type !== 3) { - if (type === 1) { - return [new RelaxNGParseError( - "Element not allowed here.", node)]; - } - node = walker.nextSibling(); - type = node ? node.nodeType : 0; - } - walker.nextSibling(); - return null; - } - /** - * @param elementdef - * @param walker - * @param {Element} element - * @param {string=} data - * @return {Array.} - */ - validateNonEmptyPattern = function validateNonEmptyPattern(elementdef, - walker, element, data) { - var name = elementdef.name, err = null; - if (name === "text") { - err = validateText(elementdef, walker, element); - } else if (name === "data") { - err = null; // data not implemented - } else if (name === "value") { - if (data !== elementdef.text) { - err = [new RelaxNGParseError("Wrong value, should be '" + - elementdef.text + "', not '" + data + "'", element)]; - } - } else if (name === "list") { - err = null; // list not implemented - } else if (name === "attribute") { - err = validateAttribute(elementdef, walker, element); - } else if (name === "element") { - err = validateElement(elementdef, walker, element); - } else if (name === "oneOrMore") { - err = validateOneOrMore(elementdef, walker, element); - } else if (name === "choice") { - err = validateChoice(elementdef, walker, element, data); - } else if (name === "group") { - err = validateGroup(elementdef, walker, element); - } else if (name === "interleave") { - err = validateInterleave(elementdef, walker, element); - } else { - throw name + " not allowed in nonEmptyPattern."; - } - return err; - }; - /** - * Validate the elements pointed to by the TreeWalker - * @param {!TreeWalker} walker - * @param {!function(Array.):undefined} callback - * @return {undefined} - */ - this.validate = function validate(walker, callback) { - walker.currentNode = walker.root; - var errors = validatePattern(start.e[0], walker, walker.root); - callback(errors); - }; - this.init = function init(start1, nsmap1) { - start = start1; - nsmap = nsmap1; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js deleted file mode 100644 index 12e37278a0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js +++ /dev/null @@ -1,452 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, xmldom: true*/ - -/** - * RelaxNG can check a DOM tree against a Relax NG schema - * The RelaxNG implementation is currently not complete. Relax NG should not - * report errors on valid DOM trees, but it will not check all constraints that - * a Relax NG file can define. The current implementation does not load external - * parts of a Relax NG file. - * The main purpose of this Relax NG engine is to validate runtime ODF - * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker - * implementation can hide parts of a DOM tree. This is useful in WebODF, where - * special elements and attributes in the runtime DOM tree. - * @constructor - */ -xmldom.RelaxNGParser = function RelaxNGParser() { - "use strict"; - var self = this, - rngns = "http://relaxng.org/ns/structure/1.0", - xmlnsns = "http://www.w3.org/2000/xmlns/", - start, - nsmap = { "http://www.w3.org/XML/1998/namespace": "xml" }, - parse; - - /** - * @constructor - * @param {!string} error - * @param {Node=} context - */ - function RelaxNGParseError(error, context) { - /** - * return {!string} - */ - this.message = function () { - if (context) { - error += (context.nodeType === 1) ? " Element " : " Node "; - error += context.nodeName; - if (context.nodeValue) { - error += " with value '" + context.nodeValue + "'"; - } - error += "."; - } - return error; - }; - } - function splitToDuos(e) { - if (e.e.length <= 2) { - return e; - } - var o = { name: e.name, e: e.e.slice(0, 2) }; - return splitToDuos({ - name: e.name, - e: [ o ].concat(e.e.slice(2)) - }); - } - /** - * @param {!string} name - * @return {!Array.} - */ - function splitQName(name) { - var r = name.split(":", 2), - prefix = "", i; - if (r.length === 1) { - r = ["", r[0]]; - } else { - prefix = r[0]; - } - for (i in nsmap) { - if (nsmap[i] === prefix) { - r[0] = i; - } - } - return r; - } - - function splitQNames(def) { - var i, l = (def.names) ? def.names.length : 0, name, - localnames = def.localnames = [l], - namespaces = def.namespaces = [l]; - for (i = 0; i < l; i += 1) { - name = splitQName(def.names[i]); - namespaces[i] = name[0]; - localnames[i] = name[1]; - } - } - - /** - * @param {!string} str - * @return {!string} - */ - function trim(str) { - str = str.replace(/^\s\s*/, ''); - var ws = /\s/, - i = str.length - 1; - while (ws.test(str.charAt(i))) { - i -= 1; - } - return str.slice(0, i + 1); - } - - /** - * @param {!Object.} atts - * @param {!string} name - * @param {!Array.} names - * @return {!Object} - */ - function copyAttributes(atts, name, names) { - var a = {}, i, att; - for (i = 0; i < atts.length; i += 1) { - att = atts.item(i); - if (!att.namespaceURI) { - if (att.localName === "name" && - (name === "element" || name === "attribute")) { - names.push(att.value); - } - if (att.localName === "name" || att.localName === "combine" || - att.localName === "type") { - att.value = trim(att.value); - } - a[att.localName] = att.value; - } else if (att.namespaceURI === xmlnsns) { - nsmap[att.value] = att.localName; - } - } - return a; - } - - function parseChildren(c, e, elements, names) { - var text = "", ce; - while (c) { - if (c.nodeType === 1 && c.namespaceURI === rngns) { - ce = parse(c, elements, e); - if (ce) { - if (ce.name === "name") { - names.push(nsmap[ce.a.ns] + ":" + ce.text); - e.push(ce); - } else if (ce.name === "choice" && ce.names && - ce.names.length) { - names = names.concat(ce.names); - delete ce.names; - e.push(ce); - } else { - e.push(ce); - } - } - } else if (c.nodeType === 3) { - text += c.nodeValue; - } - c = c.nextSibling; - } - return text; - } - - function combineDefines(combine, name, e, siblings) { - // combineDefines is called often enough that there can only be one - // other element with the same name - var i, ce; - for (i = 0; siblings && i < siblings.length; i += 1) { - ce = siblings[i]; - if (ce.name === "define" && ce.a && ce.a.name === name) { - ce.e = [ { name: combine, e: ce.e.concat(e) } ]; - return ce; - } - } - return null; - } - - parse = function parse(element, elements, siblings) { - // parse all elements from the Relax NG namespace into JavaScript - // objects - var e = [], - /**@type{Object}*/a, - ce, - i, text, name = element.localName, names = []; - a = copyAttributes(element.attributes, name, names); - a.combine = a.combine || undefined; - text = parseChildren(element.firstChild, e, elements, names); - - // 4.2 strip leading and trailing whitespace - if (name !== "value" && name !== "param") { - text = /^\s*([\s\S]*\S)?\s*$/.exec(text)[1]; - } - // 4.3 datatypeLibrary attribute - // 4.4 type attribute of value element - if (name === "value" && a.type === undefined) { - a.type = "token"; - a.datatypeLibrary = ""; - } - // 4.5 href attribute - // 4.6 externalRef element - // 4.7 include element - // 4.8 name attribute of element and attribute elements - if ((name === "attribute" || name === "element") && - a.name !== undefined) { - i = splitQName(a.name); - e = [{name: "name", text: i[1], a: {ns: i[0]}}].concat(e); - delete a.name; - } - // 4.9 ns attribute - if (name === "name" || name === "nsName" || name === "value") { - if (a.ns === undefined) { - a.ns = ""; // TODO - } - } else { - delete a.ns; - } - // 4.10 QNames - if (name === "name") { - i = splitQName(text); - a.ns = i[0]; - text = i[1]; - } - // 4.11 div element - // 4.12 Number of child elements - if (e.length > 1 && (name === "define" || name === "oneOrMore" || - name === "zeroOrMore" || name === "optional" || - name === "list" || name === "mixed")) { - e = [{name: "group", e: splitToDuos({name: "group", e: e}).e}]; - } - if (e.length > 2 && name === "element") { - e = [e[0]].concat( - {name: "group", e: splitToDuos( - {name: "group", e: e.slice(1)}).e}); - } - if (e.length === 1 && name === "attribute") { - e.push({name: "text", text: text}); - } - // if node has only one child, replace node with child - if (e.length === 1 && (name === "choice" || name === "group" || - name === "interleave")) { - name = e[0].name; - names = e[0].names; - a = e[0].a; - text = e[0].text; - e = e[0].e; - } else if (e.length > 2 && (name === "choice" || name === "group" || - name === "interleave")) { - e = splitToDuos({name: name, e: e}).e; - } - // 4.13 mixed element - if (name === "mixed") { - name = "interleave"; - e = [ e[0], { name: "text" } ]; - } - // 4.14 optional element - if (name === "optional") { - name = "choice"; - e = [ e[0], { name: "empty" } ]; - } - // 4.15 zeroOrMore element - if (name === "zeroOrMore") { - name = "choice"; - e = [ {name: "oneOrMore", e: [ e[0] ] }, { name: "empty" } ]; - } - // 4.17 combine attribute - if (name === "define" && a.combine) { - ce = combineDefines(a.combine, a.name, e, siblings); - if (ce) { - return; - } - } - - // create the definition - ce = { name: name }; - if (e && e.length > 0) { ce.e = e; } - for (i in a) { - if (a.hasOwnProperty(i)) { - ce.a = a; - break; - } - } - if (text !== undefined) { ce.text = text; } - if (names && names.length > 0) { ce.names = names; } - - // part one of 4.19 - if (name === "element") { - ce.id = elements.length; - elements.push(ce); - ce = { name: "elementref", id: ce.id }; - } - return ce; - }; - - function resolveDefines(def, defines) { - var i = 0, e, defs, end, name = def.name; - while (def.e && i < def.e.length) { - e = def.e[i]; - if (e.name === "ref") { - defs = defines[e.a.name]; - if (!defs) { - throw e.a.name + " was not defined."; - } - end = def.e.slice(i + 1); - def.e = def.e.slice(0, i); - def.e = def.e.concat(defs.e); - def.e = def.e.concat(end); - } else { - i += 1; - resolveDefines(e, defines); - } - } - e = def.e; - // 4.20 notAllowed element - // 4.21 empty element - if (name === "choice") { - if (!e || !e[1] || e[1].name === "empty") { - if (!e || !e[0] || e[0].name === "empty") { - delete def.e; - def.name = "empty"; - } else { - e[1] = e[0]; - e[0] = { name: "empty" }; - } - } - } - if (name === "group" || name === "interleave") { - if (e[0].name === "empty") { - if (e[1].name === "empty") { - delete def.e; - def.name = "empty"; - } else { - name = def.name = e[1].name; - def.names = e[1].names; - e = def.e = e[1].e; - } - } else if (e[1].name === "empty") { - name = def.name = e[0].name; - def.names = e[0].names; - e = def.e = e[0].e; - } - } - if (name === "oneOrMore" && e[0].name === "empty") { - delete def.e; - def.name = "empty"; - } - // for attributes we need to have the list of namespaces and - // localnames readily available, so we split up the qnames - if (name === "attribute") { - splitQNames(def); - } - // for interleaving validation, it is convenient to join all - // interleave elements that touch into one element - if (name === "interleave") { - // at this point the interleave will have two child elements, - // but the child interleave elements may have a different number - if (e[0].name === "interleave") { - if (e[1].name === "interleave") { - e = def.e = e[0].e.concat(e[1].e); - } else { - e = def.e = [e[1]].concat(e[0].e); - } - } else if (e[1].name === "interleave") { - e = def.e = [e[0]].concat(e[1].e); - } - } - } - - function resolveElements(def, elements) { - var i = 0, e, name; - while (def.e && i < def.e.length) { - e = def.e[i]; - if (e.name === "elementref") { - e.id = e.id || 0; - def.e[i] = elements[e.id]; - } else if (e.name !== "element") { - resolveElements(e, elements); - } - i += 1; - } - } - - /** - * @param {!Document} dom - * @param {!Function} callback - * @return {?Array} - */ - function main(dom, callback) { - var elements = [], - grammar = parse(dom && dom.documentElement, elements, undefined), - i, e, defines = {}; - - for (i = 0; i < grammar.e.length; i += 1) { - e = grammar.e[i]; - if (e.name === "define") { - defines[e.a.name] = e; - } else if (e.name === "start") { - start = e; - } - } - if (!start) { - return [new RelaxNGParseError( - "No Relax NG start element was found.")]; - } - resolveDefines(start, defines); - for (i in defines) { - if (defines.hasOwnProperty(i)) { - resolveDefines(defines[i], defines); - } - } - for (i = 0; i < elements.length; i += 1) { - resolveDefines(elements[i], defines); - } - if (callback) { - self.rootPattern = callback(start.e[0], elements); - } - resolveElements(start, elements); - for (i = 0; i < elements.length; i += 1) { - resolveElements(elements[i], elements); - } - self.start = start; - self.elements = elements; - self.nsmap = nsmap; - return null; - } - /** - * @param {!Document} dom - * @param {!Function} callback - * @return {?Array} - */ - this.parseRelaxNGDOM = main; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js deleted file mode 100644 index 28466c2184..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js +++ /dev/null @@ -1,383 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global xmldom, XPathResult, runtime*/ -/** - * Wrapper for XPath functions - * @constructor - */ -xmldom.XPath = (function () { - "use strict"; - var createXPathPathIterator, - parsePredicates; - /** - * @param {!number} a - * @param {!number} b - * @param {!number} c - * @return {!boolean} - */ - function isSmallestPositive(a, b, c) { - return a !== -1 && (a < b || b === -1) && (a < c || c === -1); - } - /** - * Parse a subset of xpaths. - * The xpath predicates may contain xpaths. The location may be equated to - * a value. If a parsing error occurs, null is returned. - * @param {!string} xpath - * @param {!number} pos - * @param {!number} end - * @param {!Array} steps - * @return {!number} - */ - function parseXPathStep(xpath, pos, end, steps) { - var location = "", - predicates = [], - value, - brapos = xpath.indexOf('[', pos), - slapos = xpath.indexOf('/', pos), - eqpos = xpath.indexOf('=', pos), - depth = 0, - start = 0; - // parse the location - if (isSmallestPositive(slapos, brapos, eqpos)) { - location = xpath.substring(pos, slapos); - pos = slapos + 1; - } else if (isSmallestPositive(brapos, slapos, eqpos)) { - location = xpath.substring(pos, brapos); - pos = parsePredicates(xpath, brapos, predicates); - } else if (isSmallestPositive(eqpos, slapos, brapos)) { - location = xpath.substring(pos, eqpos); - pos = eqpos; - } else { - location = xpath.substring(pos, end); - pos = end; - } - steps.push({location: location, predicates: predicates}); - return pos; - } - function parseXPath(xpath) { - var steps = [], - p = 0, - end = xpath.length, - value; - while (p < end) { - p = parseXPathStep(xpath, p, end, steps); - if (p < end && xpath[p] === '=') { - value = xpath.substring(p + 1, end); - if (value.length > 2 && - (value[0] === '\'' || value[0] === '"')) { - value = value.slice(1, value.length - 1); - } else { - try { - value = parseInt(value, 10); - } catch (e) { - } - } - p = end; - } - } - return {steps: steps, value: value}; - } - parsePredicates = function parsePredicates(xpath, start, predicates) { - var pos = start, - l = xpath.length, - selector, - depth = 0; - while (pos < l) { - if (xpath[pos] === ']') { - depth -= 1; - if (depth <= 0) { - predicates.push(parseXPath(xpath.substring(start, pos))); - } - } else if (xpath[pos] === '[') { - if (depth <= 0) { - start = pos + 1; - } - depth += 1; - } - pos += 1; - } - return pos; - }; - /** - * Iterator over nodes uses in the xpath implementation - * @class - * @interface - */ - function XPathIterator() {} - /** - * @return {Node} - */ - XPathIterator.prototype.next = function () {}; - /** - * @return {undefined} - */ - XPathIterator.prototype.reset = function () {}; - /** - * @class - * @constructor - * @augments XPathIterator - * @implements {XPathIterator} - */ - function NodeIterator() { - var node, done = false; - this.setNode = function setNode(n) { - node = n; - }; - this.reset = function () { - done = false; - }; - this.next = function next() { - var val = (done) ? null : node; - done = true; - return val; - }; - } - /** - * @class - * @constructor - * @augments XPathIterator - * @implements {XPathIterator} - * @param {XPathIterator} it - * @param {!string} namespace - * @param {!string} localName - */ - function AttributeIterator(it, namespace, localName) { - this.reset = function reset() { - it.reset(); - }; - this.next = function next() { - var node = it.next(), attr; - while (node) { - node = node.getAttributeNodeNS(namespace, localName); - if (node) { - return node; - } - node = it.next(); - } - return node; - }; - } - /** - * @class - * @constructor - * @augments XPathIterator - * @implements {XPathIterator} - * @param {XPathIterator} it - * @param {boolean} recurse - */ - function AllChildElementIterator(it, recurse) { - var root = it.next(), - node = null; - this.reset = function reset() { - it.reset(); - root = it.next(); - node = null; - }; - this.next = function next() { - while (root) { - if (node) { - if (recurse && node.firstChild) { - node = node.firstChild; - } else { - while (!node.nextSibling && node !== root) { - node = node.parentNode; - } - if (node === root) { - root = it.next(); - } else { - node = node.nextSibling; - } - } - } else { - do { -// node = (recurse) ?root :root.firstChild; - node = root.firstChild; - if (!node) { - root = it.next(); - } - } while (root && !node); - } - if (node && node.nodeType === 1) { - return node; - } - } - return null; - }; - } - /** - * @class - * @constructor - * @augments XPathIterator - * @implements {XPathIterator} - * @param {XPathIterator} it - * @param {function(Node):boolean} condition - */ - function ConditionIterator(it, condition) { - this.reset = function reset() { - it.reset(); - }; - this.next = function next() { - var n = it.next(); - while (n && !condition(n)) { - n = it.next(); - } - return n; - }; - } - /** - * @param {XPathIterator} it - * @param {string} name - * @param {function(string):string} namespaceResolver - * @return {!ConditionIterator} - */ - function createNodenameFilter(it, name, namespaceResolver) { - var s = name.split(':', 2), - namespace = namespaceResolver(s[0]), - localName = s[1]; - return new ConditionIterator(it, function (node) { - return node.localName === localName && - node.namespaceURI === namespace; - }); - } - /** - * @param {XPathIterator} it - * @param {!Object} p - * @param {function(string):string} namespaceResolver - * @return {!ConditionIterator} - */ - function createPredicateFilteredIterator(it, p, namespaceResolver) { - var nit = new NodeIterator(), - pit = createXPathPathIterator(nit, p, namespaceResolver), - value = p.value; - if (value === undefined) { - return new ConditionIterator(it, function (node) { - nit.setNode(node); - pit.reset(); - return pit.next(); - }); - } - return new ConditionIterator(it, function (node) { - nit.setNode(node); - pit.reset(); - var n = pit.next(); - // todo: distinuish between number and string - return n && n.nodeValue === value; - }); - } - /** - * @param {!XPathIterator} it - * @param {!Object} xpath - * @param {!Function} namespaceResolver - * @return {!XPathIterator} - */ - createXPathPathIterator = function createXPathPathIterator(it, xpath, - namespaceResolver) { - var i, j, step, location, namespace, localName, prefix, p; - for (i = 0; i < xpath.steps.length; i += 1) { - step = xpath.steps[i]; - location = step.location; - if (location === "") { - it = new AllChildElementIterator(it, false); - } else if (location[0] === '@') { - p = location.slice(1).split(":", 2); - it = new AttributeIterator(it, namespaceResolver(p[0]), p[1]); - } else if (location !== ".") { - it = new AllChildElementIterator(it, false); - if (location.indexOf(":") !== -1) { - it = createNodenameFilter(it, location, namespaceResolver); - } - } - for (j = 0; j < step.predicates.length; j += 1) { - p = step.predicates[j]; - it = createPredicateFilteredIterator(it, p, namespaceResolver); - } - } - return it; - }; - /** - * @param {!Element} node - * @param {!string} xpath - * @param {!Function} namespaceResolver - * @return {!Array.} - */ - function fallback(node, xpath, namespaceResolver) { - var it = new NodeIterator(), - i, - nodelist, - parsedXPath, - pos; - it.setNode(node); - parsedXPath = parseXPath(xpath); - it = createXPathPathIterator(it, parsedXPath, namespaceResolver); - nodelist = []; - i = it.next(); - while (i) { - nodelist.push(i); - i = it.next(); - } - return nodelist; - } - /** - * @param {!Element} node - * @param {!string} xpath - * @param {!Function} namespaceResolver - * @return {!Array.} - */ - function getODFElementsWithXPath(node, xpath, namespaceResolver) { - var doc = node.ownerDocument, - nodes, - elements = [], - n = null; - if (!doc || !doc.evaluate || !n) { - elements = fallback(node, xpath, namespaceResolver); - } else { - nodes = doc.evaluate(xpath, node, namespaceResolver, - XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); - n = nodes.iterateNext(); - while (n !== null) { - if (n.nodeType === 1) { - elements.push(n); - } - n = nodes.iterateNext(); - } - } - return elements; - } - /** - * @constructor - */ - xmldom.XPath = function XPath() { - this.getODFElementsWithXPath = getODFElementsWithXPath; - }; - return xmldom.XPath; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html b/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html deleted file mode 100644 index fc7f84c926..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html b/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html deleted file mode 100644 index d758237f39..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html b/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html deleted file mode 100644 index 28ff15889b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - -

    - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js b/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js deleted file mode 100644 index bd57807bf5..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime core*/ -runtime.loadClass("core.Zip"); -runtime.loadClass("core.Async"); - -var async = new core.Async(); - -/** - * @param {!core.Zip.ZipEntry} entry - * @param {!core.Zip} zip - * @param {function(?string):undefined} callback - * @return {undefined} - */ -function copyEntry(entry, zip, callback) { - entry.load(function (err, data) { - if (err) { - callback(err); - } else { - zip.save(entry.filename, data, false, entry.date); - callback(null); - } - }); -} - -/** - * @param {!core.Zip} zipa - * @param {!core.Zip} zipb - * @param {function(?string):undefined} callback - * @return {undefined} - */ -function compareZips(zipa, zipb, callback) { - var entriesa = zipa.getEntries(), - l = entriesa.length, - entriesb = zipb.getEntries(), - i, - j, - entrya, - entryb; - // compare the number of entries - if (entriesb.length !== l) { - callback("Number of entries is not equal."); - return; - } - // compare the meta data of the entries - for (i = 0; i < l; i += 1) { - entrya = entriesa[i]; - for (j = 0; j < l; j += 1) { - entryb = entriesb[j]; - if (entrya.filename === entryb.filename) { - break; - } - } - if (j === l) { - callback("Entry " + entrya.filename + " is not present in the " + - "second zip file."); - return; - } - if (entrya.date.valueOf() !== entryb.date.valueOf()) { - callback("Dates for entry " + entrya.filename + " is not equal: " + - entrya.date + " vs " + entryb.date); - return; - } - } - // compare the data in the entries - async.forEach(entriesa, function (entry, callback) { - entry.load(function (err, dataa) { - if (err) { - callback(err); - return; - } - zipb.load(entry.filename, function (err, datab) { - if (err) { - callback(err); - return; - } - var i = 0, l = dataa.length; - if (dataa !== datab) { - for (i = 0; i < l && dataa[i] === datab[i];) { - i += 1; - } - callback("Data is not equal for " + entry.filename + - " at position " + i + ": " + dataa.charCodeAt(i) + - " vs " + datab.charCodeAt(i) + "."); - } else { - callback(null); - } - }); - }); - }, function (err) { - callback(err); - }); -} - -function testZip(filepatha, callback) { - var zipa = new core.Zip(filepatha, function (err, zipa) { - if (err) { - runtime.log(err); - runtime.exit(1); - return; - } - // open a new zip file and copy all entries from zipa to zipb - var filepathb = "tmp323.zip", - zipb = new core.Zip(filepathb, null), - entries = zipa.getEntries(), - i, - entriesDone = 0; - async.forEach(entries, function (entry, callback) { - copyEntry(entry, zipb, callback); - }, function (err) { - if (err) { - callback(err); - return; - } - zipb.write(function (err) { - if (err) { - callback(err); - return; - } - zipb = new core.Zip(filepathb, function (err, zipb) { - if (err) { - callback(err); - return; - } - compareZips(zipa, zipb, callback); - }); - }); - }); - }); -} - -var args = arguments; -// open the arguments one by one, save them to a file, then open again and see -// if the contents matches -function doit(i) { - if (i >= args.length) { - return; - } - testZip(args[i], function (err) { - runtime.log(args[i]); - if (err) { - runtime.log(err); - return; - } - i += 1; - if (i < args.length) { - doit(i); - } - }); -} -doit(1); diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip b/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip deleted file mode 100644 index 69a14abc26..0000000000 Binary files a/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/webodf/notes b/apps/files_odfviewer/src/webodf/webodf/notes deleted file mode 100644 index f21a7c3fdd..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/notes +++ /dev/null @@ -1,137 +0,0 @@ -XMLModel: - - list of all possible QNames - - list of valid attributes for each QName - - node walker positions - - knowledge about where whitespace is meaningfull - - - - -xmledit - - receives mouse and keyboard events - - simple editing - - inputs that might be interpreted higher up - -Tools: - -Features we want: - - ability to run code from Rhine, Node.JS and browsers - - type checking - - sanity checking - - javascript compilation - - unit tests - - unit test code coverage - - -Closure seems a nice compiler. It should be optional. -Unit testing should be as simple as doing a reload in a browser or calling a single command from the command-line. - -The only fundamental problem is the method of resolving dependencies. Closure does not understand require() commands that load modules. However, Node.JS needs this command to load modules. - -If require("mypackage.MyClass") would return just the class if it was already loaded, that would be perfect. Using eval() would solve this: - function require(module) { - var m; - try { - m = eval(module); - } catch (e) { - } - if (m === undefined) { - // load the module - } - } - -But then how to adapt the code in the modules themselves? Currenlty, no global objects are defined, but symbols are added to the exports variable. -Suppose that ideal javascript modules each define one class, then the code for class a.b.Class would be stored in the file a/b/Class.js and would look like this: -==== -a.b.Class = function () { -}; -==== -If this code should be loaded as a module, it should be executed with eval(). The environment in which the code is executed should already have 'package' a.b. - -function runModuleCode(modulename, code) { - var names = modulename.split("."), - evalcode; - if (!eval("typeof " + names[0] + " === 'undefined'")) { - } - evalcode = "if (typeof " + names[0] + " === 'undefined') {" + - - if -} - -function loadClass(modulename) { - // test if class already exists - var names = modulename.split("."), - evalcode, constructor; - evalcode = "(typeof " + names[0] + " !== 'undefined' ") - - -var code = ""; -if (typeof a === "undefined") { - code = code + "var a = {};"; - if (!eval( - - -Node does not have global context in eval() it seems. - - - -Running unit tests should be possible in a number of ways: - - single tests in - * browser - * browser with code coverage - * browser from js compiled with Closure Compiler - * node.js - * rhino - - - - ---- - - -Caret should work like a cursor. -It should use the contentEditable property to advance the cursor within one text node. - -Isn't the current cursor sufficient? All that is missing is to use the native display when it is a text node. - -Using the contentEditable means that the cursor code can be simplified quite a bit if you want to - - -If the caret is in a text node, moving should be done by passing a move signal to the system. -After the move it should be checked if the move made sense, i.e. if the caret is in an allowed position. If it is not, the position should be corrected manually. - -Determining if a caret is in a legal position is done with a special class. - -The current players: - - core.Cursor : insert a caret in the text if the selection calls for it - - gui.XMLEdit : - - ...: moving of the cursor, taking into account skipping over/ignoring the cursor itself and also taking into account that the caret in an editable text must be moved by the browser - -move the cursor in a simple document with a wrapped text - - -Contenteditable is perhaps not strictly necessary. It does not work well across browsers anyway. The only reason to use it would be to have a nice way to move the cursor up or down a line. - -To move the cursor or selection, a special class is needed for determining how to modify the selection upon different inputs. The visualization of the cursor is handled by the cursor class. - -stepForward -stepBackward -setPoint - ----- - -Cursor and selection: - - cursor is foreign element of height but with no width - - handle mouse event to move or place the cursor at the right position - - handle key events to move the cursor - -webkit has nice functions for manipulating the selection -selection/cursor position is the 'real' thing, the cursor (visible or not) is just the visualization - -The cursor must appear invisible to the normal dom functions, this is tricky because a cursor may split a text. This is however a separate concern. - -So there should be an event handler that translates mouse and key events into api calls. There already is moving of the cursor/selection on mouse events in Firefox and WebKit so only keyboard events need to be handled. So core.Cursor.updateToSelection should work ok for mouse events. - -Should we re-evaluate the use of JQuery? NO! first add editing functions to WebODF. - -So current top priorities: moving the cursor and saving. -And not in the general xml editor, but in the odf editor. diff --git a/apps/files_odfviewer/src/webodf/webodf/odf.html b/apps/files_odfviewer/src/webodf/webodf/odf.html deleted file mode 100644 index 3abbf96ff7..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/odf.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - -
    - - diff --git a/apps/files_odfviewer/src/webodf/webodf/odfedit.html b/apps/files_odfviewer/src/webodf/webodf/odfedit.html deleted file mode 100644 index d4a5b53870..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/odfedit.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - WebODF - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/odfedit.js b/apps/files_odfviewer/src/webodf/webodf/odfedit.js deleted file mode 100644 index 6dfc1cddac..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/odfedit.js +++ /dev/null @@ -1,314 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, document: true, odf: true, window: true, Ext: true*/ -/** - * @type {odf.OdfCanvas} - */ -var odfcanvas; - -/** - * @return {undefined} - */ -function fixExtJSCSS() { - "use strict"; - // look through all stylesheets to change the selector - // ".x-viewport, .x-viewport body" - // to - // ".x-viewport, .x-viewport > body" - // The normal selector os not specific enough, office|body is also affected - // by it. To avoid this, the selector is changed so that is only applies to - // a director parent child relationship with '>' - var i, cssRules, j, rule; - for (i = 0; i < document.styleSheets.length; i += 1) { - cssRules = document.styleSheets[i].cssRules; - for (j = 0; j < cssRules.length; j += 1) { - rule = cssRules[j]; - if (rule.selectorText === ".x-viewport, .x-viewport body") { - rule = rule.cssText.replace(".x-viewport, .x-viewport body", - ".x-viewport, .x-viewport > body"); - document.styleSheets[i].deleteRule(j); - document.styleSheets[i].insertRule(rule, j); - return; - } - } - } -} -/** - * @return {undefined} - */ -function updateStyleComboBox() { - "use strict"; - var paragraphStylesBox = document.getElementById("paragraphStyleBox"); -} -/** - * @param {!Element} odfelement - * @return {undefined} - */ -function initCanvas(odfelement) { - "use strict"; - runtime.loadClass("odf.OdfCanvas"); - // if the url has a fragment (#...), try to load the file it represents - var location = String(document.location), - pos = location.indexOf('#'); -// odfelement.style.overflow = 'auto'; - odfelement.style.height = '100%'; - odfcanvas = new odf.OdfCanvas(odfelement); - if (pos === -1 || !window) { - return; - } - location = location.substr(pos + 1); - odfcanvas.onstatereadychange = function () { - /* - updateStyleComboBox(); - odfcanvas.save(function (err) { - alert(err); - }); - */ - }; - odfcanvas.load(location); - odfcanvas.addListener("selectionchange", function (element, selection) { - var formatting = odfcanvas.getFormatting(), - completelyBold = formatting.isCompletelyBold(selection), - alignment = formatting.getAlignment(selection); - runtime.log("selection changed " + completelyBold + " " + alignment); - }); -} -/** - * @return {undefined} - */ -function save() { - "use strict"; - odfcanvas.odfContainer().save(function (err) { - if (err) { - runtime.log(err); - } - }); -} -Ext.ODFEditor = Ext.extend(Ext.component.Component, { - buttonTips : { - bold : { - title: 'Bold (Ctrl+B)', - text: 'Make the selected text bold.', - cls: 'x-html-editor-tip' - }, - italic : { - title: 'Italic (Ctrl+I)', - text: 'Make the selected text italic.', - cls: 'x-html-editor-tip' - }, - underline : { - title: 'Underline (Ctrl+U)', - text: 'Underline the selected text.', - cls: 'x-html-editor-tip' - }, - increasefontsize : { - title: 'Grow Text', - text: 'Increase the font size.', - cls: 'x-html-editor-tip' - }, - decreasefontsize : { - title: 'Shrink Text', - text: 'Decrease the font size.', - cls: 'x-html-editor-tip' - }, - backcolor : { - title: 'Text Highlight Color', - text: 'Change the background color of the selected text.', - cls: 'x-html-editor-tip' - }, - forecolor : { - title: 'Font Color', - text: 'Change the color of the selected text.', - cls: 'x-html-editor-tip' - }, - justifyleft : { - title: 'Align Text Left', - text: 'Align text to the left.', - cls: 'x-html-editor-tip' - }, - justifycenter : { - title: 'Center Text', - text: 'Center text in the editor.', - cls: 'x-html-editor-tip' - }, - justifyright : { - title: 'Align Text Right', - text: 'Align text to the right.', - cls: 'x-html-editor-tip' - }, - insertunorderedlist : { - title: 'Bullet List', - text: 'Start a bulleted list.', - cls: 'x-html-editor-tip' - }, - insertorderedlist : { - title: 'Numbered List', - text: 'Start a numbered list.', - cls: 'x-html-editor-tip' - }, - createlink : { - title: 'Hyperlink', - text: 'Make the selected text a hyperlink.', - cls: 'x-html-editor-tip' - }, - sourceedit : { - title: 'Source Edit', - text: 'Switch to source editing mode.', - cls: 'x-html-editor-tip' - }, - save : { - title: 'Save (Ctrl+S)', - text: 'Save the document.', - cls: 'x-html-editor-tip' - } - } -}); - - -var ODFEditor = Ext.extend(Ext.Panel, { - initComponent: function () { - "use strict"; - var me = this, - statusMessage = new Ext.Toolbar.TextItem(''); - function buttonHandler(button, event) { - } - me.defaults = { - }; - me.initialConfig = Ext.apply({ - }, me.initialConfig); - me.items = [{ - xtype: 'box', - id: 'canvas', - autoEl: { - tag: 'div', - frameBorder: 0, - style: { - border: '0 none' - } - }, - autoScroll: true, - scroll: true - }]; - me.tbar = { - xtype: 'toolbar', - items: [{ - xtype: 'button', - icon: 'extjs/examples/shared/icons/save.gif', - handler: buttonHandler, - cls: 'x-btn-icon' - }, { - xtype: 'tbseparator' - }, { - tag: 'select', - //html: this.createFontOptions() - cls: 'x-font-select' - }, { - xtype: 'buttongroup', - cls: 'x-html-editor-tb', - frame: false, - items: [{ - xtype: 'button', - iconCls: 'x-edit-bold', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-italic', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-underline', - cls: 'x-btn-icon' - }, { - itemId: 'forecolor', - cls: 'x-btn-icon', - iconCls: 'x-edit-forecolor', - menu: { xtype: 'colormenu' } - }, { - itemId: 'backcolor', - cls: 'x-btn-icon', - iconCls: 'x-edit-backcolor', - menu: { xtype: 'colormenu' } - }, { - xtype: 'button', - iconCls: 'x-edit-justifyleft', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-justifycenter', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-justifyright', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-insertorderedlist', - cls: 'x-btn-icon' - }, { - xtype: 'button', - iconCls: 'x-edit-insertunorderedlist', - cls: 'x-btn-icon' - }] - }, { - xtype: 'tbfill' - }, - statusMessage - ] - }; -/* - me.bbar = { - xtype: 'toolbar', - items: [ {xtype: "tbfill" }, statusMessage ] - }; -*/ - ODFEditor.superclass.initComponent.call(this); - } -}); -Ext.onReady(function () { - "use strict"; - var canvas, viewport; - - Ext.QuickTips.init(); - - canvas = new ODFEditor({ - region: 'center' - }); - - viewport = new Ext.Viewport({ - layout: 'border', - items: [ canvas ] - }); - - fixExtJSCSS(); - initCanvas(Ext.getCmp('canvas').el.dom); -}); diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js b/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js deleted file mode 100644 index 064fe61b79..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js +++ /dev/null @@ -1,463 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, xmldom: true*/ -runtime.loadClass("xmldom.RelaxNGParser"); - -var nsmap = { - "http://purl.org/dc/elements/1.1/": "purl", - "http://www.w3.org/1998/Math/MathML": "mathml", - "http://www.w3.org/1999/xhtml": "xhtml", - "http://www.w3.org/1999/xlink": "xlink", - "http://www.w3.org/2002/xforms": "xforms", - "http://www.w3.org/2003/g/data-view#": "dv", - "http://www.w3.org/XML/1998/namespace": "xmlns", - "urn:oasis:names:tc:opendocument:xmlns:animation:1.0": "animation", - "urn:oasis:names:tc:opendocument:xmlns:chart:1.0": "chart", - "urn:oasis:names:tc:opendocument:xmlns:config:1.0": "config", - "urn:oasis:names:tc:opendocument:xmlns:database:1.0": "database", - "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0": "datastyle", - "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0": "dr3d", - "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0": "drawing", - "urn:oasis:names:tc:opendocument:xmlns:form:1.0": "form", - "urn:oasis:names:tc:opendocument:xmlns:meta:1.0": "meta", - "urn:oasis:names:tc:opendocument:xmlns:office:1.0": "office", - "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0": "presentation", - "urn:oasis:names:tc:opendocument:xmlns:script:1.0": "script", - "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0": "smilc", - "urn:oasis:names:tc:opendocument:xmlns:style:1.0": "style", - "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0": "svgc", - "urn:oasis:names:tc:opendocument:xmlns:table:1.0": "table", - "urn:oasis:names:tc:opendocument:xmlns:text:1.0": "text", - "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0": "xslfoc" - }, - typemap = { - "string": "const QString&", - "NCName": "const QString&", - "date": "const QString&", - "time": "const QString&", - "dateTime": "const QString&", - "duration": "const QString&", - "anyURI": "const QString&", - "ID": "const QString&", - "IDREF": "const QString&", - "IDREFS": "const QString&", - "QName": "const QString&", - "token": "const QString&", - "language": "const QString&", - "positiveInteger": "quint32", - "nonNegativeInteger": "quint32", - "integer": "qint32", - "decimal": "double" - }, - args = arguments, - relaxngurl = args[1], - parser = new xmldom.RelaxNGParser(relaxngurl); - -function out(string) { - "use strict"; - runtime.log(string); -} -function toCamelCase(s) { - "use strict"; - var str = "", i, up = true; - for (i = 0; i < s.length; i += 1) { - if (up) { - str += s.substr(i, 1).toUpperCase(); - } else { - str += s.substr(i, 1); - } - up = false; - while (/\W/.test(s.substr(i + 1, 1))) { - up = true; - i += 1; - } - } - return str; -} -function getName(e) { - "use strict"; - return toCamelCase(nsmap[e.a.ns]) + toCamelCase(e.text); -} -function getNames(e, names) { - "use strict"; - if (e.name === "name") { - names.push(e); - } else if (e.name === "choice") { - getNames(e.e[0], names); - getNames(e.e[1], names); - } -} -function parseAttributes(e, att) { - "use strict"; - var i, name; - if (e.name === "choice" || e.name === "interleave" - || e.name === "group") { - for (i = 0; i < e.e.length; i += 1) { - parseAttributes(e.e[i], att); - } - } else if (e.name === "value") { - att.values.push(e.text); - } else if (e.name === "data") { - att.types.push(e.a.type); - } else if (e.name === "list") { - name = null; // todo - } else if (e.name === "empty") { - att.empty = true; - } else { - runtime.log("OOPS " + e.name); - throw null; - } -} -function writeAttributeSetter(name, type, a) { - "use strict"; - var i, s = ""; - out(" /**"); - if (a.optional) { - out(" * Set optional attribute " + a.nsname + "."); - } else { - out(" * Set required attribute " + a.nsname + "."); - } - if (a.values.length > 0) { - s = "Choose one of these values: '" + a.values[0] + "'"; - for (i = 1; i < a.values.length; i += 1) { - s += ", '" + a.values[i] + "'"; - } - out(" * " + s + "."); - } - out(" */"); - out(" inline void write" + name + "(" + type + " value) {"); - out(" xml->addAttribute(\"" + a.nsname + "\", value);"); - out(" }"); -} -function writeAttribute(name, a) { - "use strict"; - if (!a.optional) { - return; - } - var i, type, done = {}, needfallback = true; - for (i = 0; i < a.types.length; i += 1) { - needfallback = false; - type = typemap[a.types[i]] || a.types[i]; - if (!done.hasOwnProperty(type)) { - done[type] = 1; - writeAttributeSetter(name, type, a); - } - } - if (a.values.indexOf("true") !== -1 && a.values.indexOf("false") !== -1 && - done.hasOwnProperty("bool")) { - needfallback = false; - writeAttributeSetter(name, "bool", a); - } - if (needfallback) { - writeAttributeSetter(name, "const QString&", a); - } -} -function writeOptionalAttributes(atts) { - "use strict"; - var name; - for (name in atts) { - if (atts.hasOwnProperty(name)) { - writeAttribute(name, atts[name]); - } - } -} -function writeFixedRequiredAttributes(atts) { - "use strict"; - var name, a; - for (name in atts) { - if (atts.hasOwnProperty(name)) { - a = atts[name]; - if (!a.optional && a.types.length === 0 && a.values.length === 1) { - out(" xml->addAttribute(\"" + a.nsname + "\", \"" + - a.values[0] + "\");"); - } - } - } -} -function getRequiredAttributeArguments(atts) { - "use strict"; - var name, a, s = "", type; - for (name in atts) { - if (atts.hasOwnProperty(name)) { - a = atts[name]; - if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { - type = typemap[a.types[0]] || a.types[0] || "const QString&"; - if (s) { - s += ", "; - } - s += type + " " + name.toLowerCase(); - } - } - } - return s; -} -function getRequiredAttributeCall(atts) { - "use strict"; - var name, a, s = ""; - for (name in atts) { - if (atts.hasOwnProperty(name)) { - a = atts[name]; - if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { - if (s) { - s += ", "; - } - s += name.toLowerCase(); - } - } - } - return s; -} -function writeRequiredAttributesSetters(atts) { - "use strict"; - var name, a; - for (name in atts) { - if (atts.hasOwnProperty(name)) { - a = atts[name]; - if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { - out(" xml->addAttribute(\"" + a.nsname + "\", " + - name.toLowerCase() + ");"); - } - } - } -} -function writeMembers(e, atts, optional) { - "use strict"; - var ne, nsname, i, name, names; - if (e.name === "element") { - name = null; - } else if (e.name === "attribute") { - names = []; - getNames(e.e[0], names); - for (i = 0; i < names.length; i += 1) { - ne = names[i]; - name = getName(ne); - if (!atts.hasOwnProperty(name)) { - nsname = nsmap[ne.a.ns] + ":" + ne.text; - atts[name] = { - nsname: nsname, - values: [], - types: [], - optional: optional, - empty: false - }; - } - parseAttributes(e.e[1], atts[name]); - } - } else if (e.name === "choice") { - for (i = 0; i < e.e.length; i += 1) { - writeMembers(e.e[i], atts, true); - } - } else if (e.name === "interleave" || e.name === "group") { - for (i = 0; i < e.e.length; i += 1) { - writeMembers(e.e[i], atts, optional); - } - } else if (e.name === "oneOrMore") { - writeMembers(e.e[0], atts, optional); - } else if (e.name === "value") { - name = null; // todo - } else if (e.name === "data") { - name = null; // todo - } else if (e.name === "text") { - out(" void addTextNode(const QString& str) { xml->addTextNode(str); }"); - } else if (e.name === "empty") { - name = null; // todo - } else { - runtime.log("OOPS " + e.name); - throw null; - } -} -function defineClass(e, parents, children) { - "use strict"; - var c, p, i, - ne = e.e[0], - nsname = nsmap[ne.a.ns] + ":" + ne.text, - name = ne.cppname, atts = {}; - out("/**"); - out(" * Serialize a <" + nsname + "> element."); - out(" */"); - out("class " + name + "Writer {"); - for (c in children) { - if (children.hasOwnProperty(c) && c !== name) { - out("friend class " + c + "Writer;"); - } - } - out("public:"); - writeMembers(e.e[1], atts, false); - writeOptionalAttributes(atts); - e.requiredAttributes = getRequiredAttributeArguments(atts); - e.requiredAttributeCall = getRequiredAttributeCall(atts); - out("private:"); - out(" inline void start(" + e.requiredAttributes + ") {"); - out(" xml->startElement(\"" + nsname + "\");"); - if (e.requiredAttributes) { - e.requiredAttributes = ", " + e.requiredAttributes; - } - writeFixedRequiredAttributes(atts); - writeRequiredAttributesSetters(atts); - out(" }"); - out("public:"); - out(" KoXmlWriter* const xml;"); - for (p in parents) { - if (parents.hasOwnProperty(p)) { - out(" inline explicit " + name + "Writer(const " + p + - "Writer& p" + e.requiredAttributes + ");"); - } - } - out(" inline explicit " + name + "Writer(KoXmlWriter* xml_" + - e.requiredAttributes + - ") :xml(xml_) { start(" + e.requiredAttributeCall + "); }"); - out(" void end() { xml->endElement(); }"); - out(" void operator=(const " + name + "Writer&) { }"); - out("};"); -} -function defineConstructors(e, parents) { - "use strict"; - var p, - ne = e.e[0], - nsname = nsmap[ne.a.ns] + ":" + ne.text, - name = ne.cppname; - for (p in parents) { - if (parents.hasOwnProperty(p)) { - out(name + "Writer::" + name + "Writer(const " + p + - "Writer& p" + e.requiredAttributes + - ") :xml(p.xml) { start(" + e.requiredAttributeCall + "); }"); - } - } -} -function getChildren(e, children) { - "use strict"; - var name, i, names; - if (e.name === "element") { - names = []; - getNames(e.e[0], names); - for (i = 0; i < names.length; i += 1) { - children[names[i].cppname] = 1; - } - } else if (e.name === "choice" || e.name === "interleave" - || e.name === "group") { - for (i = 0; i < e.e.length; i += 1) { - getChildren(e.e[i], children); - } - } else if (e.name === "oneOrMore") { - getChildren(e.e[0], children); - } else if (e.name === "attribute" || e.name === "value" || - e.name === "data" || e.name === "text" || e.name === "empty") { - name = null; // ignore - } else { - runtime.log("OOPS " + e.name); - throw null; - } -} -function childrenToParents(childrenmap) { - "use strict"; - var p, children, c, parents = {}; - for (p in childrenmap) { - if (childrenmap.hasOwnProperty(p)) { - children = childrenmap[p]; - for (c in children) { - if (children.hasOwnProperty(c)) { - if (!parents.hasOwnProperty(c)) { - parents[c] = {}; - } - parents[c][p] = 1; - } - } - } - } - return parents; -} -function toCPP(elements) { - "use strict"; - out("#include "); - - // first get a mapping for all the parents - var children = {}, parents = {}, i, j, ce, ec, name, names, c, - elementMap = {}, sortedElementNames = []; - for (i = 0; i < elements.length; i += 1) { - ce = elements[i]; - if (ce.name !== "element") { - runtime.log("Error in parsed data."); - return; - } - names = []; - getNames(ce.e[0], names); - for (j = 0; j < names.length; j += 1) { - name = getName(names[j]); - while (elementMap.hasOwnProperty(name)) { - name = name + "_"; - } - names[j].cppname = name; - ec = {e: [names[j], ce.e[1]]}; - elementMap[name] = ec; - sortedElementNames.push(name); - } - } - sortedElementNames.sort(); - - for (i = 0; i < sortedElementNames.length; i += 1) { - name = sortedElementNames[i]; - c = {}; - getChildren(elementMap[name].e[1], c); - children[name] = c; - } - parents = childrenToParents(children); - - for (i = 0; i < sortedElementNames.length; i += 1) { - name = sortedElementNames[i]; - out("class " + name + "Writer;"); - } - for (i = 0; i < sortedElementNames.length; i += 1) { - name = sortedElementNames[i]; - defineClass(elementMap[name], parents[name], children[name]); - } - for (i = 0; i < sortedElementNames.length; i += 1) { - name = sortedElementNames[i]; - defineConstructors(elementMap[name], parents[name]); - } -} - -// load and parse the Relax NG -runtime.loadXML(relaxngurl, function (err, dom) { - "use strict"; - var parser = new xmldom.RelaxNGParser(); - if (err) { - runtime.log(err); - } else { - err = parser.parseRelaxNGDOM(dom); - if (err) { - runtime.log(err); - } else { - toCPP(parser.elements); - } - } -}); diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng deleted file mode 100644 index 0c4e4baa8d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml deleted file mode 100644 index 71712e11e5..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng deleted file mode 100644 index ed37e255fd..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - NamespaceTable - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - chart - - - - - - - - table - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml deleted file mode 100644 index 7e70255ed4..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng deleted file mode 100644 index 8803f52898..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml deleted file mode 100644 index a6255e802e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - hello - - hi - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng deleted file mode 100644 index 511b297efa..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - 1.2 - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml deleted file mode 100644 index 21ceee55b1..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng deleted file mode 100644 index c0c73052f2..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml deleted file mode 100644 index 38cb418bde..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng deleted file mode 100644 index c744850f98..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml deleted file mode 100644 index a9c24656ea..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - hello - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng deleted file mode 100644 index fb37cf8275..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - short - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml deleted file mode 100644 index a5361bf155..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - true - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng deleted file mode 100644 index 82c2de66c5..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - boolean - string - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml deleted file mode 100644 index 71af08046c..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng deleted file mode 100644 index 1726996897..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml deleted file mode 100644 index a54dd99e4b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng deleted file mode 100644 index 5e271a4389..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml deleted file mode 100644 index f4087a8976..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng deleted file mode 100644 index 2df604b5b8..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml deleted file mode 100644 index d272fd4e3e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng deleted file mode 100644 index a0e79a356e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml deleted file mode 100644 index a3f2a5d725..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng deleted file mode 100644 index 47a2161ed9..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml deleted file mode 100644 index 8f46daa4ce..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng deleted file mode 100644 index 61a8c9e2b4..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - table - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml deleted file mode 100644 index 6c16a1d614..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng deleted file mode 100644 index 63557c6e2b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml deleted file mode 100644 index 4d8361aaa6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng deleted file mode 100644 index 32c6cb8e2c..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml deleted file mode 100644 index 4d8361aaa6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng deleted file mode 100644 index ffcd9bd4f9..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml deleted file mode 100644 index 0947bff2b1..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - 03 - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng deleted file mode 100644 index 9ddbb9baaf..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml deleted file mode 100644 index cc6ab02761..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng deleted file mode 100644 index ac676d982d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - - - text:reference-ref - text:bookmark-ref - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml deleted file mode 100644 index c562015a37..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng deleted file mode 100644 index bd6b4e0f05..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml deleted file mode 100644 index e28b855386..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - ,, - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng deleted file mode 100644 index 032886009d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - misc - - - - - text:url - text:custom5 - text:year - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml deleted file mode 100644 index fec92948f9..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng deleted file mode 100644 index 154c810975..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - 1.2 - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml deleted file mode 100644 index dd84419d66..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng deleted file mode 100644 index 1a02206d04..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml deleted file mode 100644 index b622196b05..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js b/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js deleted file mode 100644 index 6d16d1b2a3..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, odf: true*/ -runtime.loadClass("odf.OdfContainer"); - -/** - * If the state of the OdfContainer is invalid, exit with an error message. - */ -function exitOnInvalid(odffilepath, odfcontainer) { - "use strict"; - if (odfcontainer.state === odf.OdfContainer.INVALID) { - runtime.log("Document " + odffilepath + " is invalid."); - runtime.exit(1); - } - if (odfcontainer.state === odf.OdfContainer.DONE) { - odfcontainer.save(function (err) { - if (err) { - runtime.log(err); - runtime.exit(1); - } - }); - } -} - -/** - * Load an ODF document. Report an error if there is a problem. - */ -function loadODF(odffilepath) { - "use strict"; - var odfcontainer = new odf.OdfContainer(odffilepath); - odfcontainer.onstatereadychange = function () { - exitOnInvalid(odffilepath, odfcontainer); - }; - exitOnInvalid(odffilepath, odfcontainer); -} - -// loop over arguments to load ODF -var i; -for (i = 1; i < arguments.length; i += 1) { - loadODF(arguments[i]); -} diff --git a/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js b/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js deleted file mode 100644 index d3fe17fc81..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true*/ -runtime.loadClass("core.Zip"); - -/** - * Load an ODF document. Report an error if there is a problem. - */ -function roundTripZip(zipfilepath) { - "use strict"; - var zip = new core.Zip(zipfilepath, function (err, zip) { - if (err) { - runtime.log(err); - runtime.exit(1); - } - // the TOC of the zip is loaded at this point - // now we want to load all parts in memory so we can save them again - zip.write(function (err) { - if (err) { - runtime.log(err); - runtime.exit(1); - } - // at this point a zip file should have been written with the same - // contents as the one that was read - runtime.exit(0); - }); - }); -} - -// loop over arguments to load ODF -var i; -for (i = 1; i < arguments.length; i += 1) { - roundTripZip(arguments[i]); -} diff --git a/apps/files_odfviewer/src/webodf/webodf/styleNameRef b/apps/files_odfviewer/src/webodf/webodf/styleNameRef deleted file mode 100644 index 39b2914746..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/styleNameRef +++ /dev/null @@ -1,272 +0,0 @@ -# cat styles.xml|xmlstarlet sel -N style=urn:oasis:names:tc:opendocument:xmlns:style:1.0 -t -m "//*[@style:family='graphic']/@style:name" -v . - - -gradient - draw:fill-gradient-name style:drawing-page-properties - draw:fill-gradient-name style:graphic-properties - -hatch - draw:fill-hatch-name style:drawing-page-properties - draw:fill-hatch-name style:graphic-properties - -fill-image - draw:fill-image-name style:drawing-page-properties - draw:fill-image-name style:graphic-properties - -marker - draw:marker-end style:graphic-properties - draw:marker-start style:graphic-properties - -dash - draw:stroke-dash style:graphic-properties - -opacity - draw:opacity-name style:drawing-page-properties - draw:opacity-name style:graphic-properties - -master page - draw:master-page-name draw:page - style:master-page-name style:style - style:next-style-name style:master-page - text:master-page-name text:notes-configuration - text:master-page-name text:page - -presentation-page-layout - presentation:presentation-page-layout-name draw:page - presentation:presentation-page-layout-name draw:handout-master - -page-layout - style:page-layout-name presentation:notes - style:page-layout-name style:handout-master - style:page-layout-name style:master-page - -list - text:style-name text:list - text:style-name text:numbered-paragraph - text:style-override text:list-item - style:list-style-name style:style - -data - style:data-style-name style:style - style:percentage-data-style-name style:style - style:data-style-name presentation:date-time-decl - style:data-style-name text:creation-date - style:data-style-name text:creation-time - style:data-style-name text:database-display - style:data-style-name text:date - style:data-style-name text:editing-duration - style:data-style-name text:expression - style:data-style-name text:meta-field - style:data-style-name text:modification-date - style:data-style-name text:modification-time - style:data-style-name text:print-date - style:data-style-name text:print-time - style:data-style-name text:table-formula - style:data-style-name text:time - style:data-style-name text:user-defined - style:data-style-name text:user-field-get - style:data-style-name text:user-field-input - style:data-style-name text:variable-get - style:data-style-name text:variable-input - style:data-style-name text:variable-set - -chart - chart:style-name chart:axis - chart:style-name chart:chart - chart:style-name chart:data-label - chart:style-name chart:data-point - chart:style-name chart:equation - chart:style-name chart:error-indicator - chart:style-name chart:floor - chart:style-name chart:footer - chart:style-name chart:grid - chart:style-name chart:legend - chart:style-name chart:mean-value - chart:style-name chart:plot-area - chart:style-name chart:regression-curve - chart:style-name chart:series - chart:style-name chart:stock-gain-marker - chart:style-name chart:stock-loss-marker - chart:style-name chart:stock-range-line - chart:style-name chart:subtitle - chart:style-name chart:title - chart:style-name chart:wall - ----- - -drawing-page - draw:style-name draw:page - draw:style-name presentation:notes - draw:style-name style:handout-master - draw:style-name style:master-page - -graphic - draw:style-name dr3d:cube - draw:style-name dr3d:extrude - draw:style-name dr3d:rotate - draw:style-name dr3d:scene - draw:style-name dr3d:sphere - draw:style-name draw:caption - draw:style-name draw:circle - draw:style-name draw:connector - draw:style-name draw:control - draw:style-name draw:custom-shape - draw:style-name draw:ellipse - draw:style-name draw:frame - draw:style-name draw:g - draw:style-name draw:line - draw:style-name draw:measure - draw:style-name draw:page-thumbnail - draw:style-name draw:path - draw:style-name draw:polygon - draw:style-name draw:polyline - draw:style-name draw:rect - draw:style-name draw:regular-polygon - draw:style-name office:annotation - -paragraph - draw:text-style-name draw:caption - draw:text-style-name draw:circle - draw:text-style-name draw:connector - draw:text-style-name draw:control - draw:text-style-name draw:custom-shape - draw:text-style-name draw:ellipse - draw:text-style-name draw:frame - draw:text-style-name draw:line - draw:text-style-name draw:measure - draw:text-style-name draw:path - draw:text-style-name draw:polygon - draw:text-style-name draw:polyline - draw:text-style-name draw:rect - draw:text-style-name draw:regular-polygon - draw:text-style-name office:annotation - form:text-style-name form:column - style:next-style-name style:style - table:paragraph-style-name table:body - table:paragraph-style-name table:even-columns - table:paragraph-style-name table:even-rows - table:paragraph-style-name table:first-column - table:paragraph-style-name table:first-row - table:paragraph-style-name table:last-column - table:paragraph-style-name table:last-row - table:paragraph-style-name table:odd-columns - table:paragraph-style-name table:odd-rows - text:default-style-name text:notes-configuration - text:style-name text:alphabetical-index-entry-template - text:style-name text:bibliography-entry-template - text:style-name text:h - text:style-name text:illustration-index-entry-template - text:style-name text:index-source-style - text:style-name text:object-index-entry-template - text:style-name text:p - text:style-name text:table-index-entry-template - text:style-name text:table-of-content-entry-template - text:style-name text:table-index-entry-template - text:style-name text:user-index-entry-template - style:register-truth-ref-style-name style:page-layout-properties - -presentation - presentation:style-name dr3d:cube - presentation:style-name dr3d:extrude - presentation:style-name dr3d:rotate - presentation:style-name dr3d:scene - presentation:style-name dr3d:sphere - presentation:style-name draw:caption - presentation:style-name draw:circle - presentation:style-name draw:connector - presentation:style-name draw:control - presentation:style-name draw:custom-shape - presentation:style-name draw:ellipse - presentation:style-name draw:frame - presentation:style-name draw:g - presentation:style-name draw:line - presentation:style-name draw:measure - presentation:style-name draw:page-thumbnail - presentation:style-name draw:path - presentation:style-name draw:polygon - presentation:style-name draw:polyline - presentation:style-name draw:rect - presentation:style-name draw:regular-polygon - presentation:style-name office:annotation - -ruby - text:style-name text:ruby - -section - text:style-name text:alphabetical-index - text:style-name text:bibliography - text:style-name text:illustration-index - text:style-name text:index-title - text:style-name text:object-index - text:style-name text:section - text:style-name text:table-of-content - text:style-name text:table-index - text:style-name text:user-index - -table-cell - db:default-cell-style-name db:column - table:default-cell-style-name table:table-column - table:default-cell-style-name table:table-row - table:style-name table:body - table:style-name table:covered-table-cell - table:style-name table:even-columns - table:style-name table:covered-table-cell - table:style-name table:even-columns - table:style-name table:even-rows - table:style-name table:first-column - table:style-name table:first-row - table:style-name table:last-column - table:style-name table:last-row - table:style-name table:odd-columns - table:style-name table:odd-rows - table:style-name table:table-cell - -table-row - db:default-row-style-name db:query - db:default-row-style-name db:table-representation - table:style-name table:table-row - -table-column - db:style-name db:column - table:style-name table:table-column - -table - db:style-name db:query - db:style-name db:table-representation - table:style-name table:background - table:style-name table:table - -text - style:leader-text-style style:tab-stop - style:style-name style:drop-cap - text:citation-body-style-name text:notes-configuration - text:citation-style-name text:notes-configuration - text:style-name text:a - text:style-name text:alphabetical-index - text:style-name text:linenumbering-configuration - text:style-name text:list-level-style-number - text:style-name text:ruby-text - text:style-name text:span - text:visited-style-name text:a - style:text-line-through-text-style style:text-properties - text:main-entry-style-name text:alphabetical-index-source - text:style-name text:index-entry-bibliography - text:style-name text:index-entry-chapter - text:style-name text:index-entry-link-end - text:style-name text:index-entry-link-start - text:style-name text:index-entry-page-number - text:style-name text:index-entry-span - text:style-name text:index-entry-tab-stop - text:style-name text:index-entry-text - text:style-name text:index-title-template - text:style-name text:list-level-style-bullet - text:style-name text:outline-level-style - - ---- - -conditional style - text:cond-style-name text:h - text:cond-style-name text:p - -style:apply-style-name # complicated! -style:parent-style-name # complicated! diff --git a/apps/files_odfviewer/src/webodf/webodf/styleNameRefs b/apps/files_odfviewer/src/webodf/webodf/styleNameRefs deleted file mode 100644 index e63e3562df..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/styleNameRefs +++ /dev/null @@ -1,57 +0,0 @@ -dash - draw:stroke-dash-names style:graphic-properties - -graphic - draw:class-names dr3d:cube - draw:class-names dr3d:extrude - draw:class-names dr3d:rotate - draw:class-names dr3d:scene - draw:class-names dr3d:sphere - draw:class-names draw:caption - draw:class-names draw:circle - draw:class-names draw:connector - draw:class-names draw:control - draw:class-names draw:custom-shape - draw:class-names draw:ellipse - draw:class-names draw:frame - draw:class-names draw:g - draw:class-names draw:line - draw:class-names draw:measure - draw:class-names draw:page-thumbnail - draw:class-names draw:path - draw:class-names draw:polygon - draw:class-names draw:polyline - draw:class-names draw:rect - draw:class-names draw:regular-polygon - draw:class-names office:annotation - -paragraph - text:class-names text:h - text:class-names text:p - -presentation - presentation:class-names dr3d:cube - presentation:class-names dr3d:extrude - presentation:class-names dr3d:rotate - presentation:class-names dr3d:scene - presentation:class-names dr3d:sphere - presentation:class-names draw:caption - presentation:class-names draw:circle - presentation:class-names draw:connector - presentation:class-names draw:control - presentation:class-names draw:custom-shape - presentation:class-names draw:ellipse - presentation:class-names draw:frame - presentation:class-names draw:g - presentation:class-names draw:line - presentation:class-names draw:measure - presentation:class-names draw:page-thumbnail - presentation:class-names draw:path - presentation:class-names draw:polygon - presentation:class-names draw:polyline - presentation:class-names draw:rect - presentation:class-names draw:regular-polygon - presentation:class-names office:annotation - -text - text:class-names text:span diff --git a/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js b/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js deleted file mode 100644 index 875faa9de8..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, xmldom: true*/ -runtime.loadClass("xmldom.RelaxNG"); -runtime.loadClass("xmldom.RelaxNG2"); - -function validate(relaxng, relaxng2, url) { - "use strict"; - runtime.loadXML(url, function (err, dom) { - var walker; - if (err) { - runtime.log("Could not read " + url + ": " + err); - } else { - walker = dom.createTreeWalker(dom.firstChild, 0xFFFFFFFF); - relaxng.validate(walker, function (err) { - if (err) { - var i; - runtime.log("Found " + String(err.length) + - " error validating " + url + ":"); - for (i = 0; i < err.length; i += 1) { - runtime.log(err[i].message()); - } - } - }); - relaxng2.validate(walker, function (err) { - if (err) { - var i; - runtime.log("Found " + String(err.length) + - " error validating " + url + ":"); - for (i = 0; i < err.length; i += 1) { - runtime.log(err[i].message()); - } - } - }); - } - }); -} - -var args = arguments, - relaxngurl = args[1]; - -// load and parse the Relax NG -runtime.loadXML(relaxngurl, function (err, dom) { - "use strict"; - var parser, i, relaxng, relaxng2; - if (err) { - return; - } - parser = new xmldom.RelaxNGParser(); - relaxng = new xmldom.RelaxNG(); - relaxng2 = new xmldom.RelaxNG2(); - err = parser.parseRelaxNGDOM(dom, relaxng.makePattern); - relaxng.init(parser.rootPattern); - relaxng2.init(parser.start, parser.nsmap); - - // loop over arguments to load ODF - for (i = 2; i < args.length; i += 1) { - runtime.log("Validating " + args[i] + " from " + relaxngurl); - validate(relaxng, relaxng2, args[i]); - } -}); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js deleted file mode 100644 index 10156a1dc4..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, runtime: true*/ -runtime.loadClass("core.Base64"); -/** - * @constructor - * @param runner {UnitTestRunner} - * @implements {core.UnitTest} - */ -core.Base64Tests = function Base64Tests(runner) { - "use strict"; - var t, r = runner, base64 = new core.Base64(); - - function testConvertByteArrayToBase64() { - t.encoded = base64.convertByteArrayToBase64([65]); - r.shouldBe(t, "t.encoded", "'QQ=='"); - t.encoded = base64.convertByteArrayToBase64([65, 65]); - r.shouldBe(t, "t.encoded", "'QUE='"); - t.encoded = base64.convertByteArrayToBase64([65, 65, 65]); - r.shouldBe(t, "t.encoded", "'QUFB'"); - } - - function testToBase64() { - t.encoded = base64.toBase64("A"); - r.shouldBe(t, "t.encoded", "'QQ=='"); - t.encoded = base64.toBase64("AA"); - r.shouldBe(t, "t.encoded", "'QUE='"); - t.encoded = base64.toBase64("AAA"); - r.shouldBe(t, "t.encoded", "'QUFB'"); - } - - function testConvertUTF8StringToUTF16String(callback) { - var bin = "1234567890"; - while (bin.length < 100000) { - bin += bin; - } - t.numcallbacks = 0; - base64.convertUTF8StringToUTF16String(bin, function (str, done) { - t.numcallbacks += 1; - t.done = done; - if (t.numcallbacks === 1) { - r.shouldBe(t, "t.done", "false"); - } else { - r.shouldBe(t, "t.done", "true"); - } - if (done) { - r.shouldBe(t, "t.numcallbacks", "2"); - t.str = str; - t.bin = bin; - r.shouldBe(t, "t.str.length", "t.bin.length"); - callback(); - } - return true; - }); - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ - testConvertByteArrayToBase64, - testToBase64 - ]; - }; - this.asyncTests = function () { - return [ testConvertUTF8StringToUTF16String ]; - }; - this.description = function () { - return "Test the Base64 class."; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js deleted file mode 100644 index c9f7be78a6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js +++ /dev/null @@ -1,238 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, runtime: true*/ -runtime.loadClass("core.Cursor"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -core.CursorTests = function CursorTests(runner) { - "use strict"; - var r = runner, tests, t = {}, - maindoc = runtime.getWindow().document, - testarea = maindoc.getElementById("testarea"); - /** - * @param {Selection} selection - * @param {Node} startnode - * @param {number} startoffset - * @param {Node=} endnode - * @param {number=} endoffset - * @return {undefined} - */ - function setSelection(selection, startnode, startoffset, endnode, - endoffset) { - // call createRange() on the document, even if startnode is the document - var range = (startnode.ownerDocument || startnode).createRange(); - selection.removeAllRanges(); - range.setStart(startnode, startoffset); - if (endnode) { - range.setEnd(endnode, endoffset); - } else { - range.setEnd(startnode, startoffset); - } - selection.addRange(range); - if (range.startContainer !== startnode) { - runtime.log("EVIL"); - } - } - - function setupEmptyRootNode() { - var selection = runtime.getWindow().getSelection(), - root = maindoc.createElementNS("", "p"), - cursor = new core.Cursor(selection, maindoc); - testarea.appendChild(root); - t = { selection: selection, root: root, cursor: cursor }; - runner.shouldBeNonNull(t, "t.selection"); - } - - function setupSimpleTextDoc() { - setupEmptyRootNode(); - t.textnode = maindoc.createTextNode("abc"); - t.root.appendChild(t.textnode); - } - - tests = [ - // create a document, add a cursor and check that the cursor is present - function testOnEmptyNode1() { - // if the document is the container of the selection, the cursor - // can not be in the DOM - setupEmptyRootNode(); - setSelection(t.selection, t.root, 0); - t.cursor.updateToSelection(); - //r.shouldBeNull(t, "t.cursor.getNode().parentNode"); - }, - function testOnEmptyNode2() { - setupEmptyRootNode(); - setSelection(t.selection, t.root, 0); - // t.selection.focusNode = r.root; - var range = t.selection.getRangeAt(0); - t.cursor.updateToSelection(); - r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); - r.shouldBeNull(t, "t.cursor.getNode().previousSibling"); - r.shouldBeNull(t, "t.cursor.getNode().nextSibling"); - }, - function testOnSimpleText() { - setupSimpleTextDoc(); - // put the cursor at the start of the text node - setSelection(t.selection, t.textnode, 0); - t.cursor.updateToSelection(); - r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); - r.shouldBeNull(t, "t.cursor.getNode().previousSibling"); - r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'abc'"); - }, - function testOnSimpleText2() { - setupSimpleTextDoc(); - // put the cursor in the middle of the text node - setSelection(t.selection, t.textnode, 1); - t.cursor.updateToSelection(); - r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); - r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'a'"); - r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'bc'"); - }, - function testOnSimpleText3() { - setupSimpleTextDoc(); - // put the cursor at the end of the text node - setSelection(t.selection, t.textnode, 3); - t.cursor.updateToSelection(); - r.shouldBeNonNull("t.cursor.getNode().parentNode"); - r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'abc'"); - r.shouldBeNull(t, "t.cursor.getNode().nextSibling"); - }, - function testOnSimpleText4() { - var textnode2; - setupSimpleTextDoc(); - // put the cursor between 'a' and 'b', then change the selection to - // be between 'b' and 'c' and update the cursor - setSelection(t.selection, t.textnode, 1); - t.cursor.updateToSelection(); - textnode2 = t.cursor.getNode().nextSibling; - setSelection(t.selection, textnode2, 1); - t.cursor.updateToSelection(); - r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); - r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'ab'"); - r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'c'"); - }, - function testOnSimpleText5() { - var textnode2; - setupSimpleTextDoc(); - // put the cursor between 'a' and 'b', then change the selection to - // span the entire text and update the cursor - setSelection(t.selection, t.textnode, 1); - t.cursor.updateToSelection(); - textnode2 = t.cursor.getNode().nextSibling; - setSelection(t.selection, t.textnode, 0, textnode2, 2); - t.cursor.updateToSelection(); - r.shouldBe(t, "t.selection.rangeCount", "1"); -// only null if working on a separate document -// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); - t.range = t.selection.getRangeAt(0); - r.shouldBe(t, "t.range.startContainer", "t.textnode"); - r.shouldBe(t, "t.range.startOffset", "0"); - r.shouldBe(t, "t.range.endContainer", "t.textnode"); - r.shouldBe(t, "t.range.endOffset", "3"); - }, - function testOnSimpleText5b() { - var textnode2; - setupSimpleTextDoc(); - setSelection(t.selection, t.textnode, 1); - t.cursor.updateToSelection(); - textnode2 = t.cursor.getNode().nextSibling; - setSelection(t.selection, t.textnode.parentNode, 1, textnode2, 2); - t.cursor.updateToSelection(); - r.shouldBe(t, "t.selection.rangeCount", "1"); -// only null if working on a separate document -// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); - t.range = t.selection.getRangeAt(0); - r.shouldBe(t, "t.range.startContainer", "t.textnode"); - r.shouldBe(t, "t.range.startOffset", "1"); - r.shouldBe(t, "t.range.endContainer", "t.textnode"); - r.shouldBe(t, "t.range.endOffset", "3"); - }, - function testOnSimpleText6() { - var somenode, textnode2; - setupSimpleTextDoc(); - // add a child node to the cursor - somenode = maindoc.createElement("p"); - t.cursor.getNode().appendChild(somenode); - // select a single position so the cursor is put in the document - setSelection(t.selection, t.textnode, 1); - t.cursor.updateToSelection(); - r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); - textnode2 = t.cursor.getNode().nextSibling; - // select a range starting at the node in the cursor, but extends - // out of the the cursor - // this should have the result that the cursor is removed from the - // document and that the text nodes around the cursor are - // merged - setSelection(t.selection, somenode, 0, textnode2, 2); - t.cursor.updateToSelection(); -// only null if working on a separate document -// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); - t.range = t.selection.getRangeAt(0); - r.shouldBe(t, "t.range.startContainer", "t.textnode"); - r.shouldBe(t, "t.range.startOffset", "1"); - r.shouldBe(t, "t.range.endContainer", "t.textnode"); - r.shouldBe(t, "t.range.endOffset", "3"); - r.shouldBe(t, "t.range.collapsed", "false"); - } - ]; - this.setUp = function () { - t = {}; - while (testarea.firstChild) { - testarea.removeChild(testarea.firstChild); - } - }; - this.tearDown = function () { - t = {}; - while (testarea.firstChild) { - testarea.removeChild(testarea.firstChild); - } - }; - this.tests = function () { - return tests; - }; - this.asyncTests = function () { - return []; - }; -}; -core.CursorTests.name = "CursorTests"; -core.CursorTests.prototype.description = function () { - "use strict"; - return "Test the Cursor class."; -}; -(function () { - "use strict"; - return core.CursorTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js deleted file mode 100644 index dbb690f77e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, runtime: true*/ -runtime.loadClass("core.PointWalker"); - -/** - * @constructor - * @param runner {UnitTestRunner} - * @implements {core.UnitTest} - */ -core.PointWalkerTests = function PointWalkerTests(runner) { - "use strict"; - var t, r = runner; - - function checkWalker(node, count, endpos) { - t = {}; - t.node = node; - t.walker = new core.PointWalker(node); - t.count = count; - t.countForward = 0; - t.countBackward = 0; - t.endpos = endpos; - t.walker.setPoint(t.node, 0); - while (t.walker.stepForward()) { - t.countForward += 1; - } - r.shouldBe(t, "t.countForward", "t.count"); - r.shouldBe(t, "t.walker.precedingSibling()", "t.node.lastChild"); - r.shouldBe(t, "t.walker.followingSibling()", "null"); - if (endpos !== null) { - r.shouldBe(t, "t.walker.position()", "t.endpos"); - } - t.walker.setPoint(t.node, endpos); - while (t.walker.stepBackward()) { - t.countBackward += 1; - } - r.shouldBe(t, "t.countBackward", "t.count"); - r.shouldBe(t, "t.walker.precedingSibling()", "null"); - r.shouldBe(t, "t.walker.followingSibling()", "t.node.firstChild"); - r.shouldBe(t, "t.walker.position()", "0"); - } - - function testEmptyDocument() { - var doc = runtime.getDOMImplementation().createDocument("", "p", null), - p = doc.firstChild, - textnode1, - textnode2, - textnode3, - em; - - checkWalker(doc, 2, 1); - checkWalker(p, 0, 0); - - t = {}; - t.doc = doc; - t.walker = new core.PointWalker(t.doc); - r.shouldBe(t, "t.walker.position()", "0"); - r.shouldBe(t, "t.walker.stepForward()", "true"); - r.shouldBe(t, "t.walker.position()", "0"); - r.shouldBe(t, "t.walker.stepForward()", "true"); - r.shouldBe(t, "t.walker.position()", "1"); - r.shouldBe(t, "t.walker.stepForward()", "false"); - r.shouldBe(t, "t.walker.position()", "1"); - r.shouldBe(t, "t.walker.stepBackward()", "true"); - r.shouldBe(t, "t.walker.position()", "0"); - r.shouldBe(t, "t.walker.stepBackward()", "true"); - r.shouldBe(t, "t.walker.position()", "0"); - r.shouldBe(t, "t.walker.stepBackward()", "false"); - r.shouldBe(t, "t.walker.position()", "0"); - - textnode1 = doc.createTextNode("hello, "); - textnode2 = doc.createTextNode("big "); - textnode3 = doc.createTextNode("world."); - em = doc.createElement('em'); - p.appendChild(textnode1); - p.appendChild(em); - em.appendChild(textnode2); - p.appendChild(textnode3); - - checkWalker(textnode1, 7, 7); - checkWalker(textnode2, 4, 4); - checkWalker(textnode3, 6, 6); - checkWalker(em, 6, 1); - checkWalker(p, 25, 3); - checkWalker(doc, 27, 1); - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ - testEmptyDocument - ]; - }; - this.asyncTests = function () { - return []; - }; - this.description = function () { - return "Test the PointWalker class."; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js deleted file mode 100644 index d3f7c2dfa2..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, runtime: true*/ -/*jslint bitwise: true*/ - -/** - * @constructor - * @param runner {UnitTestRunner} - * @implements {core.UnitTest} - */ -core.RuntimeTests = function RuntimeTests(runner) { - "use strict"; - var t, r = runner; - - function testRead(callback) { - runtime.read("tests.js", 2, 6, function (err, data) { - t.err = err; - r.shouldBeNull(t, "t.err"); - t.data = runtime.byteArrayToString(data, "utf8"); - r.shouldBe(t, "t.data", "'global'"); - callback(); - }); - } - - /** - * Test writing a binary file and reading it back. - */ - function testWrite(callback) { - var content = new core.ByteArrayWriter("utf8"), - i, max = 1024, filename, clean; - for (i = 0; i < max; i += 1) { - content.appendArray([i]); - } - content = content.getByteArray(); - filename = "tmp" + Math.random(); - clean = new core.ByteArrayWriter("utf8"); - for (i = 0; i < max; i += 1) { - clean.appendArray([content[i] & 0xff]); - } - clean = clean.getByteArray(); - // now content has content different from what is on the server - runtime.writeFile(filename, content, function (err) { - t.err = err; - r.shouldBeNull(t, "t.err"); - runtime.readFile(filename, "binary", function (err, data) { - t.err = err; - r.shouldBeNull(t, "t.err"); - t.data = data; - t.clean = clean; - r.shouldBe(t, "t.data.length", "t.clean.length"); - i = 0; - while (i < max && data[i] === clean[i]) { - i += 1; - } - if (i !== max) { - runtime.log("at " + String(i) + " " + data[i] + " vs " + - clean[i]); - } - t.i = i; - t.max = max; - r.shouldBe(t, "t.i", "t.max"); - // cleanup - runtime.deleteFile(filename, function (err) { - callback(); - }); - }); - }); - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ - ]; - }; - this.asyncTests = function () { - return [ - testRead, - testWrite - ]; - }; - this.description = function () { - return "Test the runtime."; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js deleted file mode 100644 index ad2ece55ad..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global core: true, runtime: true*/ -runtime.loadClass("core.Zip"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -core.ZipTests = function ZipTests(runner) { - "use strict"; - var r = runner, - t; - - function testNonExistingFile(callback) { - var zip = new core.Zip("whatever", function (err) { - t.err = err; - r.shouldBeNonNull(t, "t.err"); - callback(); - }); - } - - function testNonZipFile(callback) { - var path = "core/ZipTests.js"; - // check that file exists - runtime.isFile(path, function (exists) { - t.exists = exists; - r.shouldBe(t, "t.exists", "true"); - // check that zip file opening returns an error - var zip = new core.Zip("core/ZipTests.js", function (err) { - t.err = err; - r.shouldBeNonNull(t, "t.err"); - callback(); - }); - }); - } - - function testHi(path, callback) { - var zip = new core.Zip(path, function (err, zip) { - t.err = err; - t.zip = zip; - r.shouldBeNull(t, "t.err"); - zip.load("hello", function (err, data) { - t.err = err; - r.shouldBeNull(t, "t.err"); - t.data = runtime.byteArrayToString(data, "utf8"); - r.shouldBe(t, "t.data.length", "16"); - r.shouldBe(t, "t.data", "'bonjour\\nbonjour\\n'"); - callback(); - }); - }); - } - - function testHiUncompressed(callback) { - testHi("core/hi-uncompressed.zip", callback); - } - - function testHiCompressed(callback) { - testHi("core/hi-compressed.zip", callback); - } - - function testCreateZip(callback) { - var filename = "writetest.zip", - zip = new core.Zip(filename, null), - data = runtime.byteArrayFromString( - "application/vnd.oasis.opendocument.text", "utf8"); - zip.save("mimetype", data, false, new Date()); - zip.load("mimetype", function (err, newdata) { - t.err = err; - r.shouldBeNull(t, "t.err"); - t.data = data; - t.newdata = newdata; - r.shouldBe(t, "t.data", "t.newdata"); - zip.write(function (err) { - t.err = err; - r.shouldBeNull(t, "t.err"); - runtime.deleteFile(filename, function (err) { - callback(); - }); - }); - }); - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return []; - }; - this.asyncTests = function () { - return [ - testNonExistingFile, - testNonZipFile, - testHiUncompressed, - testHiCompressed, - testCreateZip - ]; - }; -}; -core.ZipTests.prototype.description = function () { - "use strict"; - return "Test the Zip class."; -}; -(function () { - "use strict"; - return core.ZipTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip deleted file mode 100644 index ff6d86c158..0000000000 Binary files a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip deleted file mode 100644 index 2eafff7ab9..0000000000 Binary files a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip and /dev/null differ diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js deleted file mode 100644 index 05f1b9bcc5..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, gui: true*/ -runtime.loadClass("gui.Caret"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -gui.CaretTests = function CaretTests(runner) { - "use strict"; - var r = runner, - t; - - function setupEmptyDoc() { - var selection = runtime.getWindow().getSelection(), - doc = runtime.getDOMImplementation().createDocument("", "p", null), - caret = new gui.Caret(selection, doc); - t = { selection: selection, doc: doc }; //, cursor: cursor }; - runner.shouldBeNonNull(t, "t.selection"); - } - function setupSimpleTextDoc() { - setupEmptyDoc(); - t.textnode = t.doc.createTextNode("abc"); - t.doc.documentElement.appendChild(t.textnode); - } - function testOnUpDownTraversal() { - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return []; - }; - this.asyncTests = function () { - return [ - ]; - }; -}; -gui.CaretTests.prototype.description = function () { - "use strict"; - return "Test the Caret class."; -}; -(function () { - "use strict"; - return gui.CaretTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js deleted file mode 100644 index 8b8275bcb8..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, gui: true*/ -runtime.loadClass("gui.SelectionMover"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -gui.SelectionMoverTests = function SelectionMoverTests(runner) { - "use strict"; - var r = runner, - t, testarea = runtime.getWindow().document.getElementById("testarea"); - - function setupDoc() { - var doc = testarea.ownerDocument, - selection = runtime.getWindow().getSelection(), - p = doc.createElement("p"), - walker = new core.PointWalker(p), - mover = new gui.SelectionMover(selection, walker); - testarea.appendChild(p); - p.appendChild(doc.createTextNode("MMMMM MMMMM MMMMM MMMMM MMMMM")); - p.style.width = "5em";// break line after each 'MMMMM' - selection.removeAllRanges(); - selection.addRange(doc.createRange()); - t = { doc: doc, p: p, selection: selection, mover: mover }; - } - function testUpDownTraversal() { - setupDoc(); - r.shouldBe(t, "t.selection.rangeCount", "1"); - t.r = t.selection.getRangeAt(0); - r.shouldBeNonNull(t, "t.r"); - t.r.setStart(t.p.firstChild, 0); - r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); - r.shouldBe(t, "t.r.startOffset", "0"); - t.mover.movePointForward(); - t.r = t.selection.getRangeAt(0); - r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); - r.shouldBe(t, "t.r.startOffset", "1"); - t.mover.movePointBackward(); - t.r = t.selection.getRangeAt(0); - r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); - r.shouldBe(t, "t.r.startOffset", "0"); - t.mover.moveLineForward(); -// t.selection.modify("move", "forward", "line"); - t.r = t.selection.getRangeAt(0); - r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); - r.shouldBe(t, "t.r.startOffset", "6"); - } - - this.setUp = function () { - t = {}; - while (testarea.firstChild) { - testarea.removeChild(testarea.firstChild); - } - }; - this.tearDown = function () { - t = {}; - while (testarea.firstChild) { - testarea.removeChild(testarea.firstChild); - } - }; - this.tests = function () { - return [ testUpDownTraversal ]; - }; - this.asyncTests = function () { - return [ - ]; - }; -}; -gui.SelectionMoverTests.prototype.description = function () { - "use strict"; - return "Test the SelectionMover class."; -}; -(function () { - "use strict"; - return gui.SelectionMoverTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js deleted file mode 100644 index e253a72fea..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global document: true, core: true, gui: true, runtime: true*/ -runtime.loadClass("core.PointWalker"); -runtime.loadClass("gui.XMLEdit"); - -/** - * @constructor - * @param runner {core.UnitTestRunner} - * @implements {core.UnitTest} - */ -gui.XMLEditTests = function XMLEditTests(runner) { - "use strict"; - var t, r = runner, tests; - - function checkWalker(node, count, endpos) { - t = {}; - t.node = node; - t.walker = new core.PointWalker(node); - t.count = count; - t.countForward = 0; - t.countBackward = 0; - t.endpos = endpos; - t.walker.setPoint(t.node, 0); - while (t.walker.stepForward()) { - t.countForward += 1; - } - r.shouldBe("t.countForward", "t.count"); - r.shouldBe("t.walker.precedingSibling()", "t.node.lastChild"); - r.shouldBe("t.walker.followingSibling()", "null"); - if (endpos !== null) { - r.shouldBe("t.walker.position()", "t.endpos"); - } - t.walker.setPoint(t.node, endpos); - while (t.walker.stepBackward()) { - t.countBackward += 1; - } - r.shouldBe("t.countBackward", "t.count"); - r.shouldBe("t.walker.precedingSibling()", "null"); - r.shouldBe("t.walker.followingSibling()", "t.node.firstChild"); - r.shouldBe("t.walker.position()", "0"); - } - - function testSimpleDocument(xmledit) { - var maindoc = xmledit.ownerDocument, - doc = maindoc.implementation.createDocument(null, "p", null), - p = doc.firstChild, - textnode1, - textnode2, - textnode3, - em; - - xmledit.setXML(doc); - - checkWalker(doc, 2, 1); - checkWalker(p, 0, 0); - - t = {}; - t.doc = doc; - t.walker = new core.PointWalker(t.doc); - r.shouldBe("t.walker.position()", "0"); - r.shouldBe("t.walker.stepForward()", "true"); - r.shouldBe("t.walker.position()", "0"); - r.shouldBe("t.walker.stepForward()", "true"); - r.shouldBe("t.walker.position()", "1"); - r.shouldBe("t.walker.stepForward()", "false"); - r.shouldBe("t.walker.position()", "1"); - r.shouldBe("t.walker.stepBackward()", "true"); - r.shouldBe("t.walker.position()", "0"); - r.shouldBe("t.walker.stepBackward()", "true"); - r.shouldBe("t.walker.position()", "0"); - r.shouldBe("t.walker.stepBackward()", "false"); - r.shouldBe("t.walker.position()", "0"); - - textnode1 = doc.createTextNode("hello, "); - textnode2 = doc.createTextNode("big "); - textnode3 = doc.createTextNode("world."); - em = doc.createElement('em'); - p.appendChild(textnode1); - p.appendChild(em); - em.appendChild(textnode2); - p.appendChild(textnode3); - - checkWalker(textnode1, 7, 7); - checkWalker(textnode2, 4, 4); - checkWalker(textnode3, 6, 6); - checkWalker(em, 6, 1); - checkWalker(p, 25, 3); - checkWalker(doc, 27, 1); - } - - function testXmlEdit(document) { - var head = document.getElementsByTagName("head")[0], - css = document.createElement("style"), - testarea = document.createElement("div"), - xmledit; - - // the xml edit requires an element to put the content and a sheet to put - // the style - css.type = "text/css"; - head.appendChild(css); - document.body.appendChild(testarea); - xmledit = new gui.XMLEdit(testarea, css); - - testSimpleDocument(xmledit); - - css.parentNode.removeChild(css); - testarea.parentNode.removeChild(testarea); - } - - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ testSimpleDocument ]; - }; - this.asyncTests = function () { - return []; - }; - this.description = function () { - return "Test the XML editor class."; - }; -}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js b/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js deleted file mode 100644 index 6d4f151bc0..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js +++ /dev/null @@ -1,16 +0,0 @@ -(function () { - "use strict"; -return [ - "core/Base64Tests.js", - "core/CursorTests.js", - "core/PointWalkerTests.js", - "core/RuntimeTests.js", - "core/ZipTests.js", - "gui/CaretTests.js", - "gui/SelectionMoverTests.js", - "gui/XMLEditTests.js", - "tests.js", - "xmldom/OperationalTransformDOMTests.js", - "xmldom/XPathTests.js" - ]; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css b/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css deleted file mode 100644 index f12147ca43..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css +++ /dev/null @@ -1,12 +0,0 @@ -.pass { - font-weight: bold; - color: green; -} -.fail { - font-weight: bold; - color: red; -} -#console { - white-space: pre-wrap; - font-family: monospace; -} diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/tests.html b/apps/files_odfviewer/src/webodf/webodf/tests/tests.html deleted file mode 100644 index 572db60554..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/tests.html +++ /dev/null @@ -1,22 +0,0 @@ - - - WebODF unit tests - - - -

    -
    -
    -
    - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/tests.js b/apps/files_odfviewer/src/webodf/webodf/tests/tests.js deleted file mode 100644 index 5570733de5..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/tests.js +++ /dev/null @@ -1,94 +0,0 @@ -/*global window: true, runtime: true, Runtime: true, core: true, gui: true, - xmldom: true, RuntimeTests: true*/ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -runtime.loadClass("core.RuntimeTests"); -runtime.loadClass("core.UnitTester"); -runtime.loadClass("core.PointWalkerTests"); -runtime.loadClass("core.CursorTests"); -runtime.loadClass("core.ZipTests"); -runtime.loadClass("core.Base64Tests"); -runtime.loadClass("xmldom.OperationalTransformDOMTests"); -runtime.loadClass("xmldom.XPathTests"); -runtime.loadClass("gui.CaretTests"); -runtime.loadClass("gui.XMLEditTests"); - -var tests = [ - core.RuntimeTests, // temporarily disabled, enable at next commit! - core.ZipTests, - core.Base64Tests -]; -if (runtime.type() !== "NodeJSRuntime") { - tests.push(core.PointWalkerTests); -} -if (runtime.type() === "BrowserRuntime") { - tests.push(core.PointWalkerTests); -// tests.push(core.CursorTests); - tests.push(xmldom.OperationalTransformDOMTests); - tests.push(gui.CaretTests); - tests.push(xmldom.XPathTests); -// tests.push(gui.XMLEditTests); -} -var tester = new core.UnitTester(); -/** - * @param {!Array.} tests - * @return {undefined} - */ -function runNextTest(tests) { - "use strict"; - if (tests.length === 0) { - //runtime.log(JSON.stringify(tester.results())); - runtime.log("Number of failed tests: " + - String(tester.countFailedTests())); - runtime.exit(tester.countFailedTests()); - return; - } - var test = tests[0]; - if (typeof test !== "function") { - runtime.log("Tests contain a non-function object of type " + - typeof(test) + "."); - runtime.exit(1); - return; - } - runtime.log("Running test '" + Runtime.getFunctionName(test) + "'."); - try { - tester.runTests(test, function () { - runNextTest(tests.slice(1)); - }); - } catch (e) { - runtime.log(e); - runtime.exit(1); - throw e; - } -} -runNextTest(tests); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js deleted file mode 100644 index 3866a53708..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, xmldom: true*/ -runtime.loadClass("xmldom.OperationalTransformDOM"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -xmldom.OperationalTransformDOMTests = function OperationalTransformDOMTests(runner) { - "use strict"; - var r = runner, - t; - - function setupEmptyDoc() { - var doc = runtime.getDOMImplementation().createDocument("", "p", null); - t = { doc: doc }; - } - function setupSimpleTextDoc() { - setupEmptyDoc(); - t.textnode = t.doc.createTextNode("abc"); - t.doc.documentElement.appendChild(t.textnode); - } - function testSkip() { - setupEmptyDoc(); - } - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ testSkip ]; - }; - this.asyncTests = function () { - return [ - ]; - }; -}; -xmldom.OperationalTransformDOMTests.prototype.description = function () { - "use strict"; - return "Test the OperationalTransformDOM class."; -}; -(function () { - "use strict"; - return xmldom.OperationalTransformDOMTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js deleted file mode 100644 index 91ebba99c6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true, xmldom: true, odf: true, XMLSerializer*/ -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Style2CSS"); - -/** - * @constructor - * @param {core.UnitTestRunner} runner - * @implements {core.UnitTest} - */ -xmldom.XPathTests = function XPathTests(runner) { - "use strict"; - var r = runner, - style2CSS = new odf.Style2CSS(), - t; - - function setupDoc() { - var stylens = style2CSS.namespaceResolver("style"), - svgns = style2CSS.namespaceResolver("svg"), - drawns = style2CSS.namespaceResolver("draw"), - presentationns = style2CSS.namespaceResolver("presentation"), - textns = style2CSS.namespaceResolver("text"), - doc = runtime.getDOMImplementation().createDocument("", "a", null), - r = doc.documentElement, - fontFace = doc.createElementNS(stylens, "font-face"), - fontFaceSrc = doc.createElementNS(svgns, "font-face-src"), - drawFrame = doc.createElementNS(drawns, "frame"), - p = doc.createElementNS(textns, "p"); - r.appendChild(p); - r.appendChild(fontFace); - fontFace = doc.createElementNS(stylens, "font-face"); - fontFace.appendChild(fontFaceSrc); - fontFaceSrc.setAttributeNS(textns, "anchor-type", "paragraph"); - r.appendChild(fontFace); - r.appendChild(drawFrame); - drawFrame = doc.createElementNS(drawns, "frame"); - drawFrame.setAttributeNS(presentationns, "class", "title"); - r.appendChild(drawFrame); - - t = { doc: doc, fontFace: fontFace, drawFrame: drawFrame }; - } - function test1() { - setupDoc(); - var xpath = new xmldom.XPath(), - xpaths = { - "style:font-face[svg:font-face-src]": "t.fontFace", - ".//*[*[@text:anchor-type='paragraph']]": "t.fontFace", - "./draw:frame[@presentation:class='title']": "t.drawFrame" - }, - x; - for (x in xpaths) { - if (xpaths.hasOwnProperty(x)) { - t.result = xpath.getODFElementsWithXPath(t.doc.documentElement, - x, style2CSS.namespaceResolver); - r.shouldBe(t, "t.result.length", "1"); - r.shouldBe(t, "t.result[0]", xpaths[x]); - } - } - } - this.setUp = function () { - t = {}; - }; - this.tearDown = function () { - t = {}; - }; - this.tests = function () { - return [ test1 ]; - }; - this.asyncTests = function () { - return [ - ]; - }; -}; -xmldom.XPathTests.prototype.description = function () { - "use strict"; - return "Test the XPath class."; -}; -(function () { - "use strict"; - return xmldom.XPathTests; -}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html b/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html deleted file mode 100644 index 67cc747737..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -

    This image can be used to find clipping problems. If the sides of the image are clipped asymetrically, it will obvious visually.

    - -pregenerated - - diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/externs.js b/apps/files_odfviewer/src/webodf/webodf/tools/externs.js deleted file mode 100644 index 9862befe48..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/externs.js +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global Packages HTMLStyleElement window XMLHttpRequest HTMLStyleElement Document*/ -/*jslint nomen: false */ -/** - * @constructor - */ -function NodeJSObject() {} -/** - * @param {!string} path - * @param {function(...)} callback - * @return {undefined} - */ -NodeJSObject.prototype.stat = function (path, callback) {}; -/** - * @param {!string} path - * @param {?string} encoding - * @param {function(...)} callback - * @return {?string} - */ -NodeJSObject.prototype.readFile = function (path, encoding, callback) {}; -/** - * @param {!string} path - * @param {?string} encoding - * @return {?string} - */ -NodeJSObject.prototype.readFileSync = function (path, encoding) {}; -/** - * @param {!string} path - * @param {!string} flags - * @param {!number} mode - * @param {!function(string, !number):undefined} callback - * @return {undefined} - */ -NodeJSObject.prototype.open = function (path, flags, mode, callback) {}; -/** - * @param {!number} fd - * @param {!Buffer} buffer - * @param {!number} offset - * @param {!number} length - * @param {!number} position - * @param {function(string, !number)} callback - * @return {undefined} - */ -NodeJSObject.prototype.read = function (fd, buffer, offset, length, position, - callback) {}; -/** - * @param {!string} path - * @param {!string} data - * @param {!string} encoding - * @param {!function(?string):undefined} callback - * @return {undefined} - */ -NodeJSObject.prototype.writeFile = function (path, data, encoding, callback) {}; -/** - * @param {!string} path - * @param {!function(?string):undefined} callback - * @return {undefined} - */ -NodeJSObject.prototype.unlink = function (path, callback) {}; -/** - * @param {!number} fd - * @param {function(!string)} callback - * @return {undefined} - */ -NodeJSObject.prototype.close = function (fd, callback) {}; -/** - * @param {!string} className - * @return {!NodeJSObject} - */ -function require(className) {} -/** - * @constructor - */ -function NodeJSConsole() {} -/** - * @param {!string} msg - * @return {undefined} - */ -NodeJSConsole.prototype.log = function (msg) {}; -/** - * @type {!NodeJSConsole} - */ -var console; -/** - * @constructor - */ -function NodeJSProcess() {} -/** - * @param {!number} exitCode - * @return {undefined} - */ -NodeJSProcess.prototype.exit = function (exitCode) {}; -/** - * @type {!Array} - */ -NodeJSProcess.prototype.argv = []; -/** - * @type {!Object} - */ -NodeJSProcess.prototype.stderr = {}; -/** - * @type {!NodeJSProcess} - */ -var process; -/** - * @type {!string} - */ -var __dirname; -/** - * @constructor - * @param {!number|!Array.|!string} arg1 - * @param {!string=} encoding - */ -function Buffer(arg1, encoding) {} -/** - * @param {!string} msg - * @return {undefined} - */ -function print(msg) {} -/** - * @param {!string} path - * @param {!string=} encoding - * @return {?string} - */ -function readFile(path, encoding) {} -/** - * @param {!number} exitCode - * @return {undefined} - */ -function quit(exitCode) {} -/** - * @namespace - */ -Packages.javax = {}; -/** - * @namespace - */ -Packages.javax.xml = {}; -/** - * @namespace - */ -Packages.javax.xml.validation = {}; -/** - * @constructor - */ -Packages.javax.xml.validation.Schema = function () {}; -/** - * @namespace - */ -Packages.javax.xml.parsers = {}; -/** - * @constructor - */ -Packages.javax.xml.parsers.DocumentBuilder = function () {}; -/** - * @param {!Object} entityresolver - * @return {undefined} - */ -Packages.javax.xml.parsers.DocumentBuilder.prototype.setEntityResolver = - function (entityresolver) {}; -/** - * @param {!Packages.org.xml.sax.InputSource} source - * @return {Document} - */ -Packages.javax.xml.parsers.DocumentBuilder.prototype.parse = - function (source) {}; -/** - * @return {DOMImplementation} - */ -Packages.javax.xml.parsers.DocumentBuilder.prototype.getDOMImplementation = - function () {}; -/** - * @constructor - */ -Packages.javax.xml.parsers.DocumentBuilderFactory = function () {}; -/** - * @return {!Packages.javax.xml.parsers.DocumentBuilderFactory} - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance = function () {}; -/** - * @param {!boolean} value - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setValidating = - function (value) {}; -/** - * @param {!boolean} value - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setNamespaceAware = - function (value) {}; -/** - * @param {!boolean} value - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.prototype - .setExpandEntityReferences = function (value) {}; -/** - * @param {?Packages.javax.xml.validation.Schema} schema - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setSchema = - function (schema) {}; -/** - * @return {!Packages.javax.xml.parsers.DocumentBuilder} - */ -Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.newDocumentBuilder = - function () {}; -/** - * @namespace - */ -Packages.org = {}; -/** - * @namespace - */ -Packages.org.xml.sax = {}; -/** - * @param {!Object} definition - * @return {!Object} - */ -Packages.org.xml.sax.EntityResolver = function (definition) {}; -/** - * @namespace - */ -Packages.java.io = {}; -/** - * @constructor - * @param {!string} path - */ -Packages.java.io.FileReader = function (path) {}; -/** - * @constructor - * @param {!string} path - */ -Packages.java.io.FileOutputStream = function (path) {}; -/** - * @param {!number} b - * @return {undefined} - */ -Packages.java.io.FileOutputStream.prototype.write = function (b) {}; -/** - * @return {undefined} - */ -Packages.java.io.FileOutputStream.prototype.close = function () {}; -/** - * @constructor - * @param {!Packages.java.io.FileReader} reader - */ -Packages.org.xml.sax.InputSource = function (reader) {}; -/** - * @type {!StyleSheet} - */ -HTMLStyleElement.prototype.sheet; -XMLHttpRequest.prototype.sendAsBinary = function (data) {}; -/** - * @const@type{!string} - */ -XMLHttpRequest.prototype.responseBody; -window.nativeio = {}; -var VBArray = {}; -VBArray.prototype.toArray = function () {}; -/** - * @interface - */ -function TreeWalker() {} -/** - * @const@type{!Node} - */ -TreeWalker.prototype.root; -/** - * @const@type{number} - */ -TreeWalker.prototype.whatToShow; -/** - * @const@type{NodeFilter} - */ -TreeWalker.prototype.filter; -/** - * @const@type{boolean} - */ -TreeWalker.prototype.expandEntityReferences; -/** - * @type{Node} - */ -TreeWalker.prototype.currentNode; -/** - * @return {Node} - */ -TreeWalker.prototype.parentNode = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.firstChild = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.lastChild = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.previousSibling = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.nextSibling = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.previousNode = function () {}; -/** - * @return {Node} - */ -TreeWalker.prototype.nextNode = function () {}; -/** - * @param {!Node} root - * @param {!number} whatToShow - * @param {NodeFilter=} filter - * @param {boolean=} entityReferenceExpansion - * @return {!TreeWalker} - */ -Document.prototype.createTreeWalker = function (root, whatToShow, filter, entityReferenceExpansion) {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js b/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js deleted file mode 100644 index f65d0c5cdb..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global Packages HTMLStyleElement window XMLHttpRequest HTMLStyleElement Document*/ -/*jslint nomen: false */ -var Ext = {}; -Ext.data = {}; -/** - * @constructor - */ -Ext.data.Model = function (settings) {}; -/** - * @param {!string} fieldName - * @return {!string} - */ -Ext.data.Model.prototype.get = function (fieldName) {}; -/** - * @return {!boolean} - */ -Ext.data.Model.isExpanded = function () {}; -/** - * @constructor - */ -Ext.data.NodeInterface = function () {}; -/** - * @param {!string} attribute - * @param {*} value - * @param {boolean=} deep - * @return {Ext.data.NodeInterface} - */ -Ext.data.NodeInterface.prototype.findChild = function (attribute, value, deep) {}; -/** - * @param {!Ext.data.NodeInterface|!Object} node - * @return {!Ext.data.NodeInterface} - */ -Ext.data.NodeInterface.prototype.appendChild = function (node) {}; -/** - * @param {!string} id - * @return {Ext.Component} - */ -Ext.getCmp = function (id) {}; -Ext.tree = {}; -/** - * @constructor - */ -Ext.tree.Panel = function (settings) {}; -/** - * @return {!Ext.data.NodeInterface} - */ -Ext.tree.Panel.prototype.getRootNode = function () {}; -Ext.component = {}; -/** - * @constructor - * @extends {Ext.Component} - */ -Ext.component.Component = function (settings) {}; -/** - * @return {!Ext.Element} - */ -Ext.component.Component.prototype.getEl = function () {}; -/** - * @constructor - */ -Ext.Button = function (settings) {}; -/** - * @constructor - */ -Ext.Component = function (settings) {}; -/** - * @type {Object} - */ -Ext.Component.prototype.superclass = {}; -/** - * @type {!Ext.Element} - */ -Ext.Component.prototype.el; -/** - * @constructor - */ -Ext.Element = function (settings) {}; -/** - * @constructor - */ -Ext.Panel = function (settings) {}; -/** - * @type {!Element} - */ -Ext.Element.prototype.dom; -Ext.QuickTips = {}; -/** - * @return {undefined} - */ -Ext.QuickTips.init = function () {}; -/** - * @constructor - */ -Ext.Slider = function (settings) {}; -Ext.util = {}; -/** - * @constructor - */ -Ext.util.MixedCollection = function () {}; -/** - * @param {!Function} f - */ -Ext.util.MixedCollection.prototype.findBy = function (f) {}; -Ext.tab = {}; -/** - * @constructor - */ -Ext.tab.Panel = function (settings) {}; -/** - * @param {!Object} component - * @return {undefined} - */ -Ext.tab.Panel.prototype.add = function (component) {}; -/** - * @return {!Ext.Component} - */ -Ext.tab.Panel.prototype.getActiveTab = function () {}; -/** - * @param {!Ext.Component} tab - * @return {undefined} - */ -Ext.tab.Panel.prototype.setActiveTab = function (tab) {}; -/** - * @type {!Ext.util.MixedCollection} - */ -Ext.tab.Panel.prototype.items; -/** - * @constructor - */ -Ext.Toolbar = function (settings) {}; -/** - * @constructor - */ -Ext.Toolbar.TextItem = function (text) {}; -/** - * @constructor - */ -Ext.Viewport = function (settings) {}; -Ext.onReady = function (callback) {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py b/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py deleted file mode 100755 index a81c9b55c6..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/python -Qwarnall -# -*- coding: utf-8 -*- -# -# This script checks if all files have licenses and fixes them if needed. -# The script should be run from the root directory of the webodf project. -import os, os.path - -# read the license text from the source file -# the license starts at the line ' * @licstart' and ends at ' */' -def readLicense(path): - file = open(path, "rU") - licensetext = [] - started = False - for line in file: - if line.rstrip() == ' * @licstart': - started = True - if started: - licensetext.append(line) - if line.rstrip() == ' */': - break - return licensetext - -def writeLicense(file, license, defaultcopyright): - if defaultcopyright: - file.write(defaultcopyright) - file.writelines(license) - -def fixLicense(path, license, defaultcopyright): - # read the file - file = open(path, "rU") - lines = file.readlines() - file.close() - # does the file have any copyright statement already? - hasLicense = False - hasCopyright = False - for line in lines: - if line.rstrip() == ' * @licstart': - hasLicense = True - if line[:17] == ' * Copyright (C) ': - hasCopyright = True - if hasCopyright: - defaultcopyright = None - wroteLicense = False - skip = False - # write the file with the new slice - file = open(path, "w") - for line in lines: - if not wroteLicense: - if not hasLicense: - file.write("/**\n") - writeLicense(file, license, defaultcopyright) - wroteLicense = True - elif line.rstrip() == ' * @licstart': - writeLicense(file, license, defaultcopyright) - wroteLicense = True - skip = True - if skip: - if line.rstrip() == ' */': - skip = False - else: - file.write(line) - file.close() - -# get list of *.js files -jsfiles = [] -for root, directories, files in os.walk("."): - while "extjs" in directories: - directories.remove("extjs") - for f in files: - if f[-3:] == ".js": - jsfiles.append(os.path.abspath(os.path.join(root, f))) - -# remove webodf/lib/packackages.js since it is the source for the licenses -sourcefilepath = os.path.join(os.getcwd(), "webodf/lib/packages.js") -jsfiles.remove(sourcefilepath) - -licensetext = readLicense(sourcefilepath) -defaultcopyright = " * Copyright (C) 2011 KO GmbH \n" - -for f in jsfiles: - fixLicense(f, licensetext, defaultcopyright) diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl deleted file mode 100644 index 747e3e605b..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml deleted file mode 100644 index e2ad06941c..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml +++ /dev/null @@ -1,455 +0,0 @@ - - -

    ODF reference checker

    -

    ODF documents use string keys and references to link different parts of the document. There are quite a few different groups of keys. The description of how these keys work in the specification is not trivial to implement, because not keys behave differently depending on the context in which they are defined. E.g. a style has a family. If the family is 'text', then only certain attributes on certain elements in certain parts of the ODF document may refer to that style.

    -

    For a beginning and even intermediate ODF developer or document producer, this is quite complicated. Also, there is not currently an easy way to check if all the references are correct. This document aims to make it easier to figure out what groups of keys exist and from which elements they may be linked.

    -

    The document consists of one <key> element for each group of keys. Each group has a name and is defined by one or more XPath expressions in <def> elements. Any string that matches the XPath expression in a particular document is part of the set of keys of that group. Each key in a set must be unique.

    -

    In addition, each <key> has a number of <ref> elements that define the positions in the document where a key may be referenced. Each reference must exist in the set of keys that are found via the <def> elements.

    -

    The format of this document is designed to be easy to read but also to make it easy to use in a reference checker. This document comes with checked implemented in XSL. The XSL is called bootstrap.xsl and is used in two transformation steps. Here is shown how to run the check with xsltproc:

    -
    xsltproc bootstrap.xsl odfkeys.xml > checkkeys.xsl
    -
    xsltproc checkkeys.xsl content.xml
    -

    The check can be run on content.xml files, on styles.xml files and on flat ODF files.

    -

    Definitions

    -
    -
    $stylesfontfaces
    -
    This variable refers to the subset of font face definitions that are available to the style elements. Styles.xml may not refer to font faces defined in content.xml.
    -
    $fontfaces
    -
    This variable refers to all font face definitions.
    -
    $officestyles
    -
    This variable refers to the element office:styles.
    -
    $stylesautostyles
    -
    This variable refers to the element office:automatic-styles in styles.xml.
    -
    $contentautostyles
    -
    This variable refers to the element office:automatic-styles in content.xml. When evaluating a styles.xml document, it is an empty set.
    -
    $masterstyles
    -
    This variable refers to the office:master-styles element.
    -
    $body
    -
    This variable refers to the office:body element. When evaluating a styles.xml document, it is an empty set.
    -
    -

    TODO

    -
      -
    • implement <refs/> to check refs of type styleNameRefs
    • -
    • check for unused automatic styles
    • -
    • check that there are no circular dependencies in style inheritance
    • -
    -
    - - $officestyles/draw:gradient/@draw:name - $officestyles/svg:linearGradient/@draw:name - $officestyles/svg:radialGradient/@draw:name - $officestyles//@draw:fill-gradient-name - $stylesautostyles//@draw:fill-gradient-name - $contentautostyles//@draw:fill-gradient-name - - - $officestyles/draw:hatch/@draw:name - $officestyles//@draw:fill-hatch-name - $stylesautostyles//@draw:fill-hatch-name - $contentautostyles//@draw:fill-hatch-name - - - $officestyles/draw:fill-image/@draw:name - $officestyles//@draw:fill-image-name - $stylesautostyles//@draw:fill-image-name - $contentautostyles//@draw:fill-image-name - - - $officestyles/draw:marker/@draw:name - $officestyles//@draw:marker-start - $officestyles//@draw:marker-end - $stylesautostyles//@draw:marker-start - $stylesautostyles//@draw:marker-end - $contentautostyles//@draw:marker-start - $contentautostyles//@draw:marker-end - - - $officestyles/draw:stroke-dash/@draw:name - $officestyles//@draw:stroke-dash - $stylesautostyles//@draw:stroke-dash - $contentautostyles//@draw:stroke-dash - $officestyles//@draw:stroke-dash-names - $stylesautostyles//@draw:stroke-dash-names - $contentautostyles//@draw:stroke-dash-names - - - $officestyles/draw:opacity/@draw:name - $officestyles//@draw:opacity-name - $stylesautostyles//@draw:opacity-name - $contentautostyles//@draw:opacity-name - - - $stylesfontfaces/style:font-face/@style:name - $officestyles//style:text-properties/@style:font-name - $officestyles//style:text-properties/@style:font-name-asian - $officestyles//style:text-properties/@style:font-name-complex - $officestyles//style:list-level-properties/@style:font-name - $stylesautostyles//style:text-properties/@style:font-name - $stylesautostyles//style:text-properties/@style:font-name-asian - $stylesautostyles//style:text-properties/@style:font-name-complex - $stylesautostyles//style:list-level-properties/@style:font-name - - - $fontfaces/style:font-face/@style:name - $contentautostyles//style:text-properties/@style:font-name - $contentautostyles//style:text-properties/@style:font-name-asian - $contentautostyles//style:text-properties/@style:font-name-complex - $contentautostyles//style:list-level-properties/@style:font-name - - - $masterstyles/style:master-page/@style:name - - $body/office:drawing/draw:page/@draw:master-page-name - $body/office:presentation/draw:page/@draw:master-page-name - - $officestyles/style:style[@style:family='paragraph']/@style:master-page-name - $officestyles/style:style[@style:family='table']/@style:master-page-name - $stylesautostyles/style:style[@style:family='paragraph']/@style:master-page-name - $stylesautostyles/style:style[@style:family='table']/@style:master-page-name - $contentautostyles/style:style[@style:family='paragraph']/@style:master-page-name - $contentautostyles/style:style[@style:family='table']/@style:master-page-name - - $masterstyles/style:master-page/@style:next-style-name - - $officestyles/text:notes-configuration/@text:master-page-name - $officestyles/style:default-style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name - $officestyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name - $stylesautostyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name - $contentautostyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name - $body/office:text/text:page-sequence/text:page/@text:master-page-name - - - - $officestyles/style:presentation-page-layout/@style:name - $masterstyles/style:handout-master/@presentation:presentation-page-layout-name - $body/office:drawing/draw:page/@presentation:presentation-page-layout-name - $body/office:presentation/draw:page/@presentation:presentation-page-layout-name - - - $stylesautostyles/style:page-layout/@style:name - $masterstyles/style:master-page/@style:page-layout-name - $masterstyles/style:master-page/presentation:notes/@style:page-layout-name - $masterstyles/style:handout-master/@style:page-layout-name - - - $contentautostyles/style:page-layout/@style:name - $body/office:presentation/draw:page/presentation:notes/@style:page-layout-name - - - $officestyles/text:list-style/@style:name - $officestyles//style:graphic-properties/text:list-style/@style:name - $officestyles/style:style/@style:list-style-name - - - $stylesautostyles/text:list-style/@style:name - $stylesautostyles//style:graphic-properties/text:list-style/@style:name - $stylesautostyles/style:style/@style:list-style-name - $masterstyles//text:list/@text:style-name - $masterstyles//text:numbered-paragraphs/@text:style-name - $masterstyles//text:list-item/@text:style-override - - - $contentautostyles/text:list-style/@style:name - $contentautostyles//style:graphic-properties/text:list-style/@style:name - $contentautostyles/style:style/@style:list-style-name - $body//text:list/@text:style-name - $body//text:numbered-paragraphs/@text:style-name - $body//text:list-item/@text:style-override - - - $officestyles/number:number-style/@style:name - $officestyles/number:currency-style/@style:name - $officestyles/number:percentage-style/@style:name - $officestyles/number:date-style/@style:name - $officestyles/number:time-style/@style:name - $officestyles/number:boolean-style/@style:name - $officestyles/number:text-style/@style:name - $officestyles/style:style/@style:data-style-name - $officestyles/style:style/@style:percentage-data-style-name - - - $stylesautostyles/number:number-style/@style:name - $stylesautostyles/number:currency-style/@style:name - $stylesautostyles/number:percentage-style/@style:name - $stylesautostyles/number:date-style/@style:name - $stylesautostyles/number:time-style/@style:name - $stylesautostyles/number:boolean-style/@style:name - $stylesautostyles/number:text-style/@style:name - $stylesautostyles/style:style/@style:data-style-name - $stylesautostyles/style:style/@style:percentage-data-style-name - $masterstyles//text:creation-date/@style:data-style-name - $masterstyles//text:creation-time/@style:data-style-name - $masterstyles//text:database-display/@style:data-style-name - $masterstyles//text:date/@style:data-style-name - $masterstyles//text:editing-duration/@style:data-style-name - $masterstyles//text:expression/@style:data-style-name - $masterstyles//text:meta-field/@style:data-style-name - $masterstyles//text:modification-date/@style:data-style-name - $masterstyles//text:modification-time/@style:data-style-name - $masterstyles//text:print-date/@style:data-style-name - $masterstyles//text:print-time/@style:data-style-name - $masterstyles//text:table-formula/@style:data-style-name - $masterstyles//text:time/@style:data-style-name - $masterstyles//text:user-defined/@style:data-style-name - $masterstyles//text:user-field-get/@style:data-style-name - $masterstyles//text:user-field-input/@style:data-style-name - $masterstyles//text:variable-get/@style:data-style-name - $masterstyles//text:variable-input/@style:data-style-name - $masterstyles//text:variable-set/@style:data-style-name - - - $contentautostyles/number:number-style/@style:name - $contentautostyles/number:currency-style/@style:name - $contentautostyles/number:percentage-style/@style:name - $contentautostyles/number:date-style/@style:name - $contentautostyles/number:time-style/@style:name - $contentautostyles/number:boolean-style/@style:name - $contentautostyles/number:text-style/@style:name - $contentautostyles/style:style/@style:data-style-name - $contentautostyles/style:style/@style:percentage-data-style-name - $body/office:presentation/presentation:date-time-decl/@style:data-style-name - $body//text:creation-date/@style:data-style-name - $body//text:creation-time/@style:data-style-name - $body//text:database-display/@style:data-style-name - $body//text:date/@style:data-style-name - $body//text:editing-duration/@style:data-style-name - $body//text:expression/@style:data-style-name - $body//text:meta-field/@style:data-style-name - $body//text:modification-date/@style:data-style-name - $body//text:modification-time/@style:data-style-name - $body//text:print-date/@style:data-style-name - $body//text:print-time/@style:data-style-name - $body//text:table-formula/@style:data-style-name - $body//text:time/@style:data-style-name - $body//text:user-defined/@style:data-style-name - $body//text:user-field-get/@style:data-style-name - $body//text:user-field-input/@style:data-style-name - $body//text:variable-get/@style:data-style-name - $body//text:variable-input/@style:data-style-name - $body//text:variable-set/@style:data-style-name - - - $officestyles/style:style[@style:family='chart']/@style:name - $officestyles/style:style[@style:family='chart']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='chart']/@style:parent-style-name - $contentautostyles/style:style[@style:family='chart']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='chart']/@style:name - $masterstyles//chart:axis/@chart:style-name - $masterstyles//chart:chart/@chart:style-name - $masterstyles//chart:data-label/@chart:style-name - $masterstyles//chart:data-point/@chart:style-name - $masterstyles//chart:equation/@chart:style-name - $masterstyles//chart:error-indicator/@chart:style-name - $masterstyles//chart:floor/@chart:style-name - $masterstyles//chart:footer/@chart:style-name - $masterstyles//chart:grid/@chart:style-name - $masterstyles//chart:legend/@chart:style-name - $masterstyles//chart:mean-value/@chart:style-name - $masterstyles//chart:plot-area/@chart:style-name - $masterstyles//chart:regression-curve/@chart:style-name - $masterstyles//chart:series/@chart:style-name - $masterstyles//chart:stock-gain-marker/@chart:style-name - $masterstyles//chart:stock-loss-marker/@chart:style-name - $masterstyles//chart:stock-range-line/@chart:style-name - $masterstyles//chart:subtitle/@chart:style-name - $masterstyles//chart:title/@chart:style-name - $masterstyles//chart:wall/@chart:style-name - - - $contentautostyles/style:style[@style:family='chart']/@style:name - $body//chart:axis/@chart:style-name - $body//chart:chart/@chart:style-name - $body//chart:data-label/@chart:style-name - $body//chart:data-point/@chart:style-name - $body//chart:equation/@chart:style-name - $body//chart:error-indicator/@chart:style-name - $body//chart:floor/@chart:style-name - $body//chart:footer/@chart:style-name - $body//chart:grid/@chart:style-name - $body//chart:legend/@chart:style-name - $body//chart:mean-value/@chart:style-name - $body//chart:plot-area/@chart:style-name - $body//chart:regression-curve/@chart:style-name - $body//chart:series/@chart:style-name - $body//chart:stock-gain-marker/@chart:style-name - $body//chart:stock-loss-marker/@chart:style-name - $body//chart:stock-range-line/@chart:style-name - $body//chart:subtitle/@chart:style-name - $body//chart:title/@chart:style-name - $body//chart:wall/@chart:style-name - - - $officestyles/style:style[@style:family='ruby']/@style:name - $officestyles/style:style[@style:family='ruby']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='ruby']/@style:parent-style-name - $contentautostyles/style:style[@style:family='ruby']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='ruby']/@style:name - $masterstyles//text:ruby/@text:style-name - - - $contentautostyles/style:style[@style:family='ruby']/@style:name - $body//text:ruby/@text:style-name - - - - $officestyles/style:style[@style:family='text']/@style:name - $officestyles/style:style[@style:family='text']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='text']/@style:parent-style-name - $contentautostyles/style:style[@style:family='text']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='text']/@style:name - $masterstyles//text:span/@text:style-name - - - $contentautostyles/style:style[@style:family='text']/@style:name - $body//text:span/@text:style-name - - - $officestyles/style:style[@style:family='paragraph']/@style:name - $officestyles/style:style[@style:family='paragraph']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='paragraph']/@style:parent-style-name - $contentautostyles/style:style[@style:family='paragraph']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='paragraph']/@style:name - $masterstyles//text:p/@text:style-name - - - $contentautostyles/style:style[@style:family='paragraph']/@style:name - $body//text:p/@text:style-name - - - $officestyles/style:style[@style:family='section']/@style:name - $officestyles/style:style[@style:family='section']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='section']/@style:parent-style-name - $contentautostyles/style:style[@style:family='section']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='section']/@style:name - $masterstyles//text:alphabetical-index/@text:style-name - - - $contentautostyles/style:style[@style:family='section']/@style:name - $body//text:alphabetical-index/@text:style-name - - - - $officestyles/style:style[@style:family='table']/@style:name - $officestyles/style:style[@style:family='table']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='table']/@style:parent-style-name - $contentautostyles/style:style[@style:family='table']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='table']/@style:name - $masterstyles//table:table/@table:style-name - - - $contentautostyles/style:style[@style:family='table']/@style:name - $body//table:table/@table:style-name - - - - $officestyles/style:style[@style:family='table-column']/@style:name - $officestyles/style:style[@style:family='table-column']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='table-column']/@style:parent-style-name - $contentautostyles/style:style[@style:family='table-column']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='table-column']/@style:name - $masterstyles//table:table-column/@table:style-name - - - $contentautostyles/style:style[@style:family='table-column']/@style:name - $body//table:table-column/@table:style-name - - - - $officestyles/style:style[@style:family='table-row']/@style:name - $officestyles/style:style[@style:family='table-row']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='table-row']/@style:parent-style-name - $contentautostyles/style:style[@style:family='table-row']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='table-row']/@style:name - $masterstyles//table:table-row/@table:style-name - - - $contentautostyles/style:style[@style:family='table-row']/@style:name - $body//table:table-row/@table:style-name - - - - $officestyles/style:style[@style:family='table-cell']/@style:name - $officestyles/style:style[@style:family='table-cell']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='table-cell']/@style:parent-style-name - $contentautostyles/style:style[@style:family='table-cell']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='table-cell']/@style:name - $masterstyles//table:table-cell/@table:style-name - - - $contentautostyles/style:style[@style:family='table-cell']/@style:name - $body//table:table-cell/@table:style-name - - - - $officestyles/style:style[@style:family='graphic']/@style:name - $officestyles/style:style[@style:family='graphic']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='graphic']/@style:parent-style-name - $contentautostyles/style:style[@style:family='graphic']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='graphic']/@style:name - $masterstyles//draw:rect/@draw:style-name - - - $contentautostyles/style:style[@style:family='graphic']/@style:name - $body//draw:rect/@draw:style-name - - - - $officestyles/style:style[@style:family='presentation']/@style:name - $officestyles/style:style[@style:family='presentation']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='presentation']/@style:parent-style-name - $contentautostyles/style:style[@style:family='presentation']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='presentation']/@style:name - $masterstyles//draw:rect/@presentation:style-name - - - $contentautostyles/style:style[@style:family='presentation']/@style:name - $body//draw:rect/@presentation:style-name - - - - $officestyles/style:style[@style:family='drawing-page']/@style:name - $officestyles/style:style[@style:family='drawing-page']/@style:parent-style-name - $stylesautostyles/style:style[@style:family='drawing-page']/@style:parent-style-name - $contentautostyles/style:style[@style:family='drawing-page']/@style:parent-style-name - - - $stylesautostyles/style:style[@style:family='drawing-page']/@style:name - $masterstyles/style:handout-master/@draw:style-name - - - $contentautostyles/style:style[@style:family='drawing-page']/@style:name - $body/office:drawing/draw:page/@draw:style-name - $body/office:presentation/draw:page/@draw:style-name - - -
    diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js b/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js deleted file mode 100644 index c0d28dc77d..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global runtime: true, core: true*/ -runtime.loadClass("core.JSLint"); - -function checkWithJSLINT(file) { - "use strict"; - var i, jslint = new core.JSLint().JSLINT, - jslintconfig = { - anon: false, // true, if the space may be omitted in anonymous function declarations - bitwise: false, // if bitwise operators should be allowed - browser: false, // if the standard browser globals should be predefined - cap: false, // if upper case HTML should be allowed - 'continue': false, // if the continuation statement should be tolerated - css: false, // if CSS workarounds should be tolerated - debug: false, // if debugger statements should be allowed - devel: false, // if logging should be allowed (console, alert, etc.) - eqeq: false, // if == should be allowed - es5: false, // if ES5 syntax should be allowed - evil: false, // if eval should be allowed - forin: false, // if for in statements need not filter - fragment: false, // if HTML fragments should be allowed - indent: 4, // the indentation factor - maxerr: 10, // the maximum number of errors to allow - //maxlen: 300, // the maximum length of a source line - newcap: false, // if constructor names capitalization is ignored - node: false, // if Node.js globals should be predefined - nomen: false, // if names may have dangling _ - on: false, // if HTML event handlers should be allowed - passfail: true, // if the scan should stop on first error - plusplus: false, // if increment/decrement should be allowed - properties: false, // if all property names must be declared with /*properties*/ - regexp: false, // if the . should be allowed in regexp literals - rhino: false, // if the Rhino environment globals should be predefined - undef: false, // if variables can be declared out of order - unparam: false, // if unused parameters should be tolerated - safe: false, // if use of some browser features should be restricted - sloppy: false, // if the 'use strict'; pragma is optional - stupid: true, // true if stupid practices are tolerated - sub: false, // if all forms of subscript notation are tolerated - vars: false, // if multiple var statements per function should be allowed - white: true, // if sloppy whitespace is tolerated - widget: false, // if the Yahoo Widgets globals should be predefined - windows: false // if MS Windows-specific globals should be predefined - }, - data, result, err; - - // these files are an exception for now - if (file === "lib/core/RawInflate.js") { - return; - } - - data = runtime.readFileSync(file, "utf-8"); - result = jslint(data, jslintconfig); - if (!result) { - for (i = 0; i < jslint.errors.length && jslint.errors[i]; i += 1) { - err = jslint.errors[i]; - runtime.log(file + ":" + err.line + ":" + err.character + - ": error: " + err.reason); - } - runtime.exit(1); - } -} - -var i; -for (i = 0; i < arguments.length; i += 1) { - checkWithJSLINT(arguments[i]); -} diff --git a/apps/files_odfviewer/src/webodf/webodf/webodf.css b/apps/files_odfviewer/src/webodf/webodf/webodf.css deleted file mode 100644 index dbd6686a26..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/webodf.css +++ /dev/null @@ -1,200 +0,0 @@ -@namespace draw url(urn:oasis:names:tc:opendocument:xmlns:drawing:1.0); -@namespace fo url(urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0); -@namespace office url(urn:oasis:names:tc:opendocument:xmlns:office:1.0); -@namespace presentation url(urn:oasis:names:tc:opendocument:xmlns:presentation:1.0); -@namespace style url(urn:oasis:names:tc:opendocument:xmlns:style:1.0); -@namespace svg url(urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0); -@namespace table url(urn:oasis:names:tc:opendocument:xmlns:table:1.0); -@namespace text url(urn:oasis:names:tc:opendocument:xmlns:text:1.0); -@namespace runtimens url(urn:webodf); /* namespace for runtime only */ - -office|document > *, office|document-content > * { - display: none; -} -office|body, office|document { - display: inline-block; - position: relative; -} - -text|p, text|h { - display: block; - padding: 3px 3px 3px 3px; - margin: 5px 5px 5px 5px; -} -text|h { - font-weight: bold; -} -*[runtimens|containsparagraphanchor] { - position: relative; -} -text|s:before { /* this needs to be the number of spaces given by text:c */ - content: ' '; -} -text|tab:before { - display: inline; - content: ' '; -} -text|line-break { - content: " "; - display: block; -} -text|tracked-changes { - /*Consumers that do not support change tracking, should ignore changes.*/ - display: none; -} -office|binary-data { - display: none; -} -office|text { - display: block; - width: 216mm; /* default to A4 width */ - min-height: 279mm; - padding-left: 32mm; - padding-right: 32mm; - padding-top: 25mm; - padding-bottom: 13mm; - margin: 2px; - text-align: left; - overflow: hidden; -} -office|spreadsheet { - display: block; - border-collapse: collapse; - empty-cells: show; - font-family: sans-serif; - font-size: 10pt; - text-align: left; - page-break-inside: avoid; - overflow: hidden; -} -office|presentation { - display: inline-block; - text-align: left; -} -draw|page { - display: block; - height: 21cm; - width: 28cm; - margin: 3px; - position: relative; - overflow: hidden; -} -presentation|notes { - display: none; -} -@media print { - draw|page { - border: 1pt solid black; - page-break-inside: avoid; - } - presentation|notes { - /*TODO*/ - } -} -office|spreadsheet text|p { - border: 0px; - padding: 1px; - margin: 0px; -} -office|spreadsheet table|table { - margin: 3px; -} -office|spreadsheet table|table:after { - /* show sheet name the end of the sheet */ - /*content: attr(table|name);*/ /* gives parsing error in opera */ -} -office|spreadsheet table|table-row { - counter-increment: row; -} -office|spreadsheet table|table-row:before { - width: 3em; - background: #cccccc; - border: 1px solid black; - text-align: center; - content: counter(row); -} -office|spreadsheet table|table-cell { - border: 1px solid #cccccc; -} -table|table { - display: table; -} -draw|frame table|table { - width: 100%; - height: 100%; - background: white; -} -table|table-row { - display: table-row; -} -table|table-column { - display: table-column; -} -table|table-cell { - display: table-cell; -} -draw|frame { - display: block; -} -draw|image { - display: block; - width: 100%; - height: 100%; - top: 0px; - left: 0px; - background-repeat: no-repeat; - background-size: 100% 100%; - -moz-background-size: 100% 100%; -} -/* only show the first image in frame */ -draw|frame > draw|image:nth-of-type(n+2) { - display: none; -} -text|list { - display: block; - padding-left: 1.5em; - counter-reset: list; -} -text|list-item { - display: block; -} -text|list-item:before { - display: inline-block; - content: '•'; - counter-increment: list; - width: 0.5em; - margin-left: -0.5em; - padding: 0px; - border: 0px; -} -text|list-item > *:first-child { - display: inline-block; -} -text|a { - color: blue; - text-decoration: underline; -} -text|note-citation { - vertical-align: super; - font-size: smaller; -} -text|note-body { - display: none; -} -text|note:hover text|note-citation { - background: #dddddd; -} -text|note:hover text|note-body { - display: block; - left:1em; - max-width: 80%; - position: absolute; - background: #ffffaa; -} -svg|title, svg|desc { - display: none; -} -video { - width:100%; - height:100% -} diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js b/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js deleted file mode 100644 index e38c286aae..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (C) 2011 KO GmbH - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: http://gitorious.org/odfkit/webodf/ - */ -/*global Ext runtime gui*/ -runtime.loadClass("gui.XMLEdit"); - -function createXMLEdit(element, url) { - var head = element.ownerDocument.getElementsByTagName("head")[0], - xmlcss = element.ownerDocument.createElement("style"), - xmledt; - - xmlcss.type = "text/css"; - head.appendChild(xmlcss); - xmledt = new gui.XMLEdit(element, xmlcss); - runtime.loadXML(url, function (err, xml) { - if (xml.documentElement) { - xmledt.setXML(xml); - } - }); -} - -function loadXML(url, panel, title) { - title = title || url; - var tab = panel.find('url', url), - newTab; - if (tab.length) { - panel.setActiveTab(tab[0]); - return; - } - newTab = new Ext.BoxComponent({ - title: title, - tabTip: url, - url: url, - closable: true, - autoEl: { - tag: 'div' - }, - region: 'center' - }); - panel.add(newTab); - panel.setActiveTab(newTab); - - createXMLEdit(newTab.el.dom, url); -} - -Ext.onReady(function () { - var tabpanel, tree, viewport, attributeEditor; - - Ext.QuickTips.init(); - - tabpanel = new Ext.TabPanel({ - tbar: [ ], - region: 'center' - }); - - attributeEditor = new Ext.grid.PropertyGrid({ - title: 'Attributes', - region: 'east', - width: 200, - split: true, - autoScroll: true, - collapsible: true, - rootVisible: false, - enableTabScroll: true, - defaults: {autoScroll: true} - }); - - tree = new Ext.tree.TreePanel({ - title: 'Documents', - region: 'west', - width: 200, - split: true, - autoScroll: true, - collapsible: true, - rootVisible: false, - enableTabScroll: true, - defaults: {autoScroll: true}, - collapsed: true, - root: { nodeType: 'node' } - }); - - viewport = new Ext.Viewport({ - layout: 'border', - items: [ tabpanel, tree, attributeEditor ] - }); - - // load the xml - loadXML('requirements.xml', tabpanel); - loadXML('../content.xml', tabpanel); -}); diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html b/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html deleted file mode 100644 index dd6ae4942e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - XMLEdit - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd deleted file mode 100644 index 82cb8deb8f..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml deleted file mode 100644 index cbeae4ce7e..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - load xml document in a frame - - - show xml in a frame with a specified css - - - diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml b/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml deleted file mode 100644 index cad3f32470..0000000000 --- a/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - load xml document in a frame - - - show xml in a frame with a specified css - - - diff --git a/apps/files_pdfviewer/appinfo/app.php b/apps/files_pdfviewer/appinfo/app.php deleted file mode 100644 index e4771ee517..0000000000 --- a/apps/files_pdfviewer/appinfo/app.php +++ /dev/null @@ -1,8 +0,0 @@ - - - files_pdfviewer - PDF Viewer - Inline PDF viewer (pdfjs-based) - GPL - Joan Creus, Thomas Müller - 4 - true - - diff --git a/apps/files_pdfviewer/appinfo/version b/apps/files_pdfviewer/appinfo/version deleted file mode 100644 index ceab6e11ec..0000000000 --- a/apps/files_pdfviewer/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/apps/files_pdfviewer/css/history.png b/apps/files_pdfviewer/css/history.png deleted file mode 100644 index afa0e4ab70..0000000000 Binary files a/apps/files_pdfviewer/css/history.png and /dev/null differ diff --git a/apps/files_pdfviewer/css/viewer.css b/apps/files_pdfviewer/css/viewer.css deleted file mode 100644 index f9ce929d8b..0000000000 --- a/apps/files_pdfviewer/css/viewer.css +++ /dev/null @@ -1,267 +0,0 @@ -/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- / -/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */ - -#viewer { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif; - /*margin: 0px;*/ - padding: 0px; - /*position:absolute;*/ -} - -[hidden] { - display: none; -} - -#controls2 > a > img { - margin: 4px; - height: 10px; -} - -#controls2 > button { - line-height: 10px; -} - -#controls2 > button > img { - width: 10px; - height: 10px; -} - -#controls2 > button[disabled] > img { - opacity: 0.5; -} - -#pageNumber { - text-align: right; -} - -span#info { - display: none; -} - -@-moz-document regexp("http:.*debug=1.*") { - span#info { - display: inline-block; - } -} - -/* === Sidebar === */ -#sidebar { - position: fixed; - width: 350px; - top: 62px; - bottom: 18px; - left: -290px; - transition: left 0.25s ease-in-out 1s; - -moz-transition: left 0.25s ease-in-out 1s; - -webkit-transition: left 0.25s ease-in-out 1s; - z-index: 1; -} - -#sidebar:hover { - left: 0px; - transition: left 0.25s ease-in-out 0s; - -moz-transition: left 0.25s ease-in-out 0s; - -webkit-transition: left 0.25s ease-in-out 0s; -} - -#sidebarBox { - background-color: rgba(0, 0, 0, 0.7); - width: 300px; - height: 100%; - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; - -moz-border-radius-topright: 8px; - -moz-border-radius-bottomright: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - box-shadow: 0px 2px 8px #000; - -moz-box-shadow: 0px 2px 8px #000; - -webkit-box-shadow: 0px 2px 8px #000; -} - -#sidebarScrollView { - position: absolute; - overflow: hidden; - overflow-y: auto; - top: 10px; - bottom: 10px; - left: 10px; - width: 280px; -} - -.thumbnail { - width: 134px; - height: 134px; - margin-top: 5px; - margin-bottom: 5px; - margin-left:auto; - margin-right:auto; - line-height: 134px; - text-align: center; - overflow: hidden; -} - -.thumbnail:not([data-loaded]) { - background-color: gray; -} - -.thumbnail > canvas { - vertical-align: middle; - display: inline-block; -} - -#outlineScrollView { - position: absolute; - background-color: #fff; - overflow: auto; - top: 10px; - bottom: 10px; - left: 10px; - width: 280px; -} - -#outlineView { - padding-top: 4px; - padding-bottom: 100px; - padding-left: 6px; - padding-right: 6px; - font-size: smaller; -} - -.outlineItem > .outlineItems { - margin-left: 20px; -} - -.outlineItem > a { - text-decoration: none; - color: black; -} - -.outlineItem > a:hover { - background: #ff0; - box-shadow: 0px 2px 10px #ff0; -} - -#sidebarControls { - position:absolute; - width: 120px; - height: 32px; - left: 15px; - bottom: 35px; -} - -#sidebarControls > button { - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; - -webkit-box-shadow: 0px 4px 10px #000; -} - -#sidebarControls > button > img { - width: 32px; - height: 32px; -} - -#sidebarControls > button[disabled] > img { - opacity: 0.5; -} - -#sidebarControls > button[data-selected] { - box-shadow: 0px 4px 10px #ff0; - -moz-box-shadow: 0px 4px 10px #ff0; - -webkit-box-shadow: 0px 4px 10px #ff0; -} - -/* === Content view === */ -canvas { - margin: auto; - display: block; -} - -.page { - width: 816px; - height: 1056px; - margin: 10px auto; - position: relative; - overflow: hidden; - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; - -webkit-box-shadow: 0px 4px 10px #000; - background-color: white; -} - -.page > a { - display: block; - position: absolute; -} - -.page > a:hover { - opacity: 0.2; - background: #ff0; - box-shadow: 0px 2px 10px #ff0; - -moz-box-shadow: 0px 2px 10px #ff0; - -webkit-box-shadow: 0px 2px 10px #ff0; -} - -#viewer { - /*overflow:auto;*/ - margin: 6.3em 0 0 0; - margin-right:12.5em; - padding: 8px 0px; - position:static; - height:100%; - width:100%; - text-align:center; -} - -#sidebarView canvas:hover { - background: #ff0; - box-shadow: 0px 2px 10px #ff0; - -moz-box-shadow: 0px 2px 10px #ff0; - -webkit-box-shadow: 0px 2px 10px #ff0; -} - -#pageWidthOption { - border-top: 1px solid black; -} - -#customScaleOption { - display: none; -} - -/* === Printed media overrides === */ -@media print { - #sidebar { - display: none; - } - - #controls2 { - display: none; - } - - #viewer { - margin: 0; - padding: 0; - } - - .page { - display: none; - margin: 0; - } - - .page canvas { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - } - - .page[data-loaded] { - display: block; - page-break-after: always; - } -} - -#loading { - margin: 100px 0; - text-align: center; -} - diff --git a/apps/files_pdfviewer/js/pdfjs/LICENSE b/apps/files_pdfviewer/js/pdfjs/LICENSE deleted file mode 100644 index f8a8482057..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ - - Copyright (c) 2011 Mozilla Foundation - - Contributors: Andreas Gal - Chris G Jones - Shaon Barman - Vivien Nicolas <21@vingtetun.org> - Justin D'Arcangelo - Yury Delendik - Kalervo Kujala - Adil Allawi <@ironymark> - - 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. - diff --git a/apps/files_pdfviewer/js/pdfjs/README b/apps/files_pdfviewer/js/pdfjs/README deleted file mode 100644 index ec6a1e1ab1..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/README +++ /dev/null @@ -1,7 +0,0 @@ -Upstream (http://mozilla.github.com/pdf.js/) does not yet provide releases. -The latest version of git master can be taken from http://mozilla.github.com/pdf.js/build/pdf.js - -Please update pdf.js from time to time and test it! - - - diff --git a/apps/files_pdfviewer/js/pdfjs/build/pdf.js b/apps/files_pdfviewer/js/pdfjs/build/pdf.js deleted file mode 100644 index b1fc9d9747..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/build/pdf.js +++ /dev/null @@ -1,33830 +0,0 @@ -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -var PDFJS = {}; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - PDFJS.build = '2aae4fd'; - - // Files are inserted below - see Makefile -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window == 'undefined'); - -var ERRORS = 0, WARNINGS = 1, INFOS = 5; -var verbosity = WARNINGS; - -// The global PDFJS object exposes the API -// In production, it will be declared outside a global wrapper -// In development, it will be declared here -if (!globalScope.PDFJS) { - globalScope.PDFJS = {}; -} - -// getPdf() -// Convenience function to perform binary Ajax GET -// Usage: getPdf('http://...', callback) -// getPdf({ -// url:String , -// [,progress:Function, error:Function] -// }, -// callback) -function getPdf(arg, callback) { - var params = arg; - if (typeof arg === 'string') - params = { url: arg }; - - var xhr = new XMLHttpRequest(); - - xhr.open('GET', params.url); - - var headers = params.headers; - if (headers) { - for (var property in headers) { - if (typeof headers[property] === 'undefined') - continue; - - xhr.setRequestHeader(property, params.headers[property]); - } - } - - xhr.mozResponseType = xhr.responseType = 'arraybuffer'; - var protocol = params.url.indexOf(':') < 0 ? window.location.protocol : - params.url.substring(0, params.url.indexOf(':') + 1); - xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0; - - if ('progress' in params) - xhr.onprogress = params.progress || undefined; - - if ('error' in params) - xhr.onerror = params.error || undefined; - - xhr.onreadystatechange = function getPdfOnreadystatechange(e) { - if (xhr.readyState === 4) { - if (xhr.status === xhr.expected) { - var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || - xhr.responseArrayBuffer || xhr.response); - callback(data); - } else if (params.error) { - params.error(e); - } - } - }; - xhr.send(null); -} -globalScope.PDFJS.getPdf = getPdf; -globalScope.PDFJS.pdfBug = false; - -var Page = (function PageClosure() { - function Page(xref, pageNumber, pageDict, ref) { - this.pageNumber = pageNumber; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - - this.displayReadyPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - inheritPageProp: function Page_inheritPageProp(key) { - var dict = this.pageDict; - var obj = dict.get(key); - while (obj === undefined) { - dict = dict.get('Parent'); - if (!dict) - break; - obj = dict.get(key); - } - return obj; - }, - get content() { - return shadow(this, 'content', this.getPageProp('Contents')); - }, - get resources() { - return shadow(this, 'resources', this.inheritPageProp('Resources')); - }, - get mediaBox() { - var obj = this.inheritPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) - obj = [0, 0, 612, 792]; - return shadow(this, 'mediaBox', obj); - }, - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.inheritPageProp('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 annotations() { - return shadow(this, 'annotations', this.inheritPageProp('Annots')); - }, - get rotate() { - var rotate = this.inheritPageProp('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); - }, - - getOperatorList: function Page_getOperatorList(handler, dependency) { - var xref = this.xref; - var content = this.content; - var resources = this.resources; - if (isArray(content)) { - // fetching items - var streams = []; - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) - streams.push(xref.fetchIfRef(content[i])); - content = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - content.reset(); - } else if (!content) { - // replacing non-existent page content with empty one - content = new Stream(new Uint8Array(0)); - } - - var pe = this.pe = new PartialEvaluator( - xref, handler, 'p' + this.pageNumber + '_'); - - return pe.getOperatorList(content, resources, dependency); - }, - extractTextContent: function Page_extractTextContent() { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var xref = this.xref; - var content = xref.fetchIfRef(this.content); - var resources = xref.fetchIfRef(this.resources); - if (isArray(content)) { - // fetching items - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) - streams.push(xref.fetchIfRef(content[i])); - content = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - content.reset(); - } - - var pe = new PartialEvaluator( - xref, handler, 'p' + this.pageNumber + '_'); - return pe.getTextContent(content, resources); - }, - - ensureFonts: function Page_ensureFonts(fonts, callback) { - this.stats.time('Font Loading'); - // Convert the font names to the corresponding font obj. - for (var i = 0, ii = fonts.length; i < ii; i++) { - fonts[i] = this.objs.objs[fonts[i]].data; - } - - // Load all the fonts - FontLoader.bind( - fonts, - function pageEnsureFontsFontObjs(fontObjs) { - this.stats.timeEnd('Font Loading'); - - callback.call(this); - }.bind(this) - ); - }, - getLinks: function Page_getLinks() { - var links = []; - var annotations = pageGetAnnotations(); - var i, n = annotations.length; - for (i = 0; i < n; ++i) { - if (annotations[i].type != 'Link') - continue; - links.push(annotations[i]); - } - return links; - }, - getAnnotations: function Page_getAnnotations() { - var xref = this.xref; - function getInheritableProperty(annotation, name) { - var item = annotation; - while (item && !item.has(name)) { - item = item.get('Parent'); - } - if (!item) - return null; - return item.get(name); - } - function isValidUrl(url) { - if (!url) - return false; - var colon = url.indexOf(':'); - if (colon < 0) - return false; - var protocol = url.substr(0, colon); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - return true; - default: - return false; - } - } - - var annotations = this.annotations || []; - var i, n = annotations.length; - var items = []; - for (i = 0; i < n; ++i) { - var annotationRef = annotations[i]; - var annotation = xref.fetch(annotationRef); - if (!isDict(annotation)) - continue; - var subtype = annotation.get('Subtype'); - if (!isName(subtype)) - continue; - var rect = annotation.get('Rect'); - - var item = {}; - item.type = subtype.name; - item.rect = rect; - switch (subtype.name) { - case 'Link': - var a = annotation.get('A'); - if (a) { - switch (a.get('S').name) { - case 'URI': - var url = a.get('URI'); - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - if (!isValidUrl(url)) - url = ''; - item.url = url; - break; - case 'GoTo': - item.dest = a.get('D'); - break; - default: - TODO('other link types'); - } - } else if (annotation.has('Dest')) { - // simple destination link - var dest = annotation.get('Dest'); - item.dest = isName(dest) ? dest.name : dest; - } - break; - case 'Widget': - var fieldType = getInheritableProperty(annotation, 'FT'); - if (!isName(fieldType)) - break; - item.fieldType = fieldType.name; - // Building the full field name by collecting the field and - // its ancestors 'T' properties and joining them using '.'. - var fieldName = []; - var namedItem = annotation, ref = annotationRef; - while (namedItem) { - var parent = namedItem.get('Parent'); - var parentRef = namedItem.getRaw('Parent'); - var name = namedItem.get('T'); - if (name) { - fieldName.unshift(stringToPDFString(name)); - } else { - // 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; - } - item.fullName = fieldName.join('.'); - var alternativeText = stringToPDFString(annotation.get('TU') || ''); - item.alternativeText = alternativeText; - var da = getInheritableProperty(annotation, 'DA') || ''; - var m = /([\d\.]+)\sTf/.exec(da); - if (m) - item.fontSize = parseFloat(m[1]); - item.textAlignment = getInheritableProperty(annotation, 'Q'); - item.flags = getInheritableProperty(annotation, 'Ff') || 0; - break; - case 'Text': - var content = annotation.get('Contents'); - var title = annotation.get('T'); - item.content = stringToPDFString(content || ''); - item.title = stringToPDFString(title || ''); - item.name = !annotation.has('Name') ? 'Note' : - annotation.get('Name').name; - break; - default: - TODO('unimplemented annotation type: ' + subtype.name); - break; - } - items.push(item); - } - return items; - } - }; - - 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() { - function PDFDocument(arg, password) { - if (isStream(arg)) - init.call(this, arg, password); - else if (isArrayBuffer(arg)) - init.call(this, new Stream(arg), password); - else - error('PDFDocument: Unknown argument type'); - } - - function init(stream, password) { - assertWellFormed(stream.length > 0, 'stream must have data'); - this.stream = stream; - this.setup(password); - this.acroForm = this.catalog.catDict.get('AcroForm'); - } - - function find(stream, needle, limit, backwards) { - var pos = stream.pos; - var end = stream.end; - var str = ''; - if (pos + limit > end) - limit = end - pos; - for (var n = 0; n < limit; ++n) - str += stream.getChar(); - 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 */ - } - - PDFDocument.prototype = { - get linearization() { - var length = this.stream.length; - var linearization = false; - if (length) { - linearization = new Linearization(this.stream); - if (linearization.length != length) - linearization = false; - } - // 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.getChar(); - } while (Lexer.isSpace(ch)); - var str = ''; - while ((ch - '0') <= 9) { - str += ch; - ch = stream.getChar(); - } - 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(); - return; - } - // May not be a PDF file, continue anyway. - }, - setup: function PDFDocument_setup(password) { - this.checkHeader(); - var xref = new XRef(this.stream, - this.startXRef, - this.mainXRefEntriesOffset, - password); - this.xref = xref; - this.catalog = new Catalog(xref); - }, - get numPages() { - var linearization = this.linearization; - var num = linearization ? linearization.numPages : this.catalog.numPages; - // shadow the prototype getter - return shadow(this, 'numPages', num); - }, - getDocumentInfo: function PDFDocument_getDocumentInfo() { - var info; - if (this.xref.trailer.has('Info')) { - var infoDict = this.xref.trailer.get('Info'); - - info = {}; - infoDict.forEach(function(key, value) { - info[key] = typeof value !== 'string' ? value : - stringToPDFString(value); - }); - } - - return shadow(this, 'getDocumentInfo', info); - }, - getFingerprint: function PDFDocument_getFingerprint() { - var xref = this.xref, fileID; - if (xref.trailer.has('ID')) { - fileID = ''; - var id = xref.trailer.get('ID')[0]; - id.split('').forEach(function(el) { - fileID += Number(el.charCodeAt(0)).toString(16); - }); - } else { - // If we got no fileID, then we generate one, - // from the first 100 bytes of PDF - var data = this.stream.bytes.subarray(0, 100); - var hash = calculateMD5(data, 0, data.length); - fileID = ''; - for (var i = 0, length = hash.length; i < length; i++) { - fileID += Number(hash[i]).toString(16); - } - } - - return shadow(this, 'getFingerprint', fileID); - }, - getPage: function PDFDocument_getPage(n) { - return this.catalog.getPage(n); - } - }; - - return PDFDocument; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -// Use only for debugging purposes. This should not be used in any code that is -// in mozilla master. -function log(msg) { - if (console && console.log) - console.log(msg); - else if (print) - print(msg); -} - -// A notice for devs that will not trigger the fallback UI. 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 >= INFOS) { - log('Info: ' + msg); - PDFJS.LogManager.notify('info', msg); - } -} - -// Non-fatal warnings that should trigger the fallback UI. -function warn(msg) { - if (verbosity >= WARNINGS) { - log('Warning: ' + msg); - PDFJS.LogManager.notify('warn', msg); - } -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - log('Error: ' + msg); - log(backtrace()); - PDFJS.LogManager.notify('error', msg); - throw new Error(msg); -} - -// Missing features that should trigger the fallback UI. -function TODO(what) { - warn('TODO: ' + what); -} - -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); -} - -// In a well-formed PDF, |cond| holds. If it doesn't, subsequent -// behavior is undefined. -function assertWellFormed(cond, msg) { - if (!cond) - error(msg); -} - -var LogManager = PDFJS.LogManager = (function LogManagerClosure() { - var loggers = []; - return { - addLogger: function logManager_addLogger(logger) { - loggers.push(logger); - }, - notify: function(type, message) { - for (var i = 0, ii = loggers.length; i < ii; i++) { - var logger = loggers[i]; - if (logger[type]) - logger[type](message); - } - } - }; -})(); - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} - -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; -})(); - -function bytesToString(bytes) { - var str = ''; - var length = bytes.length; - for (var n = 0; n < length; ++n) - str += String.fromCharCode(bytes[n]); - return str; -} - -function stringToBytes(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) - bytes[n] = str.charCodeAt(n) & 0xFF; - return bytes; -} - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0; - return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; - }; - - Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) { - c = (new DeviceCmykCS()).getRgb([c, m, y, k]); - var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0; - return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; - }; - - // 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]; - }; - - 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] - ]; - } - - // 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; - }; - - return Util; -})(); - -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - function PageViewport(viewBox, scale, rotate, offsetX, 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; - switch (rotate) { - case -180: - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case -270: - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case -90: - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - case 360: - case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - 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.offsetX = offsetX; - this.offsetY = offsetY; - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = { - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - 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]]; - }, - 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, str2 = ''; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) - str2 += String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)); - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - str2 += code ? String.fromCharCode(code) : str.charAt(i); - } - } - return str2; -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -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 isNull(v) { - return v === null; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (!cmd || v.cmd == cmd); -} - -function isDict(v, type) { - return v instanceof Dict && (!type || v.get('Type').name == type); -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v == 'object' && v != null && ('getChar' in v); -} - -function isArrayBuffer(v) { - return typeof v == 'object' && v != null && ('byteLength' in v); -} - -function isRef(v) { - return v instanceof Ref; -} - -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'); -} - -/** - * 'Promise' object. - * Each object that is stored in PDFObjects is based on a Promise object that - * contains the status of the object and the data. There migth be situations, - * where a function want to use the value of an object, but it isn't ready at - * that time. To get a notification, once the object is ready to be used, s.o. - * can add a callback using the `then` method on the promise that then calls - * the callback once the object gets resolved. - * A promise can get resolved only once and only once the data of the promise - * can be set. If any of these happens twice or the data is required before - * it was set, an exception is throw. - */ -var Promise = PDFJS.Promise = (function PromiseClosure() { - var EMPTY_PROMISE = {}; - - /** - * If `data` is passed in this constructor, the promise is created resolved. - * If there isn't data, it isn't resolved at the beginning. - */ - function Promise(name, data) { - this.name = name; - this.isRejected = false; - this.error = null; - // If you build a promise and pass in some data it's already resolved. - if (data != null) { - this.isResolved = true; - this._data = data; - this.hasData = true; - } else { - this.isResolved = false; - this._data = EMPTY_PROMISE; - } - this.callbacks = []; - this.errbacks = []; - this.progressbacks = []; - }; - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {Promise[]} promises Array of promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var deferred = new Promise(); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - deferred.resolve(results); - return deferred; - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - promise.then((function(i) { - return function(value) { - results[i] = value; - unresolved--; - if (unresolved === 0) - deferred.resolve(results); - }; - })(i)); - } - return deferred; - }; - Promise.prototype = { - hasData: false, - - set data(value) { - if (value === undefined) { - return; - } - if (this._data !== EMPTY_PROMISE) { - error('Promise ' + this.name + - ': Cannot set the data of a promise twice'); - } - this._data = value; - this.hasData = true; - - if (this.onDataCallback) { - this.onDataCallback(value); - } - }, - - get data() { - if (this._data === EMPTY_PROMISE) { - error('Promise ' + this.name + ': Cannot get data that isn\'t set'); - } - return this._data; - }, - - onData: function Promise_onData(callback) { - if (this._data !== EMPTY_PROMISE) { - callback(this._data); - } else { - this.onDataCallback = callback; - } - }, - - resolve: function Promise_resolve(data) { - if (this.isResolved) { - error('A Promise can be resolved only once ' + this.name); - } - if (this.isRejected) { - error('The Promise was already rejected ' + this.name); - } - - this.isResolved = true; - this.data = (typeof data !== 'undefined') ? data : null; - var callbacks = this.callbacks; - - for (var i = 0, ii = callbacks.length; i < ii; i++) { - callbacks[i].call(null, data); - } - }, - - progress: function Promise_progress(data) { - var callbacks = this.progressbacks; - for (var i = 0, ii = callbacks.length; i < ii; i++) { - callbacks[i].call(null, data); - } - }, - - reject: function Promise_reject(reason, exception) { - if (this.isRejected) { - error('A Promise can be rejected only once ' + this.name); - } - if (this.isResolved) { - error('The Promise was already resolved ' + this.name); - } - - this.isRejected = true; - this.error = reason || null; - var errbacks = this.errbacks; - - for (var i = 0, ii = errbacks.length; i < ii; i++) { - errbacks[i].call(null, reason, exception); - } - }, - - then: function Promise_then(callback, errback, progressback) { - if (!callback) { - error('Requiring callback' + this.name); - } - - // If the promise is already resolved, call the callback directly. - if (this.isResolved) { - var data = this.data; - callback.call(null, data); - } else if (this.isRejected && errback) { - var error = this.error; - errback.call(null, error); - } else { - this.callbacks.push(callback); - if (errback) - this.errbacks.push(errback); - } - - if (progressback) - this.progressbacks.push(progressback); - } - }; - - return Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) - str += pad; - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) - return; - if (name in this.started) - throw '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)) - throw '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 times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (var i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) - longest = name.length; - } - for (var 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; -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -/** - * 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|TypedAray|object} source Can be an url to where a PDF is - * located, a typed array (Uint8Array) already populated with data or - * and parameter object with the following possible fields: - * - url - The URL of the PDF. - * - data - A typed array with PDF data. - * - httpHeaders - Basic authentication headers. - * - password - For decrypting password-protected PDFs. - * - * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object. - */ -PDFJS.getDocument = function getDocument(source) { - var url, data, headers, password, parameters = {}; - if (typeof source === 'string') { - url = source; - } else if (isArrayBuffer(source)) { - data = source; - } else if (typeof source === 'object') { - url = source.url; - data = source.data; - headers = source.httpHeaders; - password = source.password; - parameters.password = password || null; - - if (!url && !data) - error('Invalid parameter array, need either .data or .url'); - } else { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - - var promise = new PDFJS.Promise(); - var transport = new WorkerTransport(promise); - if (data) { - // assuming the data is array, instantiating directly from it - transport.sendData(data, parameters); - } else if (url) { - // fetch url - PDFJS.getPdf( - { - url: url, - progress: function getPDFProgress(evt) { - if (evt.lengthComputable) - promise.progress({ - loaded: evt.loaded, - total: evt.total - }); - }, - error: function getPDFError(e) { - promise.reject('Unexpected server response of ' + - e.target.status + '.'); - }, - headers: headers - }, - function getPDFLoad(data) { - transport.sendData(data, parameters); - }); - } - - return promise; -}; - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport) { - this.pdfInfo = pdfInfo; - this.transport = transport; - } - 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} The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(number) { - return this.transport.getPage(number); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - var promise = new PDFJS.Promise(); - var destinations = this.pdfInfo.destinations; - promise.resolve(destinations); - return promise; - }, - /** - * @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 array, - * dest: dest obj, - * items: array of more items like this - * }, - * ... - * ]. - */ - getOutline: function PDFDocumentProxy_getOutline() { - var promise = new PDFJS.Promise(); - var outline = this.pdfInfo.outline; - promise.resolve(outline); - return promise; - }, - /** - * @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() { - var promise = new PDFJS.Promise(); - var info = this.pdfInfo.info; - var metadata = this.pdfInfo.metadata; - promise.resolve({ - info: info, - metadata: metadata ? new PDFJS.Metadata(metadata) : null - }); - return promise; - }, - isEncrypted: function PDFDocumentProxy_isEncrypted() { - var promise = new PDFJS.Promise(); - promise.resolve(this.pdfInfo.encrypted); - return promise; - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - var promise = new PDFJS.Promise(); - this.transport.getData(promise); - return promise; - }, - destroy: function PDFDocumentProxy_destroy() { - this.transport.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageInfo, transport) { - this.pageInfo = pageInfo; - this.transport = transport; - this.stats = new StatTimer(); - this.stats.enabled = !!globalScope.PDFJS.enableStats; - this.objs = transport.objs; - this.renderInProgress = false; - } - PDFPageProxy.prototype = { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.pageInfo.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 PDFJS.PageViewport(this.view, scale, rotate, 0, 0); - }, - /** - * @return {Promise} A promise that is resolved with an {array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations() { - if (this.annotationsPromise) - return this.annotationsPromise; - - var promise = new PDFJS.Promise(); - this.annotationsPromise = promise; - this.transport.getAnnotations(this.pageInfo.pageIndex); - return promise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {object} params A parameter object that supports: - * { - * canvasContext(required): A 2D context of a DOM Canvas object., - * textLayer(optional): An object that has beginLayout, endLayout, and - * appendText functions. - * }. - * @return {Promise} A promise that is resolved when the page finishes - * rendering. - */ - render: function PDFPageProxy_render(params) { - this.renderInProgress = true; - - var promise = new Promise(); - var stats = this.stats; - stats.time('Overall'); - // If there is no displayReadyPromise yet, then the operatorList was never - // requested before. Make the request and create the promise. - if (!this.displayReadyPromise) { - this.displayReadyPromise = new Promise(); - this.destroyed = false; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1 - }); - } - - var self = this; - function complete(error) { - self.renderInProgress = false; - if (self.destroyed) { - delete self.operatorList; - delete self.displayReadyPromise; - } - - if (error) - promise.reject(error); - else - promise.resolve(); - }; - - // Once the operatorList and fonts are loaded, do the actual rendering. - this.displayReadyPromise.then( - function pageDisplayReadyPromise() { - if (self.destroyed) { - complete(); - return; - } - - var gfx = new CanvasGraphics(params.canvasContext, - this.objs, params.textLayer); - try { - this.display(gfx, params.viewport, complete); - } catch (e) { - complete(e); - } - }.bind(this), - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - return promise; - }, - /** - * For internal use only. - */ - startRenderingFromOperatorList: - function PDFPageProxy_startRenderingFromOperatorList(operatorList, - fonts) { - var self = this; - this.operatorList = operatorList; - - var displayContinuation = function pageDisplayContinuation() { - // Always defer call to display() to work around bug in - // Firefox error reporting from XHR callbacks. - setTimeout(function pageSetTimeout() { - self.displayReadyPromise.resolve(); - }); - }; - - this.ensureFonts(fonts, - function pageStartRenderingFromOperatorListEnsureFonts() { - displayContinuation(); - } - ); - }, - /** - * For internal use only. - */ - ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) { - this.stats.time('Font Loading'); - // Convert the font names to the corresponding font obj. - for (var i = 0, ii = fonts.length; i < ii; i++) { - fonts[i] = this.objs.objs[fonts[i]].data; - } - - // Load all the fonts - FontLoader.bind( - fonts, - function pageEnsureFontsFontObjs(fontObjs) { - this.stats.timeEnd('Font Loading'); - - callback.call(this); - }.bind(this) - ); - }, - /** - * For internal use only. - */ - display: function PDFPageProxy_display(gfx, viewport, callback) { - var stats = this.stats; - stats.time('Rendering'); - - gfx.beginDrawing(viewport); - - var startIdx = 0; - var length = this.operatorList.fnArray.length; - var operatorList = this.operatorList; - var stepper = null; - if (PDFJS.pdfBug && StepperManager.enabled) { - stepper = StepperManager.create(this.pageNumber - 1); - stepper.init(operatorList); - stepper.nextBreakPoint = stepper.getNextBreakPoint(); - } - - var self = this; - function next() { - startIdx = - gfx.executeOperatorList(operatorList, startIdx, next, stepper); - if (startIdx == length) { - gfx.endDrawing(); - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - if (callback) callback(); - } - } - next(); - }, - /** - * @return {Promise} That is resolved with the a {string} that is the text - * content from the page. - */ - getTextContent: function PDFPageProxy_getTextContent() { - var promise = new PDFJS.Promise(); - this.transport.messageHandler.send('GetTextContent', { - pageIndex: this.pageNumber - 1 - }, - function textContentCallback(textContent) { - promise.resolve(textContent); - } - ); - return promise; - }, - /** - * Stub for future feature. - */ - getOperationList: function PDFPageProxy_getOperationList() { - var promise = new PDFJS.Promise(); - var operationList = { // not implemented - dependencyFontsID: null, - operatorList: null - }; - promise.resolve(operationList); - return promise; - }, - /** - * Destroys resources allocated by the page. - */ - destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - - if (!this.renderInProgress) { - delete this.operatorList; - delete this.displayReadyPromise; - } - } - }; - return PDFPageProxy; -})(); -/** - * For internal use only. - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(promise) { - this.workerReadyPromise = promise; - this.objs = new PDFObjects(); - - this.pageCache = []; - this.pagePromises = []; - this.fontsLoading = {}; - - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fullfills - // 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 version 15. - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (typeof workerSrc === 'undefined') { - error('No PDFJS.workerSrc specified'); - } - - try { - var worker; - if (PDFJS.isFirefoxExtension) { - // The firefox extension can't load the worker from the resource:// - // url so we have to inline the script and then use the blob loader. - var bb = new MozBlobBuilder(); - bb.append(document.querySelector('#PDFJS_SCRIPT_TAG').textContent); - var blobUrl = window.URL.createObjectURL(bb.getBlob()); - worker = new Worker(blobUrl); - } else { - // Some versions of FF can't create a worker on localhost, see: - // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 - worker = new Worker(workerSrc); - } - - var messageHandler = new MessageHandler('main', worker); - this.messageHandler = messageHandler; - - messageHandler.on('test', function transportTest(supportTypedArray) { - if (supportTypedArray) { - this.worker = worker; - this.setupMessageHandler(messageHandler); - } else { - globalScope.PDFJS.disableWorker = true; - this.setupFakeWorker(); - } - }.bind(this)); - - var testObj = new Uint8Array(1); - // Some versions of Opera throw a DATA_CLONE_ERR on - // serializing the typed array. - messageHandler.send('test', testObj); - 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. - globalScope.PDFJS.disableWorker = true; - this.setupFakeWorker(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.worker) - this.worker.terminate(); - - this.pageCache = []; - this.pagePromises = []; - }, - setupFakeWorker: function WorkerTransport_setupFakeWorker() { - // If we don't use a worker, just post/sendMessage to the main thread. - var fakeWorker = { - postMessage: function WorkerTransport_postMessage(obj) { - fakeWorker.onmessage({data: obj}); - }, - terminate: function WorkerTransport_terminate() {} - }; - - var messageHandler = new MessageHandler('main', fakeWorker); - this.setupMessageHandler(messageHandler); - - // If the main thread is our worker, setup the handling for the messages - // the main thread sends to it self. - WorkerMessageHandler.setup(messageHandler); - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler(messageHandler) { - this.messageHandler = messageHandler; - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this); - this.pdfDocument = pdfDocument; - this.workerReadyPromise.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', function transportPassword(data) { - this.workerReadyPromise.reject(data.exception.message, data.exception); - }, this); - - messageHandler.on('IncorrectPassword', function transportBadPass(data) { - this.workerReadyPromise.reject(data.exception.message, data.exception); - }, this); - - messageHandler.on('GetPage', function transportPage(data) { - var pageInfo = data.pageInfo; - var page = new PDFPageProxy(pageInfo, this); - this.pageCache[pageInfo.pageIndex] = page; - var promise = this.pagePromises[pageInfo.pageIndex]; - promise.resolve(page); - }, this); - - messageHandler.on('GetAnnotations', function transportAnnotations(data) { - var annotations = data.annotations; - var promise = this.pageCache[data.pageIndex].annotationsPromise; - promise.resolve(annotations); - }, this); - - messageHandler.on('RenderPage', function transportRender(data) { - var page = this.pageCache[data.pageIndex]; - var depFonts = data.depFonts; - - page.stats.timeEnd('Page Request'); - page.startRenderingFromOperatorList(data.operatorList, depFonts); - }, this); - - messageHandler.on('obj', function transportObj(data) { - var id = data[0]; - var type = data[1]; - if (this.objs.hasData(id)) - return; - - switch (type) { - case 'JpegStream': - var imageData = data[2]; - loadJpegStream(id, imageData, this.objs); - break; - case 'Image': - var imageData = data[2]; - this.objs.resolve(id, imageData); - break; - case 'Font': - var name = data[2]; - var file = data[3]; - var properties = data[4]; - - if (file) { - // Rewrap the ArrayBuffer in a stream. - var fontFileDict = new Dict(); - file = new Stream(file, 0, file.length, fontFileDict); - } - - // At this point, only the font object is created but the font is - // not yet attached to the DOM. This is done in `FontLoader.bind`. - var font = new Font(name, file, properties); - this.objs.resolve(id, font); - break; - default: - error('Got unkown object type ' + type); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - var page = this.pageCache[data.pageNum - 1]; - if (page.displayReadyPromise) - page.displayReadyPromise.reject(data.error); - else - error(data.error); - }, this); - - messageHandler.on('JpegDecode', function(data, promise) { - var imageData = data[0]; - var components = data[1]; - if (components != 3 && components != 1) - error('Only 3 component or 1 component can be returned'); - - var img = new Image(); - img.onload = (function messageHandler_onloadClosure() { - 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; - - if (components == 3) { - for (var 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 (var i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - promise.resolve({ data: buf, width: width, height: height}); - }).bind(this); - var src = 'data:image/jpeg;base64,' + window.btoa(imageData); - img.src = src; - }); - }, - - sendData: function WorkerTransport_sendData(data, params) { - this.messageHandler.send('GetDocRequest', {data: data, params: params}); - }, - - getData: function WorkerTransport_sendData(promise) { - this.messageHandler.send('GetData', null, function(data) { - promise.resolve(data); - }); - }, - - getPage: function WorkerTransport_getPage(pageNumber, promise) { - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) - return this.pagePromises[pageIndex]; - var promise = new PDFJS.Promise('Page ' + pageNumber); - this.pagePromises[pageIndex] = promise; - this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex }); - return promise; - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { - this.messageHandler.send('GetAnnotationsRequest', - { pageIndex: pageIndex }); - } - }; - return WorkerTransport; - -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -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 -}; - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 1; - -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 on. - if (!ctx.mozCurrentTransform) { - // Store the original context - 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._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.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 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.fontMatrix = 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; - // Color spaces - this.fillColorSpace = new DeviceGrayCS(); - this.fillColorSpaceObj = null; - this.strokeColorSpace = new DeviceGrayCS(); - this.strokeColorSpaceObj = null; - this.fillColorObj = null; - this.strokeColorObj = null; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - - 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 kExecutionTime = 15; - - function CanvasGraphics(canvasCtx, objs, textLayer) { - this.ctx = canvasCtx; - this.current = new CanvasExtraState(); - this.stateStack = []; - this.pendingClip = null; - this.res = null; - this.xobjs = null; - this.objs = objs; - this.textLayer = textLayer; - if (canvasCtx) { - addContextCurrentTransform(canvasCtx); - } - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - slowCommands: { - 'stroke': true, - 'closeStroke': true, - 'fill': true, - 'eoFill': true, - 'fillStroke': true, - 'eoFillStroke': true, - 'closeFillStroke': true, - 'closeEOFillStroke': true, - 'showText': true, - 'showSpacedText': true, - 'setStrokeColorSpace': true, - 'setFillColorSpace': true, - 'setStrokeColor': true, - 'setStrokeColorN': true, - 'setFillColor': true, - 'setFillColorN': true, - 'setStrokeGray': true, - 'setFillGray': true, - 'setStrokeRGBColor': true, - 'setFillRGBColor': true, - 'setStrokeCMYKColor': true, - 'setFillCMYKColor': true, - 'paintJpegXObject': true, - 'paintImageXObject': true, - 'paintImageMaskXObject': true, - 'shadingFill': true - }, - - beginDrawing: function CanvasGraphics_beginDrawing(viewport) { - var transform = viewport.transform; - this.ctx.save(); - this.ctx.transform.apply(this.ctx, transform); - - if (this.textLayer) - this.textLayer.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 executionEndIdx; - var endTime = Date.now() + kExecutionTime; - - var objs = this.objs; - var fnName; - var slowCommands = this.slowCommands; - - while (true) { - if (stepper && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnName = fnArray[i]; - - if (fnName !== 'dependency') { - this[fnName].apply(this, argsArray[i]); - } else { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var depObjId = deps[n]; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objs.isResolved(depObjId)) { - objs.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, shedule - // to continue exeution after a short delay. - // However, this is only possible if a 'continueCallback' is passed in. - if (continueCallback && slowCommands[fnName] && Date.now() > endTime) { - setTimeout(continueCallback, 0); - return i; - } - - // If the operatorList isn't executed completely yet OR the execution - // time was short enough, do another execution round. - } - }, - - endDrawing: function CanvasGraphics_endDrawing() { - this.ctx.restore(); - - if (this.textLayer) - this.textLayer.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) { - this.ctx.mozDash = dashArray; - this.ctx.mozDashOffset = dashPhase; - this.ctx.webkitLineDash = dashArray; - this.ctx.webkitLineDashOffset = 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(state[1], state[2]); - break; - case 'CA': - this.current.strokeAlpha = state[1]; - break; - case 'ca': - this.current.fillAlpha = state[1]; - this.ctx.globalAlpha = state[1]; - break; - } - } - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - }, - restore: function CanvasGraphics_restore() { - var prev = this.stateStack.pop(); - if (prev) { - this.current = prev; - this.ctx.restore(); - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - }, - - // Path - moveTo: function CanvasGraphics_moveTo(x, y) { - this.ctx.moveTo(x, y); - this.current.setCurrentPoint(x, y); - }, - lineTo: function CanvasGraphics_lineTo(x, y) { - this.ctx.lineTo(x, y); - this.current.setCurrentPoint(x, y); - }, - curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) { - this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); - this.current.setCurrentPoint(x3, y3); - }, - curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) { - var current = this.current; - this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3); - current.setCurrentPoint(x3, y3); - }, - curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) { - this.curveTo(x1, y1, x3, y3, x3, y3); - this.current.setCurrentPoint(x3, y3); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - rectangle: function CanvasGraphics_rectangle(x, y, width, height) { - this.ctx.rect(x, y, width, height); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - if (this.current.lineWidth === 0) - ctx.lineWidth = this.getSinglePixelWidth(); - // 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); - 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; - - if (fillColor && fillColor.hasOwnProperty('type') && - fillColor.type === 'Pattern') { - ctx.save(); - ctx.fillStyle = fillColor.getPattern(ctx); - ctx.fill(); - ctx.restore(); - } else { - ctx.fill(); - } - if (consumePath) - this.consumePath(); - }, - eoFill: function CanvasGraphics_eoFill() { - var savedFillRule = this.setEOFillRule(); - this.fill(); - this.restoreFillRule(savedFillRule); - }, - fillStroke: function CanvasGraphics_fillStroke() { - this.fill(false); - this.stroke(false); - - this.consumePath(); - }, - eoFillStroke: function CanvasGraphics_eoFillStroke() { - var savedFillRule = this.setEOFillRule(); - this.fillStroke(); - this.restoreFillRule(savedFillRule); - }, - closeFillStroke: function CanvasGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() { - var savedFillRule = this.setEOFillRule(); - this.closePath(); - this.fillStroke(); - this.restoreFillRule(savedFillRule); - }, - 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.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - }, - 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.objs.get(fontRefName); - var current = this.current; - - if (!fontObj) - error('Can\'t find font for ' + fontRefName); - - // Slice-clone matrix so we can manipulate it without affecting original - if (fontObj.fontMatrix) - current.fontMatrix = fontObj.fontMatrix.slice(0); - else - current.fontMatrix = IDENTITY_MATRIX.slice(0); - - // 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). - // We implement this condition with fontMatrix. - if (size < 0) { - size = -size; - current.fontMatrix[0] *= -1; - current.fontMatrix[3] *= -1; - } - - this.current.font = fontObj; - this.current.fontSize = size; - - if (fontObj.coded) - return; // we don't need ctx.font for Type3 fonts - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - - var italic = fontObj.italic ? 'italic' : 'normal'; - var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif'; - var typeface = '"' + name + '", ' + serif; - - // 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 ? size : MIN_FONT_SIZE; - this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 : - size / MIN_FONT_SIZE; - - var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; - this.ctx.font = rule; - }, - setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) { - if (mode >= TextRenderingMode.FILL_ADD_TO_PATH) - TODO('unsupported text rendering mode: ' + mode); - this.current.textRenderingMode = mode; - }, - setTextRise: function CanvasGraphics_setTextRise(rise) { - TODO('text rise: ' + 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.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - applyTextTransforms: function CanvasGraphics_applyTextTransforms() { - var ctx = this.ctx; - var current = this.current; - var textHScale = current.textHScale; - var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; - - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.transform.apply(ctx, fontMatrix); - ctx.scale(textHScale, 1); - }, - getTextGeometry: function CanvasGraphics_getTextGeometry() { - var geometry = {}; - var ctx = this.ctx; - var font = this.current.font; - var ctxMatrix = ctx.mozCurrentTransform; - if (ctxMatrix) { - var bl = Util.applyTransform([0, 0], ctxMatrix); - var tr = Util.applyTransform([1, 1], ctxMatrix); - geometry.x = bl[0]; - geometry.y = bl[1]; - geometry.hScale = tr[0] - bl[0]; - geometry.vScale = tr[1] - bl[1]; - } - geometry.spaceWidth = font.spaceWidth; - return geometry; - }, - - showText: function CanvasGraphics_showText(str, skipTextSelection) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var glyphs = font.charsToGlyphs(str); - var fontSize = current.fontSize; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale; - var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; - var textHScale2 = textHScale * fontMatrix[0]; - var glyphsLength = glyphs.length; - var textLayer = this.textLayer; - var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; - var textSelection = textLayer && !skipTextSelection ? true : false; - var textRenderingMode = current.textRenderingMode; - - // Type3 fonts - each glyph is a "mini-PDF" - if (font.coded) { - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, 1); - - if (textSelection) { - this.save(); - ctx.scale(1, -1); - text.geom = this.getTextGeometry(); - this.restore(); - } - for (var i = 0; i < glyphsLength; ++i) { - - var glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - continue; - } - - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(glyph.operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - var width = transformed[0] * fontSize + - Util.sign(current.fontMatrix[0]) * charSpacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - - text.str += glyph.unicode; - text.length++; - text.canvasWidth += width; - } - ctx.restore(); - } else { - ctx.save(); - this.applyTextTransforms(); - - var lineWidth = current.lineWidth; - var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]); - if (scale == 0 || lineWidth == 0) - lineWidth = this.getSinglePixelWidth(); - else - lineWidth /= scale; - - if (textSelection) - text.geom = this.getTextGeometry(); - - if (fontSizeScale != 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0; - for (var i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += Util.sign(current.fontMatrix[0]) * wordSpacing; - continue; - } - - var character = glyph.fontChar; - var charWidth = glyph.width * fontSize * 0.001 + - Util.sign(current.fontMatrix[0]) * charSpacing; - - if (!glyph.disabled) { - var scaledX = x / fontSizeScale; - switch (textRenderingMode) { - default: // other unsupported rendering modes - case TextRenderingMode.FILL: - case TextRenderingMode.FILL_ADD_TO_PATH: - ctx.fillText(character, scaledX, 0); - break; - case TextRenderingMode.STROKE: - case TextRenderingMode.STROKE_ADD_TO_PATH: - ctx.strokeText(character, scaledX, 0); - break; - case TextRenderingMode.FILL_STROKE: - case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: - ctx.fillText(character, scaledX, 0); - ctx.strokeText(character, scaledX, 0); - break; - case TextRenderingMode.INVISIBLE: - break; - } - } - - x += charWidth; - - var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode; - var glyphUnicodeLength = glyphUnicode.length; - //reverse an arabic ligature - if (glyphUnicodeLength > 1 && - isRTLRangeFor(glyphUnicode.charCodeAt(0))) { - for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--) - text.str += glyphUnicode[ii]; - } else - text.str += glyphUnicode; - text.length += glyphUnicodeLength; - text.canvasWidth += charWidth; - } - current.x += x * textHScale2; - ctx.restore(); - } - - if (textSelection) - this.textLayer.appendText(text, font.loadedName, fontSize); - - return text; - }, - showSpacedText: function CanvasGraphics_showSpacedText(arr) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var textHScale = current.textHScale; - if (!font.coded) - textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0]; - var arrLength = arr.length; - var textLayer = this.textLayer; - var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; - var textSelection = textLayer ? true : false; - - if (textSelection) { - ctx.save(); - // Type3 fonts - each glyph is a "mini-PDF" (see also showText) - if (font.coded) { - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.scale(textHScale, 1); - } else - this.applyTextTransforms(); - text.geom = this.getTextGeometry(); - ctx.restore(); - } - - for (var i = 0; i < arrLength; ++i) { - var e = arr[i]; - if (isNum(e)) { - var spacingLength = -e * 0.001 * fontSize * textHScale; - current.x += spacingLength; - - if (textSelection) { - // Emulate precise spacing via HTML spaces - text.canvasWidth += spacingLength; - if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero - var numFakeSpaces = Math.round(-e / text.geom.spaceWidth); - if (numFakeSpaces > 0) { - text.str += '\u00A0'; - text.length++; - } - } - } - } else if (isString(e)) { - var shownText = this.showText(e, true); - - if (textSelection) { - if (shownText.str === ' ') { - text.str += '\u00A0'; - } else { - text.str += shownText.str; - } - text.canvasWidth += shownText.canvasWidth; - text.length += shownText.length; - } - } else { - error('TJ array element ' + e + ' is not string or num'); - } - } - - if (textSelection) - this.textLayer.appendText(text, font.loadedName, fontSize); - }, - nextLineShowText: function CanvasGraphics_nextLineShowText(text) { - this.nextLine(); - this.showText(text); - }, - nextLineSetSpacingShowText: - function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing, - charSpacing, - text) { - this.setWordSpacing(wordSpacing); - this.setCharSpacing(charSpacing); - this.nextLineShowText(text); - }, - - // 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.rectangle(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) { - this.current.strokeColorSpace = ColorSpace.fromIR(raw); - }, - setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) { - this.current.fillColorSpace = ColorSpace.fromIR(raw); - }, - setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) { - var cs = this.current.strokeColorSpace; - var rgbColor = cs.getRgb(arguments); - var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) { - if (IR[0] == 'TilingPattern') { - var args = IR[1]; - var base = cs.base; - var color; - if (base) { - var baseComps = base.numComps; - - color = []; - for (var i = 0; i < baseComps; ++i) - color.push(args[i]); - - color = base.getRgb(color); - } - var pattern = new TilingPattern(IR, color, this.ctx, this.objs); - } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') { - var pattern = Pattern.shadingFromIR(IR); - } else { - error('Unkown IR type ' + IR[0]); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - var cs = this.current.strokeColorSpace; - - if (cs.name == 'Pattern') { - this.current.strokeColor = this.getColorN_Pattern(arguments, cs); - } else { - this.setStrokeColor.apply(this, arguments); - } - }, - setFillColor: function CanvasGraphics_setFillColor(/*...*/) { - var cs = this.current.fillColorSpace; - var rgbColor = cs.getRgb(arguments); - var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - var cs = this.current.fillColorSpace; - - if (cs.name == 'Pattern') { - this.current.fillColor = this.getColorN_Pattern(arguments, cs); - } else { - this.setFillColor.apply(this, arguments); - } - }, - setStrokeGray: function CanvasGraphics_setStrokeGray(gray) { - if (!(this.current.strokeColorSpace instanceof DeviceGrayCS)) - this.current.strokeColorSpace = new DeviceGrayCS(); - - var color = Util.makeCssRgb(gray, gray, gray); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillGray: function CanvasGraphics_setFillGray(gray) { - if (!(this.current.fillColorSpace instanceof DeviceGrayCS)) - this.current.fillColorSpace = new DeviceGrayCS(); - - var color = Util.makeCssRgb(gray, gray, gray); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - if (!(this.current.strokeColorSpace instanceof DeviceRgbCS)) - this.current.strokeColorSpace = new DeviceRgbCS(); - - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - if (!(this.current.fillColorSpace instanceof DeviceRgbCS)) - this.current.fillColorSpace = new DeviceRgbCS(); - - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) { - if (!(this.current.strokeColorSpace instanceof DeviceCmykCS)) - this.current.strokeColorSpace = new DeviceCmykCS(); - - var color = Util.makeCssCmyk(c, m, y, k); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) { - if (!(this.current.fillColorSpace instanceof DeviceCmykCS)) - this.current.fillColorSpace = new DeviceCmykCS(); - - var color = Util.makeCssCmyk(c, m, y, k); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = Pattern.shadingFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx); - - 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(); - - if (matrix && isArray(matrix) && 6 == matrix.length) - this.transform.apply(this, matrix); - - if (bbox && isArray(bbox) && 4 == bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.rectangle(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - }, - - paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { - var domImage = this.objs.get(objId); - if (!domImage) { - error('Dependent image isn\'t ready yet'); - } - - 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); - - this.restore(); - }, - - paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject( - imgArray, inverseDecode, width, height) { - function applyStencilMask(buffer, inverseDecode) { - var imgArrayPos = 0; - var i, j, mask, buf; - // removing making non-masked pixels transparent - var bufferPos = 3; // alpha component offset - for (i = 0; i < height; i++) { - mask = 0; - for (j = 0; j < width; j++) { - if (!mask) { - buf = imgArray[imgArrayPos++]; - mask = 128; - } - if (!(buf & mask) == inverseDecode) { - buffer[bufferPos] = 0; - } - bufferPos += 4; - mask >>= 1; - } - } - } - function rescaleImage(pixels, widthScale, heightScale) { - var scaledWidth = Math.ceil(width / widthScale); - var scaledHeight = Math.ceil(height / heightScale); - - var itemsSum = new Uint32Array(scaledWidth * scaledHeight * 4); - var itemsCount = new Uint32Array(scaledWidth * scaledHeight); - for (var i = 0, position = 0; i < height; i++) { - var lineOffset = (0 | (i / heightScale)) * scaledWidth; - for (var j = 0; j < width; j++) { - var countOffset = lineOffset + (0 | (j / widthScale)); - var sumOffset = countOffset << 2; - itemsSum[sumOffset] += pixels[position]; - itemsSum[sumOffset + 1] += pixels[position + 1]; - itemsSum[sumOffset + 2] += pixels[position + 2]; - itemsSum[sumOffset + 3] += pixels[position + 3]; - itemsCount[countOffset]++; - position += 4; - } - } - var tmpCanvas = createScratchCanvas(scaledWidth, scaledHeight); - var tmpCtx = tmpCanvas.getContext('2d'); - var imgData = tmpCtx.getImageData(0, 0, scaledWidth, scaledHeight); - pixels = imgData.data; - for (var i = 0, j = 0, ii = scaledWidth * scaledHeight; i < ii; i++) { - var count = itemsCount[i]; - pixels[j] = itemsSum[j] / count; - pixels[j + 1] = itemsSum[j + 1] / count; - pixels[j + 2] = itemsSum[j + 2] / count; - pixels[j + 3] = itemsSum[j + 3] / count; - j += 4; - } - tmpCtx.putImageData(imgData, 0, 0); - return tmpCanvas; - } - - this.save(); - - var ctx = this.ctx; - var w = width, h = height; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - var tmpCanvas = createScratchCanvas(w, h); - var tmpCtx = tmpCanvas.getContext('2d'); - - var fillColor = this.current.fillColor; - tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') && - fillColor.type === 'Pattern') ? - fillColor.getPattern(tmpCtx) : fillColor; - tmpCtx.fillRect(0, 0, w, h); - - var imgData = tmpCtx.getImageData(0, 0, w, h); - var pixels = imgData.data; - - applyStencilMask(pixels, inverseDecode); - - var currentTransform = ctx.mozCurrentTransformInverse; - var widthScale = Math.max(Math.abs(currentTransform[0]), 1); - var heightScale = Math.max(Math.abs(currentTransform[3]), 1); - if (widthScale >= 2 || heightScale >= 2) { - // canvas does not resize well large images to small -- using simple - // algorithm to perform pre-scaling - tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); - ctx.scale(widthScale, heightScale); - ctx.drawImage(tmpCanvas, 0, -h / heightScale); - } else { - tmpCtx.putImageData(imgData, 0, 0); - ctx.drawImage(tmpCanvas, 0, -h); - } - this.restore(); - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) - error('Dependent image isn\'t ready yet'); - - this.save(); - var ctx = this.ctx; - var w = imgData.width; - var h = imgData.height; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - var tmpCanvas = createScratchCanvas(w, h); - var tmpCtx = tmpCanvas.getContext('2d'); - this.putBinaryImageData(tmpCtx, imgData, w, h); - - ctx.drawImage(tmpCanvas, 0, -h); - this.restore(); - }, - - putBinaryImageData: function CanvasGraphics_putBinaryImageData() { - // - }, - - // 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() { - if (this.pendingClip) { - var savedFillRule = null; - if (this.pendingClip == EO_CLIP) - savedFillRule = this.setEOFillRule(); - - this.ctx.clip(); - - this.pendingClip = null; - if (savedFillRule !== null) - this.restoreFillRule(savedFillRule); - } - this.ctx.beginPath(); - }, - // We generally keep the canvas context set for - // nonzero-winding, and just set evenodd for the operations - // that need them. - setEOFillRule: function CanvasGraphics_setEOFillRule() { - var savedFillRule = this.ctx.mozFillRule; - this.ctx.mozFillRule = 'evenodd'; - return savedFillRule; - }, - restoreFillRule: function CanvasGraphics_restoreFillRule(rule) { - this.ctx.mozFillRule = rule; - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - var inverse = this.ctx.mozCurrentTransformInverse; - return Math.abs(inverse[0] + inverse[2]); - } - }; - - return CanvasGraphics; -})(); - -if (!isWorker) { - // Feature detection if the browser can use an Uint8Array directly as imgData. - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - try { - ctx.putImageData({ - width: 1, - height: 1, - data: new Uint8Array(4) - }, 0, 0); - - CanvasGraphics.prototype.putBinaryImageData = - function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) { - ctx.putImageData(imgData, 0, 0); - }; - } catch (e) { - CanvasGraphics.prototype.putBinaryImageData = - function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) { - var tmpImgData = ctx.getImageData(0, 0, w, h); - - // Copy over the imageData pixel by pixel. - var tmpImgDataPixels = tmpImgData.data; - var len = tmpImgDataPixels.length; - - while (len--) { - tmpImgDataPixels[len] = imgData.data[len]; - } - - ctx.putImageData(tmpImgData, 0, 0); - }; - } -} - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - return Name; -})(); - -var Cmd = (function CmdClosure() { - function Cmd(cmd) { - this.cmd = cmd; - } - - Cmd.prototype = {}; - - var cmdCache = {}; - - Cmd.get = function Cmd_get(cmd) { - var cmdValue = cmdCache[cmd]; - if (cmdValue) - return cmdValue; - - return cmdCache[cmd] = new Cmd(cmd); - }; - - return Cmd; -})(); - -var Dict = (function DictClosure() { - // xref is optional - function Dict(xref) { - // Map should only be used internally, use functions below to access. - var map = Object.create(null); - - this.assignXref = function Dict_assignXref(newXref) { - xref = newXref; - }; - - // automatically dereferences Ref objects - this.get = function Dict_get(key1, key2, key3) { - var value; - if (typeof (value = map[key1]) != 'undefined' || key1 in map || - typeof key2 == 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - if (typeof (value = map[key2]) != 'undefined' || key2 in map || - typeof key3 == 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - value = map[key3] || null; - return xref ? xref.fetchIfRef(value) : value; - }; - - // no dereferencing - this.getRaw = function Dict_getRaw(key) { - return map[key]; - }; - - // creates new map and dereferences all Refs - this.getAll = function Dict_getAll() { - var all = {}; - for (var key in map) { - var obj = this.get(key); - all[key] = obj instanceof Dict ? obj.getAll() : obj; - } - return all; - }; - - this.set = function Dict_set(key, value) { - map[key] = value; - }; - - this.has = function Dict_has(key) { - return key in map; - }; - - this.forEach = function Dict_forEach(callback) { - for (var key in map) { - callback(key, this.get(key)); - } - }; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = {}; - - 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 = {}; - } - - RefSet.prototype = { - has: function RefSet_has(ref) { - return !!this.dict['R' + ref.num + '.' + ref.gen]; - }, - - put: function RefSet_put(ref) { - this.dict['R' + ref.num + '.' + ref.gen] = ref; - } - }; - - return RefSet; -})(); - -var Catalog = (function CatalogClosure() { - function Catalog(xref) { - this.xref = xref; - var obj = xref.getCatalogObj(); - assertWellFormed(isDict(obj), 'catalog object is not a dictionary'); - this.catDict = obj; - } - - 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'); - assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary'); - // shadow the prototype getter - return shadow(this, 'toplevelPagesDict', pagesObj); - }, - get documentOutline() { - var xref = this.xref; - var obj = this.catDict.get('Outlines'); - var root = { items: [] }; - if (isDict(obj)) { - obj = obj.getRaw('First'); - var processed = new RefSet(); - if (isRef(obj)) { - var queue = [{obj: obj, parent: root}]; - // to avoid recursion keeping track of the items - // in the processed dictionary - processed.put(obj); - while (queue.length > 0) { - var i = queue.shift(); - var outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) - continue; - if (!outlineDict.has('Title')) - error('Invalid outline item'); - var dest = outlineDict.get('A'); - if (dest) - dest = dest.get('D'); - else if (outlineDict.has('Dest')) { - dest = outlineDict.getRaw('Dest'); - if (isName(dest)) - dest = dest.name; - } - var title = outlineDict.get('Title'); - var outlineItem = { - dest: dest, - title: stringToPDFString(title), - color: outlineDict.get('C') || [0, 0, 0], - count: outlineDict.get('Count'), - bold: !!(outlineDict.get('F') & 2), - italic: !!(outlineDict.get('F') & 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); - } - } - } - } - obj = root.items.length > 0 ? root.items : null; - return shadow(this, 'documentOutline', obj); - }, - get numPages() { - var obj = this.toplevelPagesDict.get('Count'); - assertWellFormed( - isInt(obj), - 'page count in top level pages object is not an integer' - ); - // shadow the prototype getter - return shadow(this, 'num', obj); - }, - traverseKids: function Catalog_traverseKids(pagesDict) { - var pageCache = this.pageCache; - var kids = pagesDict.get('Kids'); - assertWellFormed(isArray(kids), - 'page dictionary kids object is not an array'); - for (var i = 0, ii = kids.length; i < ii; ++i) { - var kid = kids[i]; - assertWellFormed(isRef(kid), - 'page dictionary kid is not a reference'); - var obj = this.xref.fetch(kid); - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - pageCache.push(new Page(this.xref, pageCache.length, obj, kid)); - } else { // must be a child page dictionary - assertWellFormed( - isDict(obj), - 'page dictionary kid reference points to wrong type of object' - ); - this.traverseKids(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) - 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) { - // reading name tree - var processed = new RefSet(); - processed.put(nameTreeRef); - var queue = [nameTreeRef]; - while (queue.length > 0) { - var i, n; - obj = xref.fetch(queue.shift()); - if (obj.has('Kids')) { - var kids = obj.get('Kids'); - for (i = 0, n = kids.length; i < n; i++) { - var kid = kids[i]; - if (processed.has(kid)) - error('invalid destinations'); - queue.push(kid); - processed.put(kid); - } - continue; - } - var names = obj.get('Names'); - for (i = 0, n = names.length; i < n; i += 2) { - dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1])); - } - } - } - return shadow(this, 'destinations', dests); - }, - getPage: function Catalog_getPage(n) { - var pageCache = this.pageCache; - if (!pageCache) { - pageCache = this.pageCache = []; - this.traverseKids(this.toplevelPagesDict); - } - return this.pageCache[n - 1]; - } - }; - - return Catalog; -})(); - -var XRef = (function XRefClosure() { - function XRef(stream, startXRef, mainXRefEntriesOffset, password) { - this.stream = stream; - this.entries = []; - this.xrefstms = {}; - var trailerDict = this.readXRef(startXRef); - trailerDict.assignXref(this); - this.trailer = trailerDict; - // prepare the XRef cache - this.cache = []; - - var encrypt = trailerDict.get('Encrypt'); - if (encrypt) { - var fileId = trailerDict.get('ID'); - this.encrypt = new CipherTransformFactory(encrypt, fileId[0], password); - } - - // get the root dictionary (catalog) object - if (!(this.root = trailerDict.get('Root'))) - error('Invalid root reference'); - } - - XRef.prototype = { - 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 - // ... - - // Outer loop is over subsection headers - var obj; - while (!isCmd(obj = parser.getObj(), 'trailer')) { - var first = obj, - count = parser.getObj(); - - if (!isInt(first) || !isInt(count)) - error('Invalid XRef table: wrong types in subsection header'); - - // Inner loop is over objects themselves - for (var i = 0; i < count; i++) { - 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; - } - } - - // 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'); - - // 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(); - if (!isDict(dict)) - error('Invalid XRef table: could not parse trailer dictionary'); - - return dict; - }, - readXRefStream: function XRef_readXRefStream(stream) { - var streamParameters = stream.parameters; - var byteWidths = streamParameters.get('W'); - var range = streamParameters.get('Index'); - if (!range) - range = [0, streamParameters.get('Size')]; - var i, j; - while (range.length > 0) { - var first = range[0], n = range[1]; - if (!isInt(first) || !isInt(n)) - error('Invalid XRef range fields: ' + first + ', ' + n); - var typeFieldWidth = byteWidths[0]; - var offsetFieldWidth = byteWidths[1]; - var generationFieldWidth = byteWidths[2]; - if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || - !isInt(generationFieldWidth)) { - error('Invalid XRef entry fields length: ' + first + ', ' + n); - } - for (i = 0; i < n; ++i) { - 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 = 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; - } - range.splice(0, 2); - } - return streamParameters; - }, - indexObjects: function XRef_indexObjects() { - // Simple scan through the PDF content to find objects, - // trailers and XRef streams. - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== 13 && ch !== 10) { - 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 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]); - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - var state = 0; - var currentToken; - while (position < length) { - var ch = buffer[position]; - if (ch === 32 || ch === 9 || ch === 13 || ch === 10) { - ++position; - continue; - } - if (ch === 37) { // %-comment - do { - ++position; - ch = buffer[position]; - } while (ch !== 13 && ch !== 10); - continue; - } - var token = readToken(buffer, position); - var m; - if (token === 'xref') { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) { - this.entries[m[1]] = { - offset: position, - 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); - this.xrefstms[position] = 1; // don't read it recursively - } - - position += contentLength; - } else - position += token.length + 1; - } - // reading XRef streams - for (var i = 0, ii = xrefStms.length; i < ii; ++i) { - this.readXRef(xrefStms[i], true); - } - // finding main trailer - var dict; - for (var i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), true, null); - 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 - error('Invalid PDF structure'); - }, - readXRef: function XRef_readXRef(startXRef, recoveryMode) { - var stream = this.stream; - stream.pos = startXRef; - - try { - var parser = new Parser(new Lexer(stream), true, null); - var obj = parser.getObj(); - var dict; - - // Get dictionary - if (isCmd(obj, 'xref')) { - // Parse end-of-file XRef - dict = this.readXRefTable(parser); - - // 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.readXRef(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.readXRefStream(obj); - if (!dict) - error('Failed to read XRef stream'); - } - - // Recursively get previous dictionary, if any - obj = dict.get('Prev'); - if (isInt(obj)) - this.readXRef(obj, recoveryMode); - 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.readXRef(obj.num, recoveryMode); - } - - return dict; - } catch (e) { - log('(while reading XRef): ' + e); - } - - if (recoveryMode) - return; - - warn('Indexing all PDF objects'); - return this.indexObjects(); - }, - getEntry: function XRef_getEntry(i) { - var e = this.entries[i]; - if (e === null) - return null; - return e.free ? null : e; // returns null is the entry is free - }, - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) - return obj; - return this.fetch(obj); - }, - fetch: function XRef_fetch(ref, suppressEncryption) { - assertWellFormed(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) - return this.cache[num]; - - var e = this.getEntry(num); - - // the referenced entry can be free - if (e === null) - return (this.cache[num] = e); - - var gen = ref.gen; - var stream, parser; - if (e.uncompressed) { - if (e.gen != gen) - error('inconsistent generation in XRef'); - stream = this.stream.makeSubStream(e.offset); - parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || obj1 != num || - !isInt(obj2) || obj2 != 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) { - try { - e = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } catch (ex) { - // almost all streams must be encrypted, but sometimes - // they are not probably due to some broken generators - // re-trying without encryption - return this.fetch(ref, true); - } - } else { - e = parser.getObj(); - } - // Don't cache streams since they are mutable (except images). - if (!isStream(e) || e instanceof JpegStream) - this.cache[num] = e; - return e; - } - - // compressed entry - stream = this.fetch(new Ref(e.offset, 0)); - if (!isStream(stream)) - error('bad ObjStm stream'); - var first = stream.parameters.get('First'); - var n = stream.parameters.get('N'); - if (!isInt(first) || !isInt(n)) { - error('invalid first and n parameters for ObjStm stream'); - } - parser = new Parser(new Lexer(stream), false, this); - var i, entries = [], 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()); - this.cache[nums[i]] = entries[i]; - } - e = entries[e.gen]; - if (!e) { - error('bad XRef entry for compressed object'); - } - return e; - }, - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * 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. - */ -var PDFObjects = (function PDFObjectsClosure() { - function PDFObjects() { - this.objs = {}; - } - - PDFObjects.prototype = { - objs: null, - - /** - * Internal function. - * Ensures there is an object defined for `objId`. Stores `data` on the - * object *if* it is created. - */ - ensureObj: function PDFObjects_ensureObj(objId, data) { - if (this.objs[objId]) - return this.objs[objId]; - return this.objs[objId] = new Promise(objId, data); - }, - - /** - * 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).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.isResolved) - 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 objs = this.objs; - - // In case there is a promise already on this object, just resolve it. - if (objs[objId]) { - objs[objId].resolve(data); - } else { - this.ensureObj(objId, data); - } - }, - - onData: function PDFObjects_onData(objId, callback) { - this.ensureObj(objId).onData(callback); - }, - - isResolved: function PDFObjects_isResolved(objId) { - var objs = this.objs; - if (!objs[objId]) { - return false; - } else { - return objs[objId].isResolved; - } - }, - - hasData: function PDFObjects_hasData(objId) { - var objs = this.objs; - if (!objs[objId]) { - return false; - } else { - return objs[objId].hasData; - } - }, - - /** - * Sets the data of an object but *doesn't* resolve it. - */ - setData: function PDFObjects_setData(objId, data) { - // Watchout! If you call `this.ensureObj(objId, data)` you're going to - // create a *resolved* promise which shouldn't be the case! - this.ensureObj(objId).data = data; - } - }; - return PDFObjects; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -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 length = 1; - for (var i = 0, ii = size.length; i < ii; i++) - length *= size[i]; - length *= outputSize; - - var array = []; - 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 (var i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array.push((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); - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - var outputLength = arr.length / 2; - 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'); - if (!order) - order = 1; - if (order !== 1) - error('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(args) { - // 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]; - - if (m != args.length) - error('Incorrect number of arguments: ' + inputSize + ' != ' + - args.length); - - var x = args; - - // 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); - for (var 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 (var 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(x[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 (var 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; - } - - var y = new Float64Array(n); - for (var j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (var 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) - y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); - } - - return y; - } - }, - - 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(args) { - var x = n == 1 ? args[0] : Math.pow(args[0], n); - - var out = []; - for (var j = 0; j < length; ++j) - out.push(c0[j] + (x * diff[j])); - - return out; - - } - }, - - 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 = []; - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(args) { - 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(args[0], 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]; - - var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropropriate function - return fns[i]([v2]); - }; - }, - - 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 numOutputs = range.length / 2; - 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 = new FunctionCache(); - return function constructPostScriptFromIRResult(args) { - var initialStack = []; - for (var i = 0, ii = (domain.length / 2); i < ii; ++i) { - initialStack.push(args[i]); - } - - var key = initialStack.join('_'); - if (cache.has(key)) - return cache.get(key); - - var stack = evaluator.execute(initialStack); - var transformed = []; - for (i = numOutputs - 1; i >= 0; --i) { - var out = stack.pop(); - var rangeIndex = 2 * i; - if (out < range[rangeIndex]) - out = range[rangeIndex]; - else if (out > range[rangeIndex + 1]) - out = range[rangeIndex + 1]; - transformed[i] = out; - } - cache.set(key, transformed); - return transformed; - }; - } - }; -})(); - -var FunctionCache = (function FunctionCacheClosure() { - // Of 10 PDF's with type4 functions the maxium number of distinct values seen - // was 256. This still may need some tweaking in the future though. - var MAX_CACHE_SIZE = 1024; - function FunctionCache() { - this.cache = {}; - this.total = 0; - } - FunctionCache.prototype = { - has: function FunctionCache_has(key) { - return key in this.cache; - }, - get: function FunctionCache_get(key) { - return this.cache[key]; - }, - set: function FunctionCache_set(key, value) { - if (this.total < MAX_CACHE_SIZE) { - this.cache[key] = value; - this.total++; - } - } - }; - return FunctionCache; -})(); - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = initialStack || []; - } - - 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, operands) { - this.operators = operators; - this.operands = operands; - } - 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(-b); - break; - case 'not': - a = stack.pop(); - if (isBool(a) && isBool(b)) - stack.push(a && b); - else - stack.push(a & b); - 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; -})(); - -var PostScriptParser = (function PostScriptParserClosure() { - function PostScriptParser(lexer) { - this.lexer = lexer; - this.operators = []; - this.token; - this.prev; - } - 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 = {}; - - 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; - } - PostScriptLexer.prototype = { - getToken: function PostScriptLexer_getToken() { - var s = ''; - var ch; - var comment = false; - var stream = this.stream; - - // skip comments - while (true) { - if (!(ch = stream.getChar())) - return EOF; - - if (comment) { - if (ch == '\x0a' || ch == '\x0d') - comment = false; - } else if (ch == '%') { - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - } - switch (ch) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case '+': case '-': case '.': - return new PostScriptToken(PostScriptTokenTypes.NUMBER, - this.getNumber(ch)); - case '{': - return PostScriptToken.LBRACE; - case '}': - return PostScriptToken.RBRACE; - } - // operator - var str = ch.toLowerCase(); - while (true) { - ch = stream.lookChar(); - if (ch === null) - break; - ch = ch.toLowerCase(); - if (ch >= 'a' && ch <= 'z') - str += ch; - else - break; - stream.skip(); - } - switch (str) { - case 'if': - return PostScriptToken.IF; - case 'ifelse': - return PostScriptToken.IFELSE; - default: - return PostScriptToken.getOperator(str); - } - }, - getNumber: function PostScriptLexer_getNumber(ch) { - var str = ch; - var stream = this.stream; - while (true) { - ch = stream.lookChar(); - if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.') - str += ch; - else - break; - stream.skip(); - } - var value = parseFloat(str); - if (isNaN(value)) - error('Invalid floating point number: ' + value); - return value; - } - }; - return PostScriptLexer; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -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' -]; - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var CIDToUnicodeMaps = { - 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165, - {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771], - [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402, - 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0, - [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769}, - [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212], - 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172, - 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192}, - {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0, - {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194, - {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288], - {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281, - {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541}, - {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295, - 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288}, - {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291, - [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806}, - 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284, - {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675, - 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306, - 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838}, - {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704, - 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730, - 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834, - {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313}, - {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913}, - {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025, - {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463, - 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569, - 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451, - 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433, - 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301, - 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944, - 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806, - [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946, - 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419, - 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139, - 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879, - [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867, - [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, - 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180, - 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, - 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, - 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, - 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, - 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, - 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, - 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, - [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742, - 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899], - 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025, - 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827, - [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499, - 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942, - 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469, - 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602, - 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913, - 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809, - 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830, - 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012, - 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275, - 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, - [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398, - 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949, - 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, - 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, - 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, - 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223, - 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185, - 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454, - 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475, - 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694, - 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867, - 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721, - 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916, - 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582, - 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671, - 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020, - 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096], - 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097, - 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507, - 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458, - 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, - [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, - 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435, - 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, - 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689, - 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659, - 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841, - 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911, - 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997, - [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670, - [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465, - 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061, - 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368, - 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533, - 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705, - 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531, - 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670, - 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693, - 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054, - 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336, - 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119, - 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500, - [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537, - 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, - 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486, - 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562, - 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187, - 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328], - 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396, - [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392, - 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431, - 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566, - 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, - 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, - 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897, - 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055, - 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511, - 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946, - 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024, - 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618, - [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783, - 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083, - 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811, - 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425, - 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915, - 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681, - 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449, - 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782, - 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622, - 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319, - 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555, - 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018, - 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662, - 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545, - 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217, - 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977, - 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642, - 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, - 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, - [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107, - 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525, - [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992], - 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430, - 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284, - 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835, - 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819], - [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235, - 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460, - 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612, - 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012, - 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034, - 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509, - 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530, - 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463, - 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447, - 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333, - 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655, - 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313], - 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460, - 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899, - 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490, - 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981, - 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210, - 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207, - 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, - 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, - [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, - 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, - 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, - 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, - 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, - 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, - 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, - 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, - 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394], - 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767, - 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862, - 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051, - [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763], - 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563, - 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, - 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700], - 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, - 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, - 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990, - 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, - 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298, - [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488, - 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246, - 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707], - 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889, - 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634, - 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554, - 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, - 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, - 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983, - 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, - 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, - 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, - 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489, - 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, - 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, - 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, - 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783, - 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419, - 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895, - 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384, - 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409, - 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364, - 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907, - 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864, - 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261, - 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299, - 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552, - 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466, - 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336, - 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701, - 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727, - 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320, - 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933, - 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378, - 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609, - 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710, - 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086, - 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397, - 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548, - 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189, - 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, - 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, - 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, - 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302, - 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237, - 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118, - 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336, - [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969, - 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635, - 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857, - 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615, - 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077, - 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900, - 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616, - 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812, - 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095, - 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342, - 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472, - 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643, - 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499, - 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233, - 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702, - 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, - 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, - 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, - [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425, - 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219, - 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105, - 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492, - 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468, - 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110, - 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479, - 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757, - 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204, - 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333], - 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707, - 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368, - 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271, - 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532, - 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495, - 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009, - 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436, - 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754, - 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382], - 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, - [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503, - 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305, - [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050, - 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426, - 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551, - 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428, - 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184, - 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975, - 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676, - 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310, - 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239, - 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, - 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, - 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862, - 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, - 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887, - 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232, - 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303, - 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675, - 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253, - 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447, - 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990, - 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165, - 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125, - {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938, - 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693, - [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187, - 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705, - 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737, - 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451, - [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, - 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637, - 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, - [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695, - 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855, - 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236, - [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611], - 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665, - [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, - 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822, - 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493, - 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, - 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, - 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480, - 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313, - 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562, - 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992], - 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965, - 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096, - 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853, - 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033, - 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041, - [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504, - 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, - [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142, - 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, - 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147], - 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563, - 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363, - 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646, - 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265, - 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676, - 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266, - 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725, - [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682, - 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434, - 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109, - 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031], - 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333, - 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174, - 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233, - 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376, - 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447, - 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520, - 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478, - 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570, - 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681}, - 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725, - 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791, - 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834, - 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873, - 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898, - {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917, - 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976, - [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038, - 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108, - 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137, - 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214, - 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254, - 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283, - 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321, - 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367, - [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430], - 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498, - 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533, - 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627, - 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676, - 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720, - {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817, - 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811, - 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918, - 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956, - 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009, - 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063, - 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190, - 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225, - 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280, - 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327}, - 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409, - 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484, - {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561, - 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687, - 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743, - 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777, - {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790, - 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862, - 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941, - 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001}, - 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, - {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, - 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318, - 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, - {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, - [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, - 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, - {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592, - [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409, - 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939, - 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785, - 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839, - 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886, - 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980, - 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022, - [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091, - {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162, - 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636, - [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291, - 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305, - 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413, - 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392, - 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409, - [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458, - 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, - 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, - 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, - 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, - 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, - 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760, - 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, - 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817, - {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, - 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948, - 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, - 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, - 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, - 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096], - 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, - {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, - 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303, - 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, - 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, - 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, - 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, - 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, - 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, - 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, - 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, - {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, - 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908], - [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933, - 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015, - 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073, - [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483, - {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205, - 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249, - 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296, - 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359, - 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433, - 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480, - 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607, - 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606, - 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701, - 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767, - 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784, - 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918, - 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839, - 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913, - 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937, - 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058, - 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101, - 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102, - 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057, - 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204, - 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192, - 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323, - 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354, - 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448, - 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476, - 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523, - 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569, - [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628, - 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684, - 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, - 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, - 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, - 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, - 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, - 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, - 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, - 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, - 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, - 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, - 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748, - 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, - 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, - 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, - 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, - 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, - 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, - 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, - 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, - 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, - 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, - 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, - 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254, - 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346, - 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410, - {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469, - 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546, - 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627, - 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746, - 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795, - 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681, - 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943, - 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990, - 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057, - 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090, - 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147, - 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179, - 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194}, - 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256, - 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305}, - {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332, - 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384, - 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437, - 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494, - {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571, - 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622, - 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679, - 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018, - 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890, - 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956, - 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019, - 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114, - 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189, - 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263, - 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329}, - 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382, - 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434, - 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457}, - 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512}, - 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564, - 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645, - 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641, - 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764, - 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757, - 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811, - 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852, - 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923, - 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954, - 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002, - 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070, - 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137, - 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189, - 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221, - 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274, - 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313, - 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345}, - 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383, - {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398, - {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592, - [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616}, - 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, - 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, - {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, - 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801, - 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, - 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900, - 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997, - 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065, - 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137, - 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184, - 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208, - 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224, - 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281}, - 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331, - 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384, - {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426, - 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523, - 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497, - 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583, - 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571, - 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704, - 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783, - 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787, - 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922, - 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983, - 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953, - 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044, - 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212, - 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204, - 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269, - 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338, - 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417, - 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500, - 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527, - 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569, - 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586, - 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649, - 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749, - 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799, - 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833, - 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884, - 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933, - 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957, - 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032}, - 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082, - 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126, - 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183, - 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233, - 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290, - {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, - 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, - 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493}, - 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, - 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, - 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, - 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, - 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730}, - 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920, - [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973, - 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029, - {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, - {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112, - 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225, - 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299, - {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351, - {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423, - 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437, - 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499, - 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542, - 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618, - 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646, - 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686, - 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791, - 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857}, - 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917, - 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958, - 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, - 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, - 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, - 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, - 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343, - 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397, - 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, - 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, - 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, - 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780, - 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832, - 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, - 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, - 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, - 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311, - 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, - 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440, - {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493, - 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567, - {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585], - 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660, - 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698, - 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748, - 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780, - 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819, - {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876, - [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, - 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023}, - 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145, - 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204, - 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243, - {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341}, - 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405}, - {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, - 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, - 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, - 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647], - {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675, - 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717], - {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747, - 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825, - {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865, - 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994, - 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, - 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, - 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, - 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, - 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, - {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, - 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, - 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, - 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584, - {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632, - 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669, - 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697], - {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737, - 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803, - {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822, - 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0, - {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0, - 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0, - {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470, - 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180, - 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976, - 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0, - 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171, - 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070, - {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4}, - 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625, - 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0, - 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802, - 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584, - {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432, - 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0, - {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0, - {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, - {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508, - 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825, - 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235, - 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090, - 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056, - 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3}, - {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560}, - {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856, - 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976, - 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947, - 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260, - 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256, - 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824, - 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953, - 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612, - 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, - 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20}, - 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575, - 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0, - 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704, - 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389, - [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362, - 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546, - 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148, - 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014, - 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471, - 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970, - 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0, - 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542, - 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, - 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, - 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, - 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831, - 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262, - 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039, - 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199, - 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843, - 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374, - 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685, - 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364, - 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842, - 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467, - 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030, - 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155, - 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495, - 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214, - 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335, - 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434, - 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495}, - 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665, - 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830, - 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707, - 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013, - {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794, - 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636}, - 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256, - 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304, - {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0, - 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593, - 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0, - 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108}, - {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424}, - {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944, - {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963, - 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111, - {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0, - 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3}, - {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0, - 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082}, - {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0, - {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0, - 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128, - {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139, - {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0, - {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265, - {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312}, - {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121, - {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8}, - 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855, - {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598}, - 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0, - 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093}, - {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069, - 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105, - 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072, - 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885, - 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095, - 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075, - 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150, - 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0, - 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5}, - 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478, - 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10}, - 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7}, - 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555, - 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4}, - 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600, - 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577, - {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136], - [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155], - 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237, - {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4}, - [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842, - {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741, - 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9}, - 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46}, - 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0, - 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0, - 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210, - 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669, - 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0, - 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818, - {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570, - 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5}, - 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094], - [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4}, - 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0, - 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206, - {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972}, - 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058], - 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245, - 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431, - 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586, - 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747, - 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993, - [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232, - {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478, - 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677, - 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896, - 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118, - 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193, - 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348, - 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537, - 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761, - 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011}, - 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207, - 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420, - {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676, - 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956, - 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088, - 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274, - 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384, - [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504, - [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627, - 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850}, - 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155, - 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368, - 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502, - 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723, - {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959, - 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209, - 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486, - 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672}, - 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856, - 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979, - 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137, - 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227, - 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428, - 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699, - [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856, - 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950, - 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194, - 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506, - 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583}, - 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772, - [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892, - 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139, - 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276, - 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489, - 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598}, - 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693, - 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743}, - 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809, - 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867, - 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096, - [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229}, - 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321, - 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556, - {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726, - 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926, - 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035], - 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163, - 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308, - 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430, - 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602, - 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798, - 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959, - 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083, - 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249, - 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401, - 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657, - 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785, - 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934, - 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156, - 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359, - 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670, - 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866, - 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142, - 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415, - 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579, - 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741, - 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911, - [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035, - {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195, - 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455, - 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924, - 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228, - 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460, - 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662, - 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866, - 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085, - 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220, - 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371, - 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570, - {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0, - 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885, - 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0, - 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564, - 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755, - 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922, - 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096, - 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263, - 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463, - {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673, - 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895, - 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001, - 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316, - 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469, - 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729, - 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848, - 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665, - 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435, - 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668, - 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0, - 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094, - 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836}, - {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741}, - {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209}, - {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472, - 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711, - 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336, - 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345, - 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365, - 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607, - 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644, - 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674, - 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0, - 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828, - 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3}, - {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695, - 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0, - {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0, - {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649, - {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0, - 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258, - {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842}, - {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504, - 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938, - 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631, - 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391, - 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369, - 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421, - 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760, - 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320, - 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647, - 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302, - 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155, - 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344, - 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953, - 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215, - 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565, - 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967, - 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432, - 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750, - 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063, - 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602, - 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242, - 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420, - 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688, - 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028, - 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052, - 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853, - 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194, - 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120, - {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463, - 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581, - 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887, - 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148, - 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988, - 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898, - 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399, - 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944, - 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638, - 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054, - {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167, - 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939, - 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355, - 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857, - 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682, - 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909, - 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274, - 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623, - 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049, - 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186, - 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343}, - 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499, - 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650, - 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686, - 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851, - 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010, - 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144, - 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314, - 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917, - {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602, - 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740, - 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831, - 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765, - 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056, - 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112, - 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239, - 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341}, - 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895, - 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004, - 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585, - 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671}, - 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771}, - {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974, - 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984, - 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079, - 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221, - 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319, - 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468, - {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555, - 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616, - 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642, - 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837, - 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333, - 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036, - 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433, - {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317, - 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519, - 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610, - 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793, - 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928, - 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077, - 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301, - 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397, - {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246, - 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568, - {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715, - 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828, - 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963, - 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062, - 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082, - 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256, - 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386, - 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341, - 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587, - 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683, - 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748, - 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794}, - 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841, - {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950, - 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072, - 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309, - 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209, - 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307, - 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389, - 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480, - 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581, - {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662, - 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799, - 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940, - {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016, - {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937, - 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150, - 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239, - {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469, - 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326, - 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591, - 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715, - 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806, - 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934, - 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056, - 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877, - 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311, - 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427, - 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501, - 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588, - 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689, - 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832, - 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882, - 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215, - 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074, - {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135, - {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183, - 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227, - {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273, - 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375}, - 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517, - 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618, - 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622, - 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868, - 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999, - 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137, - 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524, - 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324, - 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820, - 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549, - 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609, - 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676, - 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747, - 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222, - 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949, - 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616, - 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090, - 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167, - 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272, - 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195, - 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294, - {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662, - 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790, - 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952, - 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054, - 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436, - 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252, - 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238, - 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379, - 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458, - 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620, - 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587, - {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785, - 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881}, - 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982, - 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042, - 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129, - {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205, - 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264}, - 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343, - 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441, - {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531, - 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609, - 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731, - 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784, - 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856, - 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329, - 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550, - 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231, - 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345, - 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472, - 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188, - 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901, - 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986, - 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110, - 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374, - {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461, - 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616, - 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806, - 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919, - 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613, - 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106, - 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177, - {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302, - {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251, - 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503, - 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554, - {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673, - 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605, - 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852, - 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997, - 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419, - 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530, - 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616, - 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743, - 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860, - 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132, - 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423, - 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146, - {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753, - {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246, - 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182, - 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500, - 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632, - 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708, - 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787}, - {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896, - 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958, - {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028, - 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031, - {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178, - 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058, - 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310}, - 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416, - 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581, - 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762, - 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813, - 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326, - 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267, - 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578, - 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743, - {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943, - 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035, - {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112}, - 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298, - 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434, - 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556}, - 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768, - 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924, - 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008, - 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149, - 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257, - 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333}, - 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541, - 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815, - 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218, - 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520, - 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860, - 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155, - 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276}, - 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829, - 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989, - 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149, - 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419, - 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578, - {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663, - 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840, - 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056, - 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405, - 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664, - 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051, - 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336}, - 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657, - 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001, - 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348, - {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685, - 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207, - 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385, - 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528, - 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015, - 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191, - 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397, - 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521, - 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596, - {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681, - 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931, - 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147, - 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380, - 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730, - 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826}, - {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962, - 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208, - 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573, - 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674, - {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980, - 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135, - 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249, - 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389, - 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622, - 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134, - 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617, - 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751, - 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901, - 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086}, - 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260, - 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537, - 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704, - 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041, - 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241, - 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363, - 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465, - 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584, - 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679, - 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955, - 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104, - 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307, - 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551, - {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720, - 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901}, - 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368, - 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527, - 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696, - 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861, - 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170, - 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459, - 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693}, - 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856, - 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040, - 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578}, - 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742, - {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044, - 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790, - {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488, - {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339, - 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5}, - 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207, - 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532, - 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819, - 38315, 38741, 171581, 173594], - 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644], - {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211}, - 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308}, - {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176, - {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736, - 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679, - 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594, - {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757, - {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745, - {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733, - 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240, - 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673, - 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641, - 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598, - 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250, - 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507, - {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544}, - {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472, - 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, - 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512, - 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494, - 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510}, - {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525}, - {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539}, - {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209}, - 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223}, - {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200}, - 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229}, - 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254, - 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330, - {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189, - {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307, - 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800}, - {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319, - {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040}, - 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036, - {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068, - {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107, - 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151}, - 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180, - {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204, - {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232, - 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266, - 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288, - 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329, - {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359, - 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400, - {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417}, - {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471, - {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512, - 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555, - 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602, - {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624, - 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648}, - 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684, - {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751}, - {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796, - {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852, - {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880, - {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936, - {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992, - {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032}, - {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072, - 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132, - 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184, - 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212, - {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233, - {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255}, - {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320}, - {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336}, - {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364}, - {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392}, - {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440, - 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468, - 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544}, - 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576, - {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628, - 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692, - {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720}, - {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748, - {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789, - 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811}, - {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840}, - {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915}, - {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934, - {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964, - 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024, - {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043, - 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112, - {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168, - {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248, - 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293, - {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319, - 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372}, - {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400}, - {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428}, - {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506}, - {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532, - {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612, - 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752, - 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840, - {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895}, - {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944, - 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976, - 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008, - {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049, - {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103}, - {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133, - {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168, - 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212}, - 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288, - {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329, - {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364, - 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441, - {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469, - {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497}, - {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551, - 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579, - {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604}, - {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676, - 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699}, - 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732, - 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787}, - 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816, - {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900, - 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931}, - {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960, - 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052, - 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124, - {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145, - {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173, - {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201, - {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267}, - 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292, - {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316}, - 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348, - {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400, - 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464, - {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519}, - {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560, - 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640, - 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671, - {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727, - {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752}, - {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780}, - {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852, - {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904}, - {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968, - {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104, - 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248, - {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315, - 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331}, - {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360, - {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388, - {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429, - {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452}, - {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480}, - {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508}, - {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552, - 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576}, - 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632, - 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668, - {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695}, - {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736, - {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776, - 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816, - 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844}, - 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899}, - 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920, - {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948, - {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032, - 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112, - {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157, - {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228, - {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292}, - 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420, - 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460, - {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493, - {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515}, - {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536, - {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567, - {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592, - 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619}, - {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648, - {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676, - {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704, - {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728, - {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747, - {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771}, - {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812, - 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844, - {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872}, - {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900, - {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928, - {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964}, - 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995, - 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020}, - 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060}, - 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086, - {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104}, - {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132}, - {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165, - 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210, - {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236, - {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272}, - {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322, - {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357, - 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404, - {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445, - {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473, - 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552}, - 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600, - {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655}, - 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673}, - {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692}, - {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720}, - {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796, - {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864, - {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923, - {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992, - {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056}, - 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201, - {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257}, - {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283}, - {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320, - 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384, - {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412, - {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481, - {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516, - 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593, - 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647, - 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728}, - 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772, - 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828, - {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856, - 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888, - {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929, - {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980}, - {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011, - 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048, - {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097, - {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168, - 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237, - 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308, - {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344, - {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412}, - 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444, - {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468}, - 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517, - {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571}, - {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608, - 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672, - {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752, - 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820}, - 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896, - {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937, - {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963, - 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008, - {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038, - {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064, - {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140}, - 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172, - 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204, - {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243, - {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280, - 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392}, - 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420, - 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520, - 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551, - {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609, - {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637, - {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672, - 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747, - 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777, - {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812, - 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853, - {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876, - 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924}, - 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971, - {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012, - 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057, - {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085, - {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120}, - 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148, - 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184, - {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487, - 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468, - 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747], - 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580, - 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904, - 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567, - 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393, - 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, - 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, - 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039, - {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083, - 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074, - 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611, - 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887, - 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445, - 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520, - 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067, - 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062], - 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625, - 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163, - 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, - 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937, - [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080, - 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435, - 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465, - 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039, - 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478, - 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857, - 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395, - 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926, - 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476, - 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911, - 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295, - 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996, - 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741, - 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825, - 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592], - 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329, - 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521, - [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328, - 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448, - 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733, - 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809, - 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009, - 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871, - 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676, - 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350, - 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171, - 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312, - [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943, - 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628, - 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127, - 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544, - 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407, - [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628, - 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, - 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240, - 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, - 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512, - 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789, - 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343, - 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840, - 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135, - 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935, - 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167, - 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834, - 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522, - 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190, - 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231, - 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859, - 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000, - 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215, - 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342, - 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062, - [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423, - 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064, - 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873], - [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684, - 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361, - [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126, - [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612, - [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998], - [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086, - 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170, - 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812, - 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203, - 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530, - 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680, - 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140, - 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503, - 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648, - 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691, - 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153, - 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117, - 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167, - 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788, - 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205, - 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643, - 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168, - 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929, - 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588, - 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758], - [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762], - [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097, - [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771], - [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774], - [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900, - 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261, - [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784], - [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690, - [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790], - [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864], - [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867], - [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791, - [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150, - [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851, - [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881], - [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019, - [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891, - [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894], - [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898], - [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916, - [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909], - 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278, - [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917], - 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921], - [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925], - 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791], - 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794], - [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798], - [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802], - [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805], - [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595, - [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903, - [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814], - [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817], - [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934], - [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938], - [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105, - [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267, - [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825], - [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946], - [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244, - [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954], - [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958], - 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962], - [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828], - [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832], - [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774, - [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432, - [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673, - [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328, - [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982], - [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986], - [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990], - 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705, - 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518, - 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, - 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, - 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, - 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579, - 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, - 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, - 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906, - 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236, - [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269, - 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528, - 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720}, - 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520, - [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408], - 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818, - 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218, - 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287, - 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045, - 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664, - 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862, - 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614, - 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, - [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758, - 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225, - 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420, - 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180, - 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856, - 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928, - [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187, - 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747, - 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918, - [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, - 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, - 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403, - 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271, - 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146, - 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624, - 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539, - 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887, - 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029, - 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, - 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, - 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, - 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264, - [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068, - 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472, - 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299, - 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613, - 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500, - 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807, - [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000, - 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385, - 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575, - 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452, - 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844, - 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138, - 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604], - {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875, - 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692, - 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338, - 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, - 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, - 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, - [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, - 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, - 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, - 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, - 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632, - 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948, - 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441, - 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978, - 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120, - 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248, - [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937, - 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850], - [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996, - 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360, - 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298, - 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736], - [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101, - 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808, - 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764, - 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337, - 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352, - 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373, - [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814, - 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615, - 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596, - 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237, - 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569, - 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703, - 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032, - 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902, - 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895, - 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435, - 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862, - 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234, - 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628, - 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159, - 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, - 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, - 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539, - {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460, - 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901, - 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529, - 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600, - 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899, - 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629, - [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, - 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, - [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, - 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997, - 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335, - 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996], - 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480, - 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251], - 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805, - 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145, - 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617, - [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105, - [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187, - 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569, - [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823, - 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, - 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, - 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, - 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, - 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, - 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825, - 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903, - 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965, - 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344, - [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044, - 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014, - 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578, - 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989, - 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349, - 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123, - 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310, - 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895, - 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893, - 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814, - 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121, - [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704, - 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787, - 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034, - 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454, - 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116, - 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, - 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595, - 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779, - 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314, - 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252, - 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113, - 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233, - 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352], - 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806, - 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002, - 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796, - 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953, - 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, - 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, - 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362, - 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491, - 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760, - 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398, - 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423, - 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550, - 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074, - 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435, - 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304, - 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219, - [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996, - 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806, - 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759, - 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188}, - 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586, - {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788, - 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400, - 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603, - [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103, - 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681, - 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093, - 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033, - 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885, - 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516, - 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347, - 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780], - [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180, - 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995, - 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106, - 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777, - [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001, - 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381, - 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383, - 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133, - 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039, - 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, - 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, - 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, - 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, - 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144, - 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, - [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685, - 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782, - 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213, - 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672, - 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048, - 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380, - 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042, - [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346, - 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637, - 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728, - [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399, - 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019, - 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118, - 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509, - 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450, - 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230, - 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254, - 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357, - 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478, - 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137, - 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532, - 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988, - [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, - 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, - 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199, - 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, - 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165], - 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469, - 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066, - 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038, - 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610, - 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666, - 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044, - 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659, - 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737, - 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, - 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, - 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, - 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, - 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088, - 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757, - 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584, - 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767, - 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941, - 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206, - 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587, - [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489, - 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, - 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878, - 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919, - 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974, - 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158, - 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013, - 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851], - 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513, - 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274, - 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980, - 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081, - 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389, - 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364, - 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029, - 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368, - 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, - 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, - 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, - 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, - 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558, - 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, - 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245, - 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259, - 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534, - 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880, - 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894, - 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861, - 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985, - 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600, - 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798, - 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068, - 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, - 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, - 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, - 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, - [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, - 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756, - 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, - 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, - 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, - 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187, - 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067, - 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526, - 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580, - 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171, - 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, - 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, - 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, - 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, - 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726, - 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429, - 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255], - 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, - 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, - 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, - 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071, - 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133, - [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451, - 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697, - 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130, - [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848], - 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979, - 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032, - 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680, - 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289}, - 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323, - 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532, - 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239, - 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565, - 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809, - 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184, - 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141, - 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010, - 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203, - [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843, - [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335, - 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880], - [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433, - 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418, - 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610, - 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935, - 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778, - 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009, - 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786, - 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382, - 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239, - 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700, - 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270, - 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457, - 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339, - 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, - 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748], - 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, - {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, - 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238, - 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, - 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, - 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, - 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402, - 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869, - 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347, - [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585, - 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658, - 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958, - 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007, - 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288, - 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, - 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690, - 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314}, - {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759, - {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61}, - {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0, - 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771, - 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045, - 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711, - {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102}, - {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787, - 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649, - 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716, - {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3}, - 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327}, - {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0, - 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144}, - {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673, - 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944, - {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540, - 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056, - {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078, - {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097}, - 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121}, - {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153, - {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173}, - {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203, - {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222}, - {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237}, - 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267, - {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286}, - {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306}, - {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330}, - {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349}, - 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373}, - {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398}, - {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419}, - {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446}, - {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485}, - {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509}, - {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541}, - {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565}, - {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612, - {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631}, - 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650}, - {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670}, - {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737}, - {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762}, - {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782}, - {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809}, - {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851, - {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874}, - {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922}, - {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946}, - {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989}, - {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013}, - {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045}, - {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069}, - {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097}, - {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144, - {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185}, - {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213}, - {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241}, - {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266}, - {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286}, - 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342}, - {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366, - {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385}, - {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405}, - {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441, - {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461}, - {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517}, - {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536}, - {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564, - {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581}, - 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621}, - {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665}, - {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702}, - {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723}, - 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745}, - {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777, - {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799, - {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820}, - {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842, - {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917, - {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935, - {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954, - {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973}, - {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022}, - {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042, - 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053}, - {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105}, - {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124}, - {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169}, - 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209}, - {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249}, - {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273}, - {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294}, - {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320, - {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361}, - {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386}, - {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406}, - {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430, - {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505, - {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526}, - {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546}, - {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613}, - {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645}, - {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750}, - {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770}, - {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841}, - {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893}, - {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917}, - {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945}, - {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966}, - {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990, - {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009}, - 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048, - {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093}, - 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117}, - {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142}, - {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162}, - {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188}, - {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216, - {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246}, - {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289}, - 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313}, - {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338}, - {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358}, - {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422}, - {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440, - {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457}, - 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481}, - {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503}, - {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552, - {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580, - {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593}, - {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618}, - {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677}, - 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702}, - {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722}, - {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750, - {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793, - {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813}, - {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873}, - {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897}, - {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927, - {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950, - {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970, - {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013}, - {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045}, - {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069}, - {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122}, - {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144, - {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168, - {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181}, - {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202}, - {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262}, - {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283}, - {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306, - {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325}, - 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345}, - {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392, - {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421}, - {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461}, - {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489}, - {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532, - {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549}, - {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601}, - {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629}, - {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646}, - {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670, - {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717, - {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738}, - {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758}, - {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782, - {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850}, - {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870}, - {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922, - {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969}, - {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073}, - {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109}, - {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213}, - {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249}, - {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305}, - 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335}, - 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354}, - {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374}, - {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400, - {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417}, - {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445, - {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466}, - {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486}, - {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510, - {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529}, - {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566, - 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578}, - {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605}, - {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625}, - {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650, - {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669}, - 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693}, - {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717}, - {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753}, - {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777}, - {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802}, - {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822}, - {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848, - {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893}, - 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917}, - {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942}, - {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962}, - {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033, - {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053}, - {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138}, - {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154}, - {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185}, - {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225}, - {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278}, - {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298}, - {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361}, - {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421}, - 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445}, - {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474}, - {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494}, - {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527, - {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546, - {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565}, - {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585}, - {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614}, - 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642}, - {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671, - {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690}, - {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714, - {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735, - {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754}, - {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774}, - {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800, - {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817}, - 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841}, - {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866}, - {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886}, - {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910}, - {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929}, - {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953}, - {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978}, - {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000}, - {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024, - {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049}, - {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071}, - 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097, - {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118}, - {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138}, - {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161}, - {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181}, - {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220, - {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237}, - 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261}, - {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285}, - {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332, - {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360, - {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397}, - {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418}, - {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454}, - {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474}, - {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538}, - {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556}, - {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581}, - {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612, - {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657, - {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678}, - 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698}, - {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722, - {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754}, - {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806, - {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845}, - {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909}, - 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937}, - {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985}, - {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034}, - {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058}, - {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125}, - {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200, - {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245}, - {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271, - {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294}, - {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314}, - {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337}, - {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385}, - 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409}, - {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433}, - {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465}, - {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497}, - 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521}, - {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577}, - {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601}, - {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637}, - 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677}, - {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717}, - {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741}, - {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762}, - {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788, - {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834}, - 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857}, - {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882}, - {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902}, - {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969}, - {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994}, - {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014}, - {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038, - {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081}, - {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106}, - {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126}, - {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169}, - {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225}, - 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249}, - {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294}, - {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320, - {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337}, - {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365}, - {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417}, - {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442}, - {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462}, - {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486, - {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554}, - {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574}, - {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600, - {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629}, - {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669}, - {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693}, - {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753}, - 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806}, - {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826}, - {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890}, - {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910}, - {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933}, - {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953, - {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973}, - {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002}, - {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031, - {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050}, - {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065}, - 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142}, - {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162}, - {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188, - {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205}, - {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233}, - 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257}, - {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281}, - {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365}, - {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384}, - {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412, - {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477}, - {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496}, - {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521}, - 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537}, - {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590}, - {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610}, - {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630}, - 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649}, - {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673}, - {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737, - {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758}, - {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778}, - {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802, - {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821}, - {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849}, - {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866}, - {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888, - {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916, - {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933}, - 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957}, - {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982}, - {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997}, - 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013}, - {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038}, - {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066}, - {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086}, - {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109}, - 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138, - 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149}, - {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170}, - {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196, - {f: 6, c: 55198}], - 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294, - 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106, - 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288}, - {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308}, - {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298}, - {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300}, - {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113}, - {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283, - 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733, - 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0, - {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119}, - 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806}, - 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869, - 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793, - 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0, - 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451, - 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217, - {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835], - [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044], - [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609, - 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492, - 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698}, - 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544}, - {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313}, - {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, - {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153], - [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158], - [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163], - [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168], - [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173], - [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178], - [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008], - [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185], - [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188], - [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191], - [12057, 21353, 63192], [12059, 21430, 63193], - [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195], - [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198], - [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201], - [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204], - [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216}, - 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102, - [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837], - [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147], - [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977, - 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062, - 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475], - [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823], - [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544], - [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029, - [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062], - [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165, - 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, - 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173, - {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844, - 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305, - 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825, - 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187, - 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142], - [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007], - [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352], - [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490], - [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611], - [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226], - [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273], - [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992, - 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180}, - {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908, - {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271, - 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487, - 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483, - 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234, - 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039, - 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098, - {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412, - {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712, - 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916], - [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993, - [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333], - [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683], - [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166], - [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073, - 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237, - {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225, - 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015, - {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280, - {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508, - 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237, - 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809}, - {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913, - {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673, - 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102, - {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088, - {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421, - 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728, - 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334, - [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566], - [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780], - [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905], - {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267], - [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311], - [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880], - [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303, - 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285, - 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, - 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, - {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163, - {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566, - 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545, - 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568, - 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353, - 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846, - 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931, - 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596, - {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043, - 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439, - 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106, - 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212, - 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233, - 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460, - 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599, - 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770, - 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774, - 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796}, - 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995, - {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995, - 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426, - 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328], - [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997], - [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523], - [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804, - 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193], - [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006, - 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365, - 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360, - 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821, - 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050, - 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329, - 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624, - 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617, - 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403, - 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857, - {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993, - 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981, - 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578, - 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731, - 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220, - {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447, - 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, - 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, - 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, - 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276, - [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304, - {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106, - 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122, - 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487, - 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485, - 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667, - 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837}, - 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822, - 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887, - 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228}, - 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609, - 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402, - 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354, - 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933, - 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278, - 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452, - 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021, - 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319, - [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464, - 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738, - [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448, - 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398, - 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881, - 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193, - 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672, - 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697, - 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271, - 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865, - 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013, - 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458, - 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093, - 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456, - 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613, - 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684, - 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345, - 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361, - 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151, - 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580, - 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548, - 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589, - 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915, - 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963, - {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950, - 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856, - 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623, - 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028, - 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328, - {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473, - 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046, - 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359, - 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004, - 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997, - 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989, - 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509, - 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502, - 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923, - 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276, - 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836, - 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480, - {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859], - [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080], - [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056, - 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375], - 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, - 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, - 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934, - 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407, - 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766, - 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799, - 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537, - 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059, - 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472, - 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637, - 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796, - 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464, - 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735, - 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343, - 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424, - 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009, - 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177, - 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681, - 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704, - 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529, - 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040, - 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994, - 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888, - 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432, - 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045, - 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140, - 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505, - {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775, - 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062, - 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206, - 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023, - 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013, - 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792, - 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005, - 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261, - 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618, - 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593, - 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451, - 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941, - 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350, - 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524, - 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852, - 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197, - 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497, - 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340], - [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730], - [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556, - 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559, - 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209, - 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364, - 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846, - 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811, - 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496, - 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105, - 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408, - 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648, - {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849, - 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119, - {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425, - 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739, - 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757, - 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775, - {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463, - 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512, - 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449, - 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944, - 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205, - 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799, - 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755, - 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754, - 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082, - 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113, - 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085, - 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074, - 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309, - 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699, - 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986, - {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154, - 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, - 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, - 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, - 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, - 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, - 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, - 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, - 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, - {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, - 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, - 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, - 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, - 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, - 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, - 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207, - 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517, - 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633, - 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165], - [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642, - 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, - 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883, - 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, - 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, - 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, - 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880, - [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506, - 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879, - 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260, - 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800, - 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846, - 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536, - 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558, - {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950, - 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786], - 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397, - 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855, - 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825, - 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631, - {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263, - 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270, - 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901], - 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255, - {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260, - 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730, - 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736, - {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, - 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813, - 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, - 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, - 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043, - 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724}, - 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, - 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, - 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802, - 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756, - 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532, - 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424, - 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386, - 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027, - 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302, - 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604, - 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129, - 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389, - 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286, - 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593, - 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917}, - 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341, - [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661, - {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119, - 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992, - 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978, - 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609, - 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, - 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, - 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, - 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, - 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, - {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, - 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032, - 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028, - 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, - 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, - 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, - 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, - 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, - 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, - 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, - 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072, - 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, - {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, - 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860, - 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, - 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680, - 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, - 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854, - 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, - {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, - 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, - 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, - 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033, - 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, - {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, - 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, - 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037, - 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, - 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, - 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, - 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, - 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, - 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603, - {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774, - {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156, - {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718], - [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903], - 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123, - 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022, - 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296, - 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781, - 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254, - 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522, - 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151, - 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907, - 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688, - 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723, - 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029, - 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088, - 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467, - 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418, - 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459, - 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081, - 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796, - 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217, - 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887, - 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401, - 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631, - [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156, - {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, - 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736}, - 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, - 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, - 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, - 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, - 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, - 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, - 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, - 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629, - 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, - 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548, - 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, - 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604, - 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171, - 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745}, - 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736, - 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956, - {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066, - 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063}, - 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305, - 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531, - {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287, - 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942, - 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003, - 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721, - 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769, - 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973, - {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137, - 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117, - 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497, - 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528, - 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105, - 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824, - 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394, - 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922, - 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291, - 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648, - 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232, - 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631, - 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109, - 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028, - 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664, - 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090}, - 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506, - 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916, - 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076}, - {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368, - 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635, - 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968, - 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251, - 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575, - 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797, - 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192, - 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607, - {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195, - 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752, - 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, - 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, - 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, - 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, - 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799, - 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, - 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, - 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, - 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, - 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138, - 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852, - 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266, - 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951, - 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689, - 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264, - 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690, - {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288, - {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121, - 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114, - 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563, - 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565, - 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404, - 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981, - 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624, - 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665, - 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673, - 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960, - 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195, - 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720, - 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660, - [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158, - 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, - 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, - 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, - 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, - {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, - 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, - 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641, - 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157, - 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, - 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, - 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, - 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, - 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, - 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, - 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883, - 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, - 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, - 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758, - 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133, - 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600, - 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425, - 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989, - 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762, - 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744, - 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684, - 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, - 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667, - 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, - 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332, - 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487, - 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687, - {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294, - 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150, - {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774, - 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345, - 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217, - 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784, - 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441, - 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995, - 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806, - 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626, - 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989, - 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333, - 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933, - 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181, - 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078, - 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699, - 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346, - 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663, - 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808, - 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696, - 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821, - 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672, - 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466, - 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002}, - 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846, - 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698, - 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241, - 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306, - 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196, - 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880, - 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563, - 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820, - 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768, - 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314, - {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679, - 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912, - 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472, - 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803, - 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084, - 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748, - 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700, - 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261, - 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306, - 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712}, - 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486, - 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605, - 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217, - 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760, - 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893, - 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705, - 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019, - 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403, - 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899, - 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406, - 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984, - 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635}, - 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900, - 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914, - 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724, - 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441}, - {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, - 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, - 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, - 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924, - 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060, - [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109, - [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014, - 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787, - 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668], - [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186, - 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428, - 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168, - 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160], - 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215, - 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913, - 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239, - 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903, - 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031, - [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180, - 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911, - 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419, - 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723}, - 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593], - [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198], - 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435, - 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319, - 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022, - 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552, - 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583, - 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348, - 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926, - 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693, - 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032, - 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440, - 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548, - 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228, - {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224, - 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437, - 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600, - {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759, - 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749, - 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377, - 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009, - {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924, - 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411}, - [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024, - 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352, - 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378, - 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373, - 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041, - 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649, - 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645, - 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383, - 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395, - {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991, - 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973, - 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623, - 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725, - 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084, - 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549, - 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602, - 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585, - 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290, - 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043, - 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117, - 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486, - 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513, - 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518, - 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821, - 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858, - 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847, - 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806, - 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400, - 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613, - 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014, - 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713, - 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861, - 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440, - 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438, - 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442, - 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822, - 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460, - 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436, - 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416, - 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398, - 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687, - 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694, - 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429, - 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797, - 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036, - 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038, - 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771, - 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752, - 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240, - 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631, - 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652, - 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154}, - 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356, - 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921, - 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146, - 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561, - 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565, - 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595, - 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572, - 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432, - 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956, - 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929, - 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907, - 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855, - 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249, - {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419, - 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625, - 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624, - 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404, - 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695}, - 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723, - 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190, - 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864}, - {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775, - {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962, - 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983, - 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512, - 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525, - 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517, - 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283, - 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055, - 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484, - 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, - 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503, - 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, - 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074, - {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, - 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, - 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771, - {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, - 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, - 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404, - 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, - 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, - 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, - 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, - 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572, - 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, - 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, - 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193, - {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699, - 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692, - 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661, - 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622, - 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022, - 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143, - 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999, - 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035, - 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569, - 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890, - 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438, - 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671, - 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655}, - 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128, - 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493, - 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498, - 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753, - 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058, - 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197, - 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492, - 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889, - 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024, - 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608, - 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825, - 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317, - 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574, - 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558, - 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566, - 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445, - 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457, - 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883}, - 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942, - 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216, - 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859, - 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093, - 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346, - 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095, - 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552, - 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587, - {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099, - 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820, - 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842, - 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824, - 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528, - 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499, - 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540, - 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125, - [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148, - 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182, - 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106, - 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834, - 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843, - 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374, - 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762, - {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759, - 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469, - 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488, - 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503, - 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209, - 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, - {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, - 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, - 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, - 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535, - {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, - 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, - 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144, - 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, - 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, - 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, - 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447, - 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, - 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, - 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155}, - 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513}, - 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, - 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075, - 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376, - 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, - 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, - 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, - 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661, - {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711, - 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, - 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, - 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, - 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, - 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, - 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, - 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, - 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499, - {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, - 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, - 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, - 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284, - 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, - {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, - 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206, - 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348, - 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524, - 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635, - 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584, - 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415, - 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903, - 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909, - 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568, - 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585, - 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202, - 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172, - 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183, - 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564, - 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886, - 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881, - 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673], - 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852, - 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769, - 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521, - 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568, - 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540, - 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561, - 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013}, - 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218, - 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865, - 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849, - 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872, - 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824, - {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917, - 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581, - 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233, - 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275, - 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264, - 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208, - 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262, - {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963, - 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274, - {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489, - 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740, - 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725, - 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177, - 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534}, - 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816, - {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824, - 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244, - 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566, - 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099, - 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084, - 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674, - {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091, - 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, - {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595, - [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, - 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, - 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801, - [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735, - 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751, - 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522, - 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888, - 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004, - 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293, - {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415}, - {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969, - 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312, - 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311, - 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597, - {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916, - 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115, - 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216, - 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394, - 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399, - 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536}, - 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766, - 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669, - 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, - 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, - {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981, - [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973, - 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632, - 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629, - 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224, - 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242, - 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603, - 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906, - 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267, - 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886, - 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123, - 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636, - 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612, - 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637, - 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067, - 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400, - 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937, - 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941, - 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968, - 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930, - 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457, - 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360, - 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370, - 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338, - 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321, - 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010, - 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025, - 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005, - 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499, - 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783, - 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951, - 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199, - 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197, - 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554, - 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863, - 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870, - 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255, - 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590, - 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585, - 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141, - 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132, - 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679, - {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122, - 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353, - 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935, - 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882, - 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914, - 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837, - 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851, - 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902, - 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552, - 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021}, - 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300, - 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391, - 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915, - 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044, - {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243}, - 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323, - 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613, - {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925, - 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230}, - 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422, - 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473, - 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462, - 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606, - 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927, - {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, - 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692, - 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, - 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420, - 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, - 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, - 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, - 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, - 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, - 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, - 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, - 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270, - 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, - 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960, - 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, - 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714}, - 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, - 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, - 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, - 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, - 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, - 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, - 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550}, - {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, - 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434, - 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, - 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, - 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, - 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, - 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, - 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230, - 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, - 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, - 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, - {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, - 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470, - 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, - 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, - 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, - 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166, - 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804, - 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, - 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, - 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, - 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327], - 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, - 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, - 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, - 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616, - 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070, - 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, - 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, - 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351, - 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, - {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, - 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, - 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, - 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, - 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, - 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, - 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, - {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, - 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742}, - {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739, - 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733, - 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081, - 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078, - 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703, - 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299, - 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959, - 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966, - 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498, - 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007, - 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710, - 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740, - 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979, - {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136, - 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116, - 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111, - 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160, - 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555, - 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551, - 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566, - 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563, - 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521, - 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104, - 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098, - 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533, - 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825, - 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245, - 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364}, - 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929, - 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132, - 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691, - 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948, - 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230, - 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749, - 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182, - 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358, - 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079, - 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090, - 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070, - 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086, - {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073, - 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644, - 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638, - 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683, - 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083, - {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235, - 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540}, - 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545, - 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071, - 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373, - 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371, - 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643, - {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163, - {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258, - {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593, - 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, - 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, - 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268, - 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, - 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, - 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, - {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374, - 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659, - 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798, - 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183, - 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659, - {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473, - 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135, - 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726, - 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539], - 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984, - 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166, - 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989, - 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016, - 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819, - 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304, - {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238, - 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217, - 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220, - 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206, - 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651, - 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612, - 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586, - 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592, - 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130, - 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146}, - {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546, - 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, - 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, - 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615, - 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957, - {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, - 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, - 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, - {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275, - 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, - 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809, - 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, - 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125, - 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, - 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, - 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, - 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, - 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716, - 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106, - 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570, - {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553, - 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081, - 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416, - 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329], - 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998, - 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263, - 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659, - 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626, - 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685, - 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332, - 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612, - 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959, - 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396, - 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670, - 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803, - 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215, - 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223, - 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722, - 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163, - {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742, - 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334, - 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027, - 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833, - 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277, - 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283, - 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269, - 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643, - 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153, - 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847, - 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968}, - 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635, - 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978, - {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144, - 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749, - 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746, - 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760, - 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329, - 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581, - 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226, - 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191, - 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167, - 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189, - 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200, - 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745, - 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756, - 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123, - 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246, - {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599, - 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919, - 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429, - 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274, - 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807, - 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712}, - 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711, - 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343, - 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687, - 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868, - 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211}, - 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329, - 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421}, - 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848, - 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855, - 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261, - {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585, - 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788, - [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173, - 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048, - 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855, - 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330}, - 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335, - 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677, - 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682, - [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, - 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, - 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988, - {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772, - 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781, - 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352, - 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233}, - 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, - 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, - 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, - 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, - 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147, - 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635, - 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622, - 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992, - 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438, - 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, - {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285, - 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, - 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760, - 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354}, - 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, - 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, - 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226, - 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430, - 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755, - 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876, - 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278, - 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671, - 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780, - 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189, - {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802, - {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865, - 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345, - 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488, - 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713, - 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349}, - 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, - {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, - 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978, - 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, - 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237, - 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280, - 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257, - 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806}, - 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170, - {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255, - 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659, - 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994, - {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467, - 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788, - 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840, - 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859, - 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362}, - 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838, - {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102, - 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460, - 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691, - 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910, - 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905, - 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326, - {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325, - 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593, - 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303, - 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302}, - {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344, - {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377, - {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, - 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203}, - 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, - {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012, - 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815, - 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243, - 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294, - 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835, - 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, - 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694}, - 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298}, - 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, - 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, - 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894, - 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909}, - 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257, - 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465, - 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947, - 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959, - 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347, - 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350, - 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677, - 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793, - 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367, - 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392, - {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210, - 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827, - 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699, - 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343, - 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848, - 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705, - 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702, - 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929, - 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372, - 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256, - 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629, - 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980, - 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391, - 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377}, - 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604, - 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804, - 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017, - 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661, - {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909, - 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836, - 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387, - {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858, - 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717, - 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704, - 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957, - {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259, - 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504, - 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004, - 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411, - 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409, - 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754, - 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373, - 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347, - {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571, - 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364, - 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187, - 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707, - 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510, - 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021, - 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420, - 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436, - 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760, - 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221, - 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768, - 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649, - 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732}, - {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992}, - 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, - 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, - 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774, - {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418, - 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410, - 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193}, - 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997, - 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, - 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, - 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, - 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049, - 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, - 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027}, - 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776, - 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528, - 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, - {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0, - 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210], - [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216], - [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339], - [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224], - [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228], - [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232], - [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236], - [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240], - [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244], - [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248], - [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252], - [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256], - [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260], - [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264], - [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268], - [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272], - [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276], - [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280], - [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284], - [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288], - [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292], - [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296], - [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300], - [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304], - [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308], - [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312], - [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316], - [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320], - [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324], - [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328], - [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332], - [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336], - [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340], - [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344], - [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348], - [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352], - [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356], - [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360], - [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364], - [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368], - [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372], - [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376], - [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380], - [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384], - [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388], - [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392], - [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397], - [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402], - [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407], - [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412], - [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417], - [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422], - [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427], - [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432], - [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437], - [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442], - [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447], - [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452], - [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457], - [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461], - [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465], - [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287], - {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287], - [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849, - [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568, - 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563, - 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619, - {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132], - [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137], - [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141], - [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145], - [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813], - [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153], - [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157], - [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878], - [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548], - [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0, - [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177], - [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634], - [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186], - [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192], - [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446], - [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214, - [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206], - [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0, - [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216], - [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220], - [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224], - [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801], - [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666], - [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0, - [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243], - [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247], - [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251], - [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255], - [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824], - [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310], - [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268], - [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273], - [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927], - [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282], - [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286], - [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140], - [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294], - [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139], - [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302], - [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306], - [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444], - [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298], - [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321], - [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0, - [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0, - [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336], - [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340], - [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345], - [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413], - [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353], - [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357], - [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361], - [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366], - [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990], - [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374], - [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873], - [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382], - [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551], - [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437], - [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399], - [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393], - [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616], - [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624], - [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417], - [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421], - [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425], - [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429], - [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261], - [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437], - [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443], - [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447], - [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451], - [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455], - [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459], - [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0, - [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468], - [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475], - [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494], - [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483], - [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0, - [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493], - [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497], - [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598], - [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449], - [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891], - [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515], - [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911], - [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523], - [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527], - [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990], - [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536], - [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541, - [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545], - [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688], - [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493], - [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557], - [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249], - [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405], - [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570], - [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548], - [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578], - [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684], - [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587], - [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591], - [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595], - [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804], - [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603], - [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915], - [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611], - [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615], - [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619], - [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381], - [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627], - [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631], - [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635], - [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640], - [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315], - [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649], - [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434], - [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511], - [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661], - [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531], - [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724], - [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675], - [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324], - [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683], - [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687], - [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138], - [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696], - [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700], - [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705], - [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947], - [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097], - [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717], - [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721], - [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725], - [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729], - [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595], - [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737], - [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349], - [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955], - [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425], - [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753], - [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134], - [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762], - [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924], - [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134], - [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774], - [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506], - [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681], - [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786], - [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135], - [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795], - [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534], - [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804], - [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043], - [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812], - [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701], - [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820], - [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030], - [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828], - [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832], - [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001], - [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081], - [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848], - [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852], - [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856], - [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861], - [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396], - [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870], - [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874], - [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878], - [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909], - [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886], - [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891], - [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470], - [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899], - [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904], - [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117], - [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912], - [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115], - [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920], - [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924], - [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928], - [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158], - [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476], - [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958], - [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682], - [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948], - [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019], - [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957], - [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961], - [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603], - [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827], - [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491], - [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977], - [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114], - [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985], - [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987], - [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994], - [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502], - [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002], - [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006], - [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964], - [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923], - [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258], - [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746], - [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027], - [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731], - [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035], - [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340], - [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043], - [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049], - [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054], - [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490], - [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062], - [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586], - [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603], - [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074], - [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080], - [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084], - [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088], - [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085], - [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285], - [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100], - [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783], - [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239], - [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112], - [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116], - [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120], - [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124], - [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070], - [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133], - [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957], - [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141], - [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097], - [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149], - [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281], - [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157], - [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161], - [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961], - [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169], - [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315], - [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194], - [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934], - [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476], - [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070], - [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195], - [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199], - [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203], - [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566], - [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211], - [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302], - [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219], - [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223], - [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257], - [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266], - [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235], - [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690], - [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164], - [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150], - [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252], - [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257], - [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262], - [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266], - [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274], - [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274], - [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278], - [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377], - [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004], - [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290], - [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294], - [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219], - [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901], - [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306], - [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310], - [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314], - [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318], - [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322], - [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326], - [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331], - [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335], - [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339], - [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343], - [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348], - [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475], - [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941], - [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360], - [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220], - [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082], - [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372], - [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376], - [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380], - [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112], - [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0, - [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703], - [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397], - [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0, - [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853], - [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410], - [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736], - [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469], - [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422], - [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0, - [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757], - [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435], - [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312], - [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443], - [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944], - [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872], - [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455], - [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459], - [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463], - [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565], - [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471], - [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475], - [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275], - [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250], - [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487], - [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491], - [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748], - [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982], - [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504], - [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508], - [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925], - [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516], - [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520], - [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525], - [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529], - [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533], - [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784], - [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542], - [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616], - [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550], - [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554], - [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374], - [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505], - [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945], - [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570], - [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375], - [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578], - [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164], - [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228], - [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590], - [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594], - [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422], - [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602], - [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399], - [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328], - [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614], - [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618], - [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933], - [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900], - [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630], - [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314], - [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638], - [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642], - [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376], - [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650], - [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654], - [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658], - [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662], - [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666], - [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670], - [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674], - [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322], - [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221], - [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613], - [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366], - [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069], - [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698], - [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0, - [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848], - [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712], - [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477], - [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020], - [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724], - [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115], - [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571], - [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369], - [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686], - [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054], - [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749], - [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757], - [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334], - [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797], - [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832], - [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853], - [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898], - [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920], - [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984], - [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038], - [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075], - [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102], - [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132], - [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143], - [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166], - [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194], - [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201], - [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0, - [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233], - [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418], - [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515], - [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625], - [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687], - [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266], - [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274], - [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283], - [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290], - [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299], - [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0, - [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834], - [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327], - [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006], - [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341], - [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0, - [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352], - [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0, - [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369], - [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105], - [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384], - [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390], - [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642], - [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904], - [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979], - [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248], - [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181], - [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714], - [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133], - [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438], - [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446], - [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451], - [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455], - [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133], - [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960], - [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470], - [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474], - [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478], - [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496], - [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0, - [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546], - [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554], - [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876], - [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248], - [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0, - [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416], - [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595], - [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604], - [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608], - [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612], - [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616], - [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620], - [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624], - [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578], - [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632], - [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294], - [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818], - [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646], - [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650], - [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654], - [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027], - [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662], - [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666], - [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670], - [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675], - [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683], - [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697], - [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704], - [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0, - [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719], - [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726], - [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739, - [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744], - [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752], - [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761], - [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765], - [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769], - [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773], - [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777], - [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0, - [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788], - [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797], - [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802], - [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807], - [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023], - [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818], - [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822], - [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826], - [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831], - [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982, - [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842], - [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847], - [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851], - [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855], - [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859], - [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863], - [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867], - [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871], - [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876], - 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882], - [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886], - [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894], - [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898], - [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0, - [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908], - [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913], - [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919], - [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923], - [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927], - [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933], - 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938], - 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943], - [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947], - [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952], - [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957], - [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961], - [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966], - [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203], - [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975, - [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981, - [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985], - [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0, - [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994], - [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998], - [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003], - [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008], - [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013], - [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018], - [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025], - [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030, - [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035], - [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039], - [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043], - [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047], - [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051], - [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056], - [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060], - [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064], - [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0, - [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074], - [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078], - [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0, - [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345], - [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349], - [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826], - [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357], - [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361], - [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643], - [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369], - [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193], - [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968], - [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383], - [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387], - [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391], - [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516], - [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923], - [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531], - [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407], - [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411], - [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417], - [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421], - [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425], - [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429], - [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433], - [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438], - [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0, - [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447], - [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451], - [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455], - [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598], - [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555], - [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468], - [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472], - [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476], - [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480], - [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263], - [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488], - [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516], - [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496], - [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477], - [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504], - [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0, - [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533], - [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517], - [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522], - [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526], - [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758], - [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877], - [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538], - [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542], - [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0, - [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551], - [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555], - [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559], - [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563], - [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568], - [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018], - [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138], - [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917], - [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584], - [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589], - [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628], - [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598], - [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602], - [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588], - [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517], - [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615], - [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619], - [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623], - [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627], - [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631], - [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635], - [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337], - [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643], - [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355], - [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073], - [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659], - [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663], - [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667], - [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240], - [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678], - [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682], - [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992], - [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441], - [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695], - [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699], - [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903], - [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709], - [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442], - [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718], - [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722], - [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726], - [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730], - [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734], - [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738], - [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742], - [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0, - [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753], - [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757], - [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761], - [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824], - [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771, - [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775], - [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780], - [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783], - [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364], - [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559], - [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049], - [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803], - [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807], - [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811], - [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495], - [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819], - [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823], - [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828], - [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832], - [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836], - [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562], - [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844], - [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848], - [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852], - [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0, - [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266], - [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865], - [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869], - [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873], - [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760], - [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450], - [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885], - [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211], - [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893], - [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897], - [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0, - [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908], - [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912], - [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916], - [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920], - [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924], - [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780], - [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513], - [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936], - [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125], - [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945], - [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949], - [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087], - [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0, - [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161], - [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050], - [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971], - [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975], - [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979], - [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983], - [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987], - [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539], - [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996], - [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202], - [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938], - [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008], - [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012], - [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016], - [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602], - [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026], - [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031], - [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807], - [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915], - [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043], - [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048], - [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052], - [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056], - [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060], - [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064], - [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069], - [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966], - [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077], - [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933], - [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085], - [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044], - [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897], - [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100], - [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056], - [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292], - [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114], - [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687], - [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122], - [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126], - [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210], - [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534], - [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968], - [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392], - [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194], - [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092], - [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0, - [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0, - [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564], - [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568], - [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263], - [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0, - [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0, - [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208], - [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0, - [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497], - [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936], - [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0, - [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325], - [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620], - [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624], - [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665], - [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635], - [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209], - [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645], - [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987], - [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778], - [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417], - [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122], - [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630], - [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489], - [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436], - [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0, - [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0, - [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0, - 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030], - [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042], - [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063], - [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924], - [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0, - [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818], - [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388], - [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863], - [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0, - [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963], - [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233], - [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051], - [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078], - [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148], - [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056], - {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520], - {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277], - {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274], - {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776}, - [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206], - [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785], - [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789], - [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793], - [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797], - [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801], - [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491], - [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033], - [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970], - [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818], - [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822], - [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826], - [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830], - [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207], - [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521], - [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525], - [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529], - [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534], - [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538], - [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543], - [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969], - [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375], - [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382], - [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387], - [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391], - [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395], - [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399], - [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403], - [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407], - [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411], - [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415], - [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419], - [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423], - [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427], - [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431], - [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435], - [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447], - [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453], - [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510], - [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461], - [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467], - [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471], - [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054], - [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480], - [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484], - [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490], - [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496], - [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501], - [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507], - [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511], - [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515], - [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519], - [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524], - [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155], - [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287], - [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611], - [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724], - [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662], - [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826], - [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503], - [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472], - [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950], - [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526], - [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958], - [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701], - [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830], - [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713], - [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906], - [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019], - [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237], - [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288], - [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777], - [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197], - [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743], - [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093], - [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094], - [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978], - [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759], - [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763], - [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767], - [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484], - [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775], - [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032], - [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039], - [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044], - [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048], - [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053], - [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059], - [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064], - [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070], - [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074], - [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078], - [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083], - [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087], - [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091], - [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096], - [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100], - [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104], - [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108], - [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112], - [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116], - [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120], - [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336], - [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128], - [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132], - [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136], - [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140], - [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144], - [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877], - [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134], - [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188], - [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480], - [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087], - [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385], - [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415], - [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564], - [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922], - [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611], - [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888], - [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010], - [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996], - [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254], - [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427], - [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746], - [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756], - [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761], - [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766], - [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166], - [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774], - [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779], - [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787], - [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794], - [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802], - [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806], - [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810], - [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815], - [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822], - [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827], - [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833], - [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837], - [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844], - [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850], - [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856], - [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864], - [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868], - [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873], - [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878], - [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882], - [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351], - [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891], - [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896], - [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901], - [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906], - [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911], - [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916], - [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921], - [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927], - [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931], - [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937], - [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942], - [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947], - [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951], - [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955], - [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959], - [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965], - [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970], - [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975], - [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979], - [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985], - [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992], - [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996], - [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001], - [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006], - [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010], - [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014], - [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018], - [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022], - [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028], - [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032], - [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036], - [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041], - [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047], - [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052], - [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059], - [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063], - [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069], - [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178], - [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079], - [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086], - [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090], - [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220], - [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311], - [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726], - [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826], - [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091], - [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227], - [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325], - [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578], - [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871], - [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100], - [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304], - [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471], - [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053], - [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155], - [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578], - [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352], - [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029], - [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183], - [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098], - [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715], - [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143], - [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600], - [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741], - [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411], - [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743], - [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231], - [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737], - [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374], - [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108], - [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037], - [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596], - [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646], - [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930], - [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859], - [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316], - [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674], - [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946], - [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436], - [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790], - [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202], - [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621], - [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205], - [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486], - [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740], - [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301], - [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849], - [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984], - [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271], - [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746], - [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230], - [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726], - [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172], - [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286], - [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392], - [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313], - [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766], - [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768], - [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691], - [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543], - [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464], - [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700], - [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809], - [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942], - [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080], - [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698], - [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600], - [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880], - [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254], - [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119], - [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438], - [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828], - [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752], - [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559], - [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727], - [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382], - [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389], - [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374], - [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191], - [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790], - [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100], - [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822], - [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685], - [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928], - [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275], - [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566], - [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088], - [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366], - [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196], - [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015], - [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106], - [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110], - [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520], - [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608], - [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703], - [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486], - [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021], - [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028], - [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779], - [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237], - [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242], - [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248], - [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253], - [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258], - [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263], - [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268], - [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273], - [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279], - [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553], - [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558], - [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530], - [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842, - [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848], - [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450], - 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295], - [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910, - [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871], - 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284, - [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464, - 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678], - 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203, - [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911], - [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237], - 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537, - 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255], - [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333, - 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951], - [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956}, - 23446, 62959, 32347], - 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168, - 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216}, - {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310}, - {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746, - 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, - 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757, - 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504}, - 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632, - 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352}, - {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544}, - {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353}, - {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, - {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081}, - {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284}, - {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075}, - {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225, - 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363, - 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609, - {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467, - 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, - 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, - 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, - 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, - [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365, - 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133, - 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256, - 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758, - 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502, - 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453, - 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329, - 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953, - 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454, - 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887, - 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, - 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, - 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631, - 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, - 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, - 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187, - 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850, - 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493, - 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572, - 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813, - 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133, - 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554, - 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815, - 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130, - 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607, - 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046, - 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, - 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561, - 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, - 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, - 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, - 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411], - 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167, - 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148, - 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788, - 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383, - 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149, - 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576, - 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425, - 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751, - 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929, - 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514, - 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574, - [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, - 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086, - 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826, - 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548, - 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783, - 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932, - 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532, - 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856, - 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583, - 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300, - 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025, - 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891, - 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, - [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602, - 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230, - 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817, - 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462, - 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333, - 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077, - 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780], - [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144, - 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070, - 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820, - 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938, - 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750], - 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153, - 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881, - 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792, - 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964, - 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133, - 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343, - 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104, - 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428], - [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, - 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178], - [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954, - 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464, - 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295, - 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106, - [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508, - 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775, - [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, - [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807, - 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629, - 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592], - [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916], - 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448, - 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809, - [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394, - 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053, - 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, - 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039, - 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421, - 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741, - 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917, - 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977, - 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657], - 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720, - 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399, - 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774, - 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252, - 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, - 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, - 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, - 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, - 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, - 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, - 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, - 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785, - 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, - 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521, - 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762, - 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015, - 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490, - 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551, - 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551, - 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546, - 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604, - 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099, - 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073, - 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, - 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, - 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, - 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478, - 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, - 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, - 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, - 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020], - [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827, - 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834, - 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, - 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, - 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, - [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087, - [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141, - 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298, - 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844, - 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899, - 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740, - 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888, - 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570, - 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130, - 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933, - 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838, - 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511, - 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239, - 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393, - 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103, - 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304, - 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420, - 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182, - 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597, - 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070, - 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226, - 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769, - 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792, - 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324], - 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782, - 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813, - [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830, - 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, - 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, - 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, - 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, - 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, - 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, - 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, - 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, - 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699, - 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383, - 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108, - 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649, - 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402, - 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814, - 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064, - 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434, - 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033, - 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426, - 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611], - [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040, - 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209, - 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804, - 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753, - 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588, - 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517, - [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937, - 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126, - 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169, - 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, - 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, - 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446], - 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435, - 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376, - 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958, - 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346, - 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479, - 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592, - 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445, - 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262, - 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572, - 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750, - 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928, - 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243, - 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060, - 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921, - 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447, - 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860, - 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687, - 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629, - 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179, - 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748, - 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970, - 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450, - 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827, - 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569, - 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668], - 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190, - 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, - 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424], - 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, - 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, - 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, - 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, - 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, - 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, - 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, - 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275, - 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820, - 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123, - 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469, - 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748, - 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993, - 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580, - [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, - [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, - 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, - 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234, - 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049, - 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441, - [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203, - 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978, - 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569, - 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198, - 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280, - [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978, - 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499, - 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287, - 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102, - 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351, - 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623, - 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, - 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797, - 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463, - 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298, - 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626, - 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463, - 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684, - 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, - [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, - 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, - 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, - 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, - 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, - 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, - 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, - 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, - 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488, - 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393, - 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899, - 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776, - 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486, - 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150, - 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884, - 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635, - [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522, - 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572, - 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, - 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, - 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, - [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581, - 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464, - 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964, - 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609, - 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451, - 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448, - 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829, - 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996, - 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890, - 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442, - [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, - 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, - 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436, - 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310, - 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, - 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, - 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796, - 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219, - 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283, - 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523, - 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335, - 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146, - 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262, - [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819, - 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813, - 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, - [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123, - 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856, - 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218, - 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449, - 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026, - [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016, - 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152, - 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464, - 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167, - 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873, - 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634, - [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033, - 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493, - 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597, - 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005, - 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839, - 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746, - 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495, - 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687, - 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671, - 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768, - 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994, - 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558, - 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202, - 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050, - [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673, - 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589, - 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764, - 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035, - 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521, - 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631, - 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, - 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, - 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001, - 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491, - 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402, - 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189, - 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431, - 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935, - 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507, - 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, - 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, - 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053, - 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248, - 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776, - 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874, - 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531, - 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131, - 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166, - 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643, - 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651, - 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360, - 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467, - 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260, - 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903, - 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825, - 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390, - 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529, - 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151, - 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930, - 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540, - 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535, - 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234, - 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405, - 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247, - [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090, - 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482, - 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065, - 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880, - 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776, - 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894, - 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331, - 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672, - 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371, - [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447, - 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199, - [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386, - 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590, - 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317, - 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162, - [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664, - 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720, - 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405, - 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294, - 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043, - {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121, - 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200, - 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263, - 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274, - 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, - 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, - 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, - 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, - 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, - 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, - [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804, - [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128], - 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819, - 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898, - 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767, - {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798, - {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822, - 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847, - 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864, - 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886}, - {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434, - 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503, - 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021, - 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071, - 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, - 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, - 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759, - 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981], - 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441, - 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329, - {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396, - 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479, - 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456, - 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528, - 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656, - 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412, - 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482, - 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441, - 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551, - 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562, - 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627}, - 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, - 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, - 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656, - {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705, - 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793, - 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848, - 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733, - 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907, - {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932, - 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994, - 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060, - 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044, - 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, - 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, - 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, - [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, - [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, - 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, - 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, - 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, - 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, - 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815, - 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337, - 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579, - {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634, - 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661, - 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618, - 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724, - {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757, - 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903, - 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846, - {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, - 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949}, - 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972, - 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964}, - 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, - 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, - 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139}, - 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251, - 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081, - 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692, - 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708, - 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748, - 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844, - 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919, - 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955, - 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469, - 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357, - 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416, - 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434}, - 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477, - 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566, - [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267, - {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309, - {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229, - 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296, - 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545, - 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614, - 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696}, - 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707, - 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794, - 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906, - 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377, - 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403}, - 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421}, - {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722, - 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782, - 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872, - 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943, - 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, - 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, - 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101, - 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, - 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294, - {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461, - 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303, - 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470, - 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530, - 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654, - 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766, - [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652, - 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837, - 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902, - 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932, - {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989, - 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611, - 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, - 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953}, - 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999, - 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049, - 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100, - 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218, - 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260, - 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397, - 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549, - {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574, - 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591, - 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446, - {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475, - {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525, - 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519}, - {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539, - 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565, - [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614, - 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640, - 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711, - 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722, - 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, - {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863, - 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533, - 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, - 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, - 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, - 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724, - 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697, - 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876, - {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896, - 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000, - 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035, - 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029, - 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204, - 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224, - 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521}, - 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562, - 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727, - {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747, - {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122, - 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969, - 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133, - 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207, - 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279, - 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150, - 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173, - 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343, - 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330, - 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637, - 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689, - 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232, - 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939, - 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973, - 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010, - 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096, - 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129, - {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373, - 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447, - 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129}, - [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, - 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, - 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, - 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, - 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, - 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160}, - 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063, - 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, - 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838, - 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895], - 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737, - 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757, - 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791, - 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898, - 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995, - 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468, - 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517, - 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591, - 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653, - 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, - 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, - 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028}, - {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051}, - 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068, - {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088}, - {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110}, - 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123, - {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143, - 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157}, - {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186}, - 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204, - {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220, - {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235, - {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255, - {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211, - 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655, - 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, - 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503, - {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518}, - {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542, - 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102, - 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128, - 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183, - 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218, - 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253, - 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300, - 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368, - 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930, - 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022, - 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097, - 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195, - [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790, - 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821, - 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, - 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070}, - {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414, - 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471, - 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490, - 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547, - 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552, - 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586, - 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594, - {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659, - 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696, - 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, - 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, - 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578, - {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509, - 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520, - 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564, - 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654}, - 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668, - 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742, - 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808, - 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325, - 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353, - 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039, - 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889, - 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943, - {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703, - 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992], - 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, - 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198}, - 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236, - 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290, - {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331, - 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310}, - 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343}, - 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396, - 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425, - {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463, - 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970, - 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301, - 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657, - 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835, - {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585], - {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694, - 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267, - 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090}, - {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109}, - {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138}, - {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780, - 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601, - 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618, - {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761, - 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663, - 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, - {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846, - 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677, - 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772, - 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631, - 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165, - 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970, - 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722, - 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173, - 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922, - 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652, - 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369, - 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396, - [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425, - 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490, - 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659, - 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880, - 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934, - 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153, - 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958, - 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336, - 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346, - 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136, - 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818, - 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684, - 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027, - 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219, - 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489, - 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123, - 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499, - 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865, - 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512, - [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707, - 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703, - 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441, - 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036, - 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554, - 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221, - 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352, - 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381, - 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572, - 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068, - [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559, - 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308, - 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542, - 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180, - 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169, - 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273, - 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982, - 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744, - 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346, - 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348, - 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736, - 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023, - 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486, - 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832, - 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904, - 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936, - 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580, - 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796, - 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311, - 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650, - 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854, - 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393, - 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415, - 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683, - 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313, - 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126, - 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886, - 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016, - 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442, - 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315, - 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229, - [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467, - 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958, - 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434, - 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898, - 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306, - 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054, - 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632, - 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493, - 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086, - 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854, - 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218, - 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360, - 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918, - 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359, - 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403, - 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010, - 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295, - 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307, - 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213, - 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178, - [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702, - 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198, - 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209, - 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676, - 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289, - 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129, - 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406, - 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137, - 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416, - 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232, - 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421, - 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178, - 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291, - 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427, - 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387, - 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111, - 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438, - 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486, - 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729, - 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142, - 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106, - 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042, - 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028, - 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081, - 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806, - 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025, - 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886, - 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225, - 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674, - 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310, - 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013, - 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132, - 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712, - 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131, - 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382, - 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445, - 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535, - 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585, - 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606, - 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734, - 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233, - 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610, - 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338, - 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366, - 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133, - 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167, - 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759, - 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072, - 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118, - 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195, - 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151, - 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937, - 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136, - 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195, - 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082, - 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887, - 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284, - 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333, - 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711, - 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150, - 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703, - 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285, - 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338, - 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498, - 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470, - 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002, - {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272, - 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190, - 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199, - 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225, - 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309, - 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367, - 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908, - 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783, - 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194, - 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384, - 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567, - 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706, - 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636, - 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326, - 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058, - 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247, - 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051, - 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112, - 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152, - 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824, - 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558, - 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351, - 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377, - 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437, - 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453, - 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891, - 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523, - 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906, - 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622, - {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696, - 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703, - 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767, - 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858, - {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879, - 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951, - 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327, - 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275, - 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329, - 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410, - 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311, - 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313, - 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392, - 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481, - 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024, - 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760, - 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691, - 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677, - 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489, - 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451, - 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799, - 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703, - 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056, - 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851, - 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882, - 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906, - 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945, - 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008, - 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857, - 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695, - 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725, - 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339, - 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637, - [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890, - 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590, - 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634, - 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211, - 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786, - {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619}, - {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317}, - {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252, - 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208, - 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445}, - {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128}, - 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991, - {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019, - 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053, - 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071}, - {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095}, - {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118}, - 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148, - {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178, - {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205}, - 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226}, - {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259, - {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281, - 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308, - 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333}, - {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357, - 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373, - {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395, - 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416}, - {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450, - {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468}, - 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490, - 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512, - {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543}, - {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560}, - {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582}, - {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609}, - {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631, - {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662, - {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675}, - {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690}, - {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713}, - {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737, - 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758}, - {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779}, - {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810, - 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829}, - {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858, - {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874}, - {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897, - 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920}, - {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944, - {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962}, - {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990, - {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007}, - {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025}, - {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044}, - 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070}, - {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087}, - {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107, - {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134}, - 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166}, - {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194, - {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212, - {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234}, - {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255, - {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275}, - {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287}, - {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304], - {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328, - {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356}, - 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379, - {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398}, - {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418}, - {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440, - {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466, - {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506, - 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538, - {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565, - 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580}, - 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609}, - 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637, - {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660, - {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685}, - {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720, - 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743}, - {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768, - {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788}, - 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810, - {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829, - {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844, - {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858}, - {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887, - {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906}, - {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920}, - {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944, - 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967}, - 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991, - {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015, - {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037, - {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056, - {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080, - {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106}, - {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131, - 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152}, - 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170}, - {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197, - {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214}, - 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229}, - {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254}, - {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272}, - 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297}, - {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315, - {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337, - {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354}, - {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382, - {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397}, - {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428}, - 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453}, - {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480}, - 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498}, - {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517}, - {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531}, - {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546}, - {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562}, - {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582}, - {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617}, - {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637}, - {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662}, - {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688}, - {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717, - {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740, - {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762, - 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775}, - {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789}, - {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798, - {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813}, - {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834}, - {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853}, - 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875}, - 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895}, - 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921, - {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936, - {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956}, - {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972}, - {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997}, - 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017}, - {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050}, - {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065}, - {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078}, - {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101}, - {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126}, - {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147}, - {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168}, - {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211}, - 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231}, - {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253, - {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268}, - {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282}, - {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306, - {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330}, - {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353}, - {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392}, - {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417, - {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437}, - {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468}, - {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491, - {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523, - 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552, - {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577, - 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597}, - {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622}, - {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642}, - 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666}, - {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689}, - {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709}, - {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734, - {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749}, - {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778}, - 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797, - {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812}, - {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832}, - {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850}, - {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880}, - {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900, - {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920}, - {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960, - {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976}, - 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014}, - 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042, - {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063}, - 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087, - {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114, - {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129, - {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153}, - {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183, - {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216, - 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238}, - 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267}, - {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292}, - 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315}, - {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342, - {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360, - {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379, - {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399, - 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421, - {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440, - 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467}, - 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491}, - {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510}, - {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531}, - {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549}, - {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562}, - {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583}, - {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602, - {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624}, - {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652, - {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662}, - {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686, - {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704}, - {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725, - {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743, - {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761}, - {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786}, - {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821, - {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839, - {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861}, - {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876}, - {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909, - {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921, - {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937, - {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952}, - {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981}, - {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005, - {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023}, - {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045}, - {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065}, - {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107, - 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131, - 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154, - {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173}, - {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192, - {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210}, - 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241, - {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257}, - {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278, - {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309}, - {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333, - {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354}, - {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372, - {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392}, - {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412, - {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440, - {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459}, - {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485, - 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510, - 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533, - 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553, - {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570, - {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591, - {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614, - {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631, - {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653, - {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673, - {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693, - {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712}, - {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737}, - 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760}, - {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795, - 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813}, - 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831}, - {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855, - {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866}, - {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886}, - {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916}, - {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933}, - 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951}, - {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974, - {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997}, - 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016, - {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040, - {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061, - {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081, - {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104}, - {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125, - {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142, - {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162}, - {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180}, - {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203}, - 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217}, - {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235}, - {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250}, - {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270}, - {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287}, - {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312, - {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334}, - {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349}, - 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369}, - {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390, - {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416, - {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430}, - 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450, - {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466}, - {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488}, - 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506, - {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527}, - 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548, - {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591, - 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602}, - {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630, - 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654}, - {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682}, - 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730, - {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759}, - {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782, - {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798, - {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826, - 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843}, - {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863, - {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877}, - {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899}, - {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929}, - {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944}, - {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968}, - {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983, - {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998, - {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018}, - {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037}, - 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061}, - {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087, - {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105}, - {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136, - {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156}, - {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179}, - 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195}, - {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212}, - {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235}, - {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261}, - {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279, - {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293}, - 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312}, - {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332}, - {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373}, - {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397}, - {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415}, - 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448, - {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464, - {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482}, - 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514, - {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540}, - 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554}, - {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574, - {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587}, - {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610, - {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632}, - 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648}, - {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685, - 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710}, - {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734, - {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755}, - 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775}, - 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793}, - {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820, - {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840}, - {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857}, - {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881, - {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906}, - {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919}, - {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942, - {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956, - {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980, - 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001}, - {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016}, - {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035}, - 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054}, - 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083}, - {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104}, - {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127, - {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146, - 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175, - {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187}, - {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208}, - 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223}, - {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249}, - {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272}, - {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298}, - {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320}, - {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339, - 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358, - {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376}, - {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397}, - {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416, - {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432}, - {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464, - {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482}, - {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498}, - {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517, - {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539, - {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554}, - {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578}, - {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594, - {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612}, - {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633}, - {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652}, - {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682, - {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700, - 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721, - {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735}, - {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754}, - {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773}, - {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797, - {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815}, - 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850, - {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873, - {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892}, - {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917}, - 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939}, - {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962}, - {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998}, - 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023}, - 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044}, - 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061}, - {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077}, - {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101}, - 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122, - {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139, - {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153}, - {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178}, - 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198}, - {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227, - {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248}, - {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276, - 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296}, - {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314}, - {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331}, - {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352}, - 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381}, - {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402}, - 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429}, - {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451}, - {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471}, - {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487}, - {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506}, - {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523}, - {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555}, - 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576, - 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586}, - {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603}, - 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624}, - {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646, - {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672, - {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695}, - 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713}, - {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743, - {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760, - {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792}, - {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809}, - {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834, - {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855}, - {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883}, - {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907, - {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927}, - {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952}, - {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979, - {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998, - 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017}, - {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032}, - {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055}, - {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080}, - {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101, - 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125, - {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150, - {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172}, - {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194}, - {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212, - {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234, - {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257}, - {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280, - {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301, - {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326], - 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345}, - {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356}, - {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383}, - 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400}, - {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421, - {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440}, - 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463}, - {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478}, - {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510, - {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532}, - {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559}, - 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586}, - {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611}, - {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635, - {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654, - {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680}, - {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704}, - {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723}, - {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750, - {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766}, - {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788, - 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803}, - {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825, - {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856, - {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873, - {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890}, - {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911}, - {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929}, - {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953}, - {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965}, - {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978}, - {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002}, - {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021}, - {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047, - {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073, - {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097, - {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115}, - {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147}, - 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170, - {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182}, - {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200}, - 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225}, - 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244, - {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259}, - 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282, - {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303}, - {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331}, - 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362, - 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379}, - {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407}, - {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424}, - 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450}, - {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470, - {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486, - {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504, - {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519, - {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538, - {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562, - {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582}, - 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599}, - {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615, - {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630}, - {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646}, - {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669}, - {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693}, - 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710}, - {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727}, - 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745}, - {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778, - {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801}, - 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837}, - {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855}, - {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891}, - 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910}, - {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930}, - {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950}, - 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987, - 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012, - {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029}, - {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052}, - 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079, - {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103, - {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120, - {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138}, - {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159}, - {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188, - {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204}, - 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228}, - 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245, - {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268}, - {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292}, - {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316, - {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339, - {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355}, - 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378}, - {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400}, - 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436, - {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567, - 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591, - {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611}, - {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634}, - {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653, - {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672, - {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691}, - {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715, - 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729}, - {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754, - {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775}, - {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801, - {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820, - {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836}, - {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857, - {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888, - {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909}, - {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940, - 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965, - {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991}, - {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019, - {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035}, - 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069}, - 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095, - 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115}, - {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138}, - {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168, - {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185}, - {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212, - {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241, - {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259, - {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291, - {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312, - {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340}, - {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356}, - {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383, - {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400], - {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420, - 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442}, - 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471}, - {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497}, - 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522}, - {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549, - 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565}, - {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597}, - {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619, - {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657}, - {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679}, - {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697, - {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726}, - {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741}, - {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762}, - {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786}, - {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810}, - {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837}, - {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854}, - {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880, - {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904, - 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933, - {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946}, - {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971, - {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996, - {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014, - {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046, - {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069}, - {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084}, - {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114, - {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135, - {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149}, - {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168, - {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189}, - 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205}, - {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232, - {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257}, - 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278}, - {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300}, - {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322}, - {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339}, - 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365}, - {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397, - {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413, - {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446}, - 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475, - {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491}, - {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514}, - {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528}, - {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549}, - {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571}, - {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591}, - 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607}, - {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620}, - {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646, - 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671, - {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687}, - {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702}, - {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723}, - {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748, - {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764}, - {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785}, - 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803}, - {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820, - {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839}, - {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867}, - {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881}, - {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906, - 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929, - {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950}, - {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963}, - {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988, - {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005}, - {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024}, - 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040}, - {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061}, - {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080}, - {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100}, - {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127, - {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141}, - {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173, - {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184}, - {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202, - {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216}, - {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234}, - {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248}, - {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277, - {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300, - {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319, - {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343, - {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358, - {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371}, - {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383}, - {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399, - {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417}, - {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431}, - 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453}, - {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476, - {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495, - {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507}, - {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520}, - 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536, - {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557, - {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577, - 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595}, - 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614}, - {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630}, - {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658}, - {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687}, - {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704}, - {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727}, - 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792, - 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914}, - {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931}, - {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963}, - {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981}, - {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003}, - {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041, - {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069, - {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095}, - {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119}, - 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204, - {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226}, - {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246}, - {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265}, - {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293, - {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316, - {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333}, - {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358}, - 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373}, - {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402}, - {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419, - {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438}, - {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458}, - 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477}, - 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501}, - 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519}, - {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539}, - {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565}, - {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588}, - {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616, - {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640}, - {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660}, - {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675, - {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693}, - 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768}, - {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789], - {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806, - {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832}, - 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853}, - {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883, - 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912}, - {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931, - {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957, - 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975}, - 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001, - {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020, - {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042, - 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062, - {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076}, - {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100, - 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113}, - {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139, - 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151}, - {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175}, - {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203}, - {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222}, - 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256, - 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271}, - {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302}, - {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334, - {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352, - {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378}, - {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394}, - {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423, - {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441}, - {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458}, - 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471}, - {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493}, - 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510}, - {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531, - {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551}, - {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574, - {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587}, - 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618}, - 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634}, - {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654}, - {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673}, - {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687, - {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708, - {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724}, - {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745}, - {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763, - {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776}, - 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807, - {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817}, - {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838}, - {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861}, - {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892}, - {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914}, - {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935}, - 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952}, - {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973}, - {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001, - {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038, - 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176, - 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, - {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276}, - {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293}, - {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318}, - {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336}, - {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353}, - {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371}, - {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432, - {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455}, - 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481}, - {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501}, - 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535, - 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569, - {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594}, - 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611}, - {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628}, - {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650, - {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666}, - {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685, - {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702}, - 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723, - {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740}, - {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755}, - {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775}, - {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803, - {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820}, - {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837}, - {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858, - {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877, - {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912, - 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937}, - {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951}, - {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972, - {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997}, - 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014, - {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061, - 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092}, - {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113}, - {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137, - {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157}, - {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182}, - {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199}, - {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220}, - {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238}, - {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263}, - 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298}, - 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337}, - {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379, - {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395}, - {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426}, - {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450}, - 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494}, - {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512}, - {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538, - 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590, - {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613}, - {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639, - {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660, - {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687, - {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700}, - {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722}, - 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760, - {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771}, - {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810, - {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835}, - {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880, - {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907, - {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921}, - {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946}, - {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972, - {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992, - 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006}, - {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032}, - {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064, - {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086}, - 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136}, - {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163}, - {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181, - {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220, - 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233}, - {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259}, - {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299, - {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328, - {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347}, - {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373}, - {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408, - {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436}, - {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487, - 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528, - {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549, - {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576}, - {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596}, - {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615}, - {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633}, - 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645}, - {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661}, - {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683}, - {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704}, - 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728, - {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749}, - {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773}, - {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794}, - {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811, - {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833}, - {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861}, - {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024, - {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905, - [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383, - 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616, - 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584, - 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955, - {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622, - 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759, - 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871, - 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575, - 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351, - {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339}, - {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904, - {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917}, - {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947}, - {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964}, - {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384}, - {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839}, - {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703}, - {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964}, - {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585}, - {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208}, - {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374}, - {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018}, - {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318}, - {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820, - {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872}, - {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738}, - {f: 7, c: 19887}] -}; - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var ColorSpace = (function ColorSpaceClosure() { - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - // Input: array of size numComps representing color component values - // Output: array of rgb values, each value ranging from [0.1] - getRgb: function ColorSpace_getRgb(color) { - error('Should not call ColorSpace.getRgb: ' + color); - }, - // Input: Uint8Array of component values, each value scaled to [0,255] - // Output: Uint8Array of rgb values, each value scaled to [0,255] - getRgbBuffer: function ColorSpace_getRgbBuffer(input) { - error('Should not call ColorSpace.getRgbBuffer: ' + input); - } - }; - - 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; - - switch (name) { - case 'DeviceGrayCS': - return new DeviceGrayCS(); - case 'DeviceRgbCS': - return new DeviceRgbCS(); - case 'DeviceCmykCS': - return new DeviceCmykCS(); - 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': - var whitePoint = IR[1].WhitePoint; - var blackPoint = IR[1].BlackPoint; - var range = IR[1].Range; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unkown 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 = cs[0].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 'CalGray': - return 'DeviceGrayCS'; - case 'CalRGB': - return 'DeviceRgbCS'; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - var numComps = dict.get('N'); - if (numComps == 1) - return 'DeviceGrayCS'; - if (numComps == 3) - return 'DeviceRgbCS'; - if (numComps == 4) - return 'DeviceCmykCS'; - break; - case 'Pattern': - var basePatternCS = cs[1]; - 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 = cs[2] + 1; - var lookup = xref.fetchIfRef(cs[3]); - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = cs[1]; - var numComps = 1; - if (isName(name)) - numComps = 1; - else if (isArray(name)) - numComps = name.length; - var alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - var params = cs[1].getAll(); - return ['LabCS', params]; - 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 (!decode) - return true; - - if (n * 2 !== decode.length) { - warning('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; - }; - - 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 = []; - for (var i = 0; i < numComps; ++i) - this.defaultColor.push(1); - this.base = base; - this.tintFn = tintFn; - } - - AlternateCS.prototype = { - getRgb: function AlternateCS_getRgb(color) { - var tinted = this.tintFn(color); - return this.base.getRgb(tinted); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var length = input.length; - var pos = 0; - var baseNumComps = base.numComps; - var baseBuf = new Uint8Array(baseNumComps * length); - var numComps = this.numComps; - var scaled = []; - - for (var i = 0; i < length; i += numComps) { - for (var z = 0; z < numComps; ++z) - scaled[z] = input[i + z] * scale; - - var tinted = tintFn(scaled); - for (var j = 0; j < baseNumComps; ++j) - baseBuf[pos++] = 255 * tinted[j]; - } - return base.getRgbBuffer(baseBuf, 8); - }, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - - 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 = [0]; - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray = new Uint8Array(length); - - if (isStream(lookup)) { - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - for (var i = 0; i < length; ++i) - lookupArray[i] = lookup.charCodeAt(i); - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: function IndexedCS_getRgb(color) { - var numComps = this.base.numComps; - var start = color[0] * numComps; - var c = []; - - for (var i = start, ii = start + numComps; i < ii; ++i) - c.push(this.lookup[i]); - - return this.base.getRgb(c); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(input) { - var base = this.base; - var numComps = base.numComps; - var lookup = this.lookup; - var length = input.length; - var baseBuf = new Uint8Array(length * numComps); - var baseBufPos = 0; - - for (var i = 0; i < length; ++i) { - var lookupPos = input[i] * numComps; - for (var j = 0; j < numComps; ++j) { - baseBuf[baseBufPos++] = lookup[lookupPos + j]; - } - } - - return base.getRgbBuffer(baseBuf, 8); - }, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - } - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = [0]; - } - - DeviceGrayCS.prototype = { - getRgb: function DeviceGrayCS_getRgb(color) { - var c = color[0]; - return [c, c, c]; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) { - var scale = 255 / ((1 << bits) - 1); - var length = input.length; - var rgbBuf = new Uint8Array(length * 3); - for (var i = 0, j = 0; i < length; ++i) { - var c = (scale * input[i]) | 0; - rgbBuf[j++] = c; - rgbBuf[j++] = c; - rgbBuf[j++] = c; - } - return rgbBuf; - }, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = [0, 0, 0]; - } - DeviceRgbCS.prototype = { - getRgb: function DeviceRgbCS_getRgb(color) { - return color; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) { - if (bits == 8) - return input; - var scale = 255 / ((1 << bits) - 1); - var i, length = input.length; - var rgbBuf = new Uint8Array(length); - for (i = 0; i < length; ++i) - rgbBuf[i] = (scale * input[i]) | 0; - return rgbBuf; - }, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = [0, 0, 0, 1]; - } - DeviceCmykCS.prototype = { - getRgb: function DeviceCmykCS_getRgb(color) { - var c = color[0], m = color[1], y = color[2], k = color[3]; - - // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14 - c = (c * (1 - k) + k); - m = (m * (1 - k) + k); - y = (y * (1 - k) + k); - - // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12 - var r = (1 - c); - var g = (1 - m); - var b = (1 - y); - - return [r, g, b]; - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) { - var scale = 1 / ((1 << bits) - 1); - var length = colorBuf.length / 4; - var rgbBuf = new Uint8Array(length * 3); - var rgbBufPos = 0; - var colorBufPos = 0; - - for (var i = 0; i < length; i++) { - var cmyk = []; - for (var j = 0; j < 4; ++j) - cmyk.push(scale * colorBuf[colorBufPos++]); - - var rgb = this.getRgb(cmyk); - for (var j = 0; j < 3; ++j) - rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255); - } - - return rgbBuf; - }, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - - return DeviceCmykCS; -})(); - -// -// 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 = [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 g(x) { - if (x >= 6 / 29) - return x * x * x; - else - return (108 / 841) * (x - 4 / 29); - } - - LabCS.prototype = { - getRgb: function LabCS_getRgb(color) { - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = color[0], as = color[1], bs = color[2]; - - // Adjust limits of 'as' and 'bs' - as = as > this.amax ? this.amax : as; - as = as < this.amin ? this.amin : as; - bs = bs > this.bmax ? this.bmax : bs; - bs = bs < this.bmin ? this.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 = this.XW * g(L); - var Y = this.YW * g(M); - var Z = this.ZW * g(N); - - // XYZ to RGB 3x3 matrix, from: - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18 - var XYZtoRGB = [3.240479, -1.537150, -0.498535, - -0.969256, 1.875992, 0.041556, - 0.055648, -0.204043, 1.057311]; - - return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]); - }, - getRgbBuffer: function LabCS_getRgbBuffer(input, bits) { - if (bits == 8) - return input; - var scale = 255 / ((1 << bits) - 1); - var i, length = input.length / 3; - var rgbBuf = new Uint8Array(length); - - var j = 0; - for (i = 0; i < length; ++i) { - // Convert L*, a*, s* into RGB - var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]); - rgbBuf[j++] = rgb[0]; - rgbBuf[j++] = rgb[1]; - rgbBuf[j++] = rgb[2]; - } - - return rgbBuf; - }, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // From Table 90 in Adobe's: - // "Document management - Portable document format", 1st ed, 2008 - if (decodeMap[0] === 0 && decodeMap[1] === 100 && - decodeMap[2] === this.amin && decodeMap[3] === this.amax && - decodeMap[4] === this.bmin && decodeMap[5] === this.bmax) - return true; - else - return false; - } - }; - return LabCS; -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -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; - // chunking - // TODO ArrayBuffer ? - 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 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 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 AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data) { - 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([]); - if (result.length == 1) - return result[0]; - // combining plain text blocks into one - var output = new Uint8Array(16 * result.length); - 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) { - 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)); - } - }; - - return AES128Cipher; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, - function cipherTransformDecryptStream(data) { - return cipher.decryptBlock(data); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data); - 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 prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashData = new Uint8Array(100), 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); - var 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 = new Name('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)) - error('unsupported encryption algorithm'); - this.algorithm = algorithm; - var keyLength = dict.get('Length') || 40; - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) != 0) - error('invalid key length'); - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')); - var userPassword = stringToBytes(dict.get('U')); - var flags = dict.get('P'); - var revision = dict.get('R'); - var encryptMetadata = algorithm == 4 && // meaningful when V is 4 - dict.get('EncryptMetadata') !== false; // makes true as default value - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) - passwordBytes = stringToBytes(password); - - var encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - if (!encryptionKey && !password) { - throw new PasswordException('No password given', 'needpassword'); - } 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', 'incorrectpassword'); - - 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.strf; - } - } - - 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) - 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)); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm == 4) { - 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; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var PartialEvaluator = (function PartialEvaluatorClosure() { - function PartialEvaluator(xref, handler, uniquePrefix) { - this.state = new EvalState(); - this.stateStack = []; - - this.xref = xref; - this.handler = handler; - this.uniquePrefix = uniquePrefix; - this.objIdCounter = 0; - } - - var OP_MAP = { - // Graphics state - w: 'setLineWidth', - J: 'setLineCap', - j: 'setLineJoin', - M: 'setMiterLimit', - d: 'setDash', - ri: 'setRenderingIntent', - i: 'setFlatness', - gs: 'setGState', - q: 'save', - Q: 'restore', - cm: 'transform', - - // Path - m: 'moveTo', - l: 'lineTo', - c: 'curveTo', - v: 'curveTo2', - y: 'curveTo3', - h: 'closePath', - re: 'rectangle', - S: 'stroke', - s: 'closeStroke', - f: 'fill', - F: 'fill', - 'f*': 'eoFill', - B: 'fillStroke', - 'B*': 'eoFillStroke', - b: 'closeFillStroke', - 'b*': 'closeEOFillStroke', - n: 'endPath', - - // Clipping - W: 'clip', - 'W*': 'eoClip', - - // Text - BT: 'beginText', - ET: 'endText', - Tc: 'setCharSpacing', - Tw: 'setWordSpacing', - Tz: 'setHScale', - TL: 'setLeading', - Tf: 'setFont', - Tr: 'setTextRenderingMode', - Ts: 'setTextRise', - Td: 'moveText', - TD: 'setLeadingMoveText', - Tm: 'setTextMatrix', - 'T*': 'nextLine', - Tj: 'showText', - TJ: 'showSpacedText', - "'": 'nextLineShowText', - '"': 'nextLineSetSpacingShowText', - - // Type3 fonts - d0: 'setCharWidth', - d1: 'setCharWidthAndBounds', - - // Color - CS: 'setStrokeColorSpace', - cs: 'setFillColorSpace', - SC: 'setStrokeColor', - SCN: 'setStrokeColorN', - sc: 'setFillColor', - scn: 'setFillColorN', - G: 'setStrokeGray', - g: 'setFillGray', - RG: 'setStrokeRGBColor', - rg: 'setFillRGBColor', - K: 'setStrokeCMYKColor', - k: 'setFillCMYKColor', - - // Shading - sh: 'shadingFill', - - // Images - BI: 'beginInlineImage', - ID: 'beginImageData', - EI: 'endInlineImage', - - // XObjects - Do: 'paintXObject', - - // Marked content - MP: 'markPoint', - DP: 'markPointProps', - BMC: 'beginMarkedContent', - BDC: 'beginMarkedContentProps', - EMC: 'endMarkedContent', - - // Compatibility - BX: 'beginCompat', - EX: 'endCompat', - - // (reserved partial commands for the lexer) - BM: null, - BD: null, - 'true': null, - fa: null, - fal: null, - fals: null, - 'false': null, - nu: null, - nul: null, - 'null': null - }; - - PartialEvaluator.prototype = { - getOperatorList: function PartialEvaluator_getOperatorList(stream, - resources, - dependency, - queue) { - - var self = this; - var xref = this.xref; - var handler = this.handler; - var uniquePrefix = this.uniquePrefix || ''; - - function insertDependency(depList) { - fnArray.push('dependency'); - argsArray.push(depList); - for (var i = 0, ii = depList.length; i < ii; i++) { - var dep = depList[i]; - if (dependency.indexOf(dep) == -1) { - dependency.push(depList[i]); - } - } - } - - function handleSetFont(fontName, font) { - var loadedName = null; - - var fontRes = resources.get('Font'); - - assert(fontRes, 'fontRes not available'); - - font = xref.fetchIfRef(font) || fontRes.get(fontName); - assertWellFormed(isDict(font)); - - ++self.objIdCounter; - if (!font.loadedName) { - font.translated = self.translateFont(font, xref, resources, - dependency); - if (font.translated) { - // keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page - loadedName = 'font_' + uniquePrefix + self.objIdCounter; - font.translated.properties.loadedName = loadedName; - font.loadedName = loadedName; - - var translated = font.translated; - // Convert the file to an ArrayBuffer which will be turned back into - // a Stream in the main thread. - if (translated.file) - translated.file = translated.file.getBytes(); - if (translated.properties.file) { - translated.properties.file = - translated.properties.file.getBytes(); - } - - handler.send('obj', [ - loadedName, - 'Font', - translated.name, - translated.file, - translated.properties - ]); - } - } - loadedName = loadedName || font.loadedName; - - // Ensure the font is ready before the font is set - // and later on used for drawing. - // OPTIMIZE: This should get insert to the operatorList only once per - // page. - insertDependency([loadedName]); - return loadedName; - } - - function buildPaintImageXObject(image, inline) { - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - var imageMask = dict.get('ImageMask', 'IM') || false; - if (imageMask) { - // This depends on a tmpCanvas beeing 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; - - fn = 'paintImageMaskXObject'; - args = [imgArray, inverseDecode, width, height]; - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var objId = 'img_' + uniquePrefix + (++self.objIdCounter); - insertDependency([objId]); - args = [objId, w, h]; - - var softMask = dict.get('SMask', 'IM') || false; - if (!softMask && image instanceof JpegStream && - image.isNativelySupported(xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - fn = 'paintJpegXObject'; - handler.send('obj', [objId, 'JpegStream', image.getIR()]); - return; - } - - fn = 'paintImageXObject'; - - PDFImage.buildImage(function(imageObj) { - var drawWidth = imageObj.drawWidth; - var drawHeight = imageObj.drawHeight; - var imgData = { - width: drawWidth, - height: drawHeight, - data: new Uint8Array(drawWidth * drawHeight * 4) - }; - var pixels = imgData.data; - imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight); - handler.send('obj', [objId, 'Image', imgData]); - }, handler, xref, resources, image, inline); - } - - if (!queue) - queue = {}; - - if (!queue.argsArray) { - queue.argsArray = []; - } - if (!queue.fnArray) { - queue.fnArray = []; - } - - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var dependencyArray = dependency || []; - - resources = resources || new Dict(); - var xobjs = resources.get('XObject') || new Dict(); - var patterns = resources.get('Pattern') || new Dict(); - var parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - var res = resources; - var args = [], obj; - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - while (true) { - obj = parser.getObj(); - if (isEOF(obj)) - break; - - if (isCmd(obj)) { - var cmd = obj.cmd; - var fn = OP_MAP[cmd]; - assertWellFormed(fn, 'Unknown command "' + cmd + '"'); - // TODO figure out how to type-check vararg functions - - if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - if (isName(patternName)) { - var pattern = patterns.get(patternName.name); - if (pattern) { - var dict = isStream(pattern) ? pattern.dict : pattern; - var typeNum = dict.get('PatternType'); - - if (typeNum == TILING_PATTERN) { - // Create an IR of the pattern code. - var depIdx = dependencyArray.length; - var operatorList = this.getOperatorList(pattern, - dict.get('Resources') || resources, dependencyArray); - - // Add the dependencies that are required to execute the - // operatorList. - insertDependency(dependencyArray.slice(depIdx)); - - args = TilingPattern.getIR(operatorList, dict, args); - } - else if (typeNum == SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.get('Matrix'); - var pattern = Pattern.parseShading(shading, matrix, xref, - res); - args = pattern.getIR(); - } else { - error('Unkown PatternType ' + typeNum); - } - } - } - } else if (cmd == 'Do' && !args[0].code) { - // eagerly compile XForm objects - var name = args[0].name; - var xobj = xobjs.get(name); - if (xobj) { - assertWellFormed(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assertWellFormed( - isName(type), - 'XObject should have a Name subtype' - ); - - if ('Form' == type.name) { - var matrix = xobj.dict.get('Matrix'); - var bbox = xobj.dict.get('BBox'); - - fnArray.push('paintFormXObjectBegin'); - argsArray.push([matrix, bbox]); - - // This adds the operatorList of the xObj to the current queue. - var depIdx = dependencyArray.length; - - // Pass in the current `queue` object. That means the `fnArray` - // and the `argsArray` in this scope is reused and new commands - // are added to them. - this.getOperatorList(xobj, - xobj.dict.get('Resources') || resources, - dependencyArray, queue); - - // Add the dependencies that are required to execute the - // operatorList. - insertDependency(dependencyArray.slice(depIdx)); - - fn = 'paintFormXObjectEnd'; - args = []; - } else if ('Image' == type.name) { - buildPaintImageXObject(xobj, false); - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - } else if (cmd == 'Tf') { // eagerly collect all fonts - args[0] = handleSetFont(args[0].name); - } else if (cmd == 'EI') { - buildPaintImageXObject(args[0], true); - } - - switch (fn) { - // Parse the ColorSpace data to a raw format. - case 'setFillColorSpace': - case 'setStrokeColorSpace': - args = [ColorSpace.parseToIR(args[0], xref, resources)]; - break; - case 'shadingFill': - var shadingRes = res.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, res); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = 'shadingFill'; - break; - case 'setGState': - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) - break; - - var gsState = extGState.get(dictName.name); - - // This array holds the converted/processed state data. - var gsStateObj = []; - - gsState.forEach( - function canvasGraphicsSetGStateForEach(key, value) { - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gsStateObj.push([key, value]); - break; - case 'Font': - gsStateObj.push([ - 'Font', - handleSetFont(null, value[0]), - value[1] - ]); - break; - case 'BM': - // We support the default so don't trigger the TODO. - if (!isName(value) || value.name != 'Normal') - TODO('graphic state operator ' + key); - break; - case 'SMask': - // We support the default so don't trigger the TODO. - if (!isName(value) || value.name != 'None') - TODO('graphic state operator ' + key); - break; - // Only generate info log messages for the following since - // they are unlikey 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; - } - } - ); - args = [gsStateObj]; - break; - } // switch - - fnArray.push(fn); - argsArray.push(args); - args = []; - } else if (obj != null) { - assertWellFormed(args.length <= 33, 'Too many arguments'); - args.push(obj instanceof Dict ? obj.getAll() : obj); - } - } - - return queue; - }, - - getTextContent: function partialEvaluatorGetIRQueue(stream, resources) { - - var self = this; - var xref = this.xref; - - function handleSetFont(fontName, fontRef) { - var fontRes = resources.get('Font'); - - // TODO: TOASK: Is it possible to get here? If so, what does - // args[0].name should be like??? - assert(fontRes, 'fontRes not available'); - - fontRes = xref.fetchIfRef(fontRes); - fontRef = fontRef || fontRes.get(fontName); - var font = xref.fetchIfRef(fontRef), tra; - assertWellFormed(isDict(font)); - if (!font.translated) { - font.translated = self.translateFont(font, xref, resources); - } - return font; - } - - resources = xref.fetchIfRef(resources) || new Dict(); - - var parser = new Parser(new Lexer(stream), false); - var res = resources; - var args = [], obj; - - var text = ''; - var chunk = ''; - var font = null; - while (!isEOF(obj = parser.getObj())) { - if (isCmd(obj)) { - var cmd = obj.cmd; - switch (cmd) { - case 'Tf': - font = handleSetFont(args[0].name); - break; - case 'TJ': - var items = args[0]; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - chunk += items[j]; - } else if (items[j] < 0) { - // making all negative offsets a space - better to have - // a space in incorrect place than not have them at all - chunk += ' '; - } - } - break; - case 'Tj': - chunk += args[0]; - break; - case "'": - chunk += args[0] + ' '; - break; - case '"': - chunk += args[2] + ' '; - break; - } // switch - if (chunk !== '') { - text += fontCharsToUnicode(chunk, font.translated.properties); - chunk = ''; - } - - args = []; - } else if (obj != null) { - assertWellFormed(args.length <= 33, 'Too many arguments'); - args.push(obj); - } - } - - return text; - }, - - extractDataStructures: function - partialEvaluatorExtractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = dict.get('ToUnicode') || - baseDict.get('ToUnicode'); - if (toUnicode) - properties.toUnicode = this.readToUnicode(toUnicode, xref, properties); - - 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); - } - - var flags = properties.flags; - var differences = []; - var baseEncoding = !!(flags & FontFlags.Symbolic) ? - Encodings.symbolsEncoding : Encodings.StandardEncoding; - var hasEncoding = dict.has('Encoding'); - if (hasEncoding) { - var encoding = dict.get('Encoding'); - if (isDict(encoding)) { - var baseName = encoding.get('BaseEncoding'); - if (baseName) - baseEncoding = Encodings[baseName.name]; - else - hasEncoding = false; // base encoding was not provided - - // 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 = diffEncoding[j]; - if (isNum(data)) - index = data; - else - differences[index++] = data.name; - } - } - } else if (isName(encoding)) { - baseEncoding = Encodings[encoding.name]; - } else { - error('Encoding is not a Name nor a Dict'); - } - } - - properties.differences = differences; - properties.baseEncoding = baseEncoding; - properties.hasEncoding = hasEncoding; - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref, - properties) { - var cmapObj = toUnicode; - var charToUnicode = []; - if (isName(cmapObj)) { - var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-'; - if (!isIdentityMap) - error('ToUnicode file cmap translation not implemented'); - } else if (isStream(cmapObj)) { - var tokens = []; - var token = ''; - var beginArrayToken = {}; - - var cmap = cmapObj.getBytes(cmapObj.length); - for (var i = 0, ii = cmap.length; i < ii; i++) { - var octet = cmap[i]; - if (octet == 0x20 || octet == 0x0D || octet == 0x0A || - octet == 0x3C || octet == 0x5B || octet == 0x5D) { - switch (token) { - case 'usecmap': - error('usecmap is not implemented'); - break; - - case 'beginbfchar': - case 'beginbfrange': - case 'begincidchar': - case 'begincidrange': - token = ''; - tokens = []; - break; - - case 'endcidrange': - case 'endbfrange': - for (var j = 0, jj = tokens.length; j < jj; j += 3) { - var startRange = tokens[j]; - var endRange = tokens[j + 1]; - var code = tokens[j + 2]; - if (code == 0xFFFF) { - // CMap is broken, assuming code == startRange - code = startRange; - } - if (isArray(code)) { - var codeindex = 0; - while (startRange <= endRange) { - charToUnicode[startRange] = code[codeindex++]; - ++startRange; - } - } else { - while (startRange <= endRange) { - charToUnicode[startRange] = code++; - ++startRange; - } - } - } - break; - - case 'endcidchar': - case 'endbfchar': - for (var j = 0, jj = tokens.length; j < jj; j += 2) { - var index = tokens[j]; - var code = tokens[j + 1]; - charToUnicode[index] = code; - } - break; - - case '': - break; - - default: - if (token[0] >= '0' && token[0] <= '9') - token = parseInt(token, 10); // a number - tokens.push(token); - token = ''; - } - switch (octet) { - case 0x5B: - // begin list parsing - tokens.push(beginArrayToken); - break; - case 0x5D: - // collect array items - var items = [], item; - while (tokens.length && - (item = tokens.pop()) != beginArrayToken) - items.unshift(item); - tokens.push(items); - break; - } - } else if (octet == 0x3E) { - if (token.length) { - // Heuristic: guessing chars size by checking numbers sizes - // in the CMap entries. - if (token.length == 2 && properties.composite) - properties.wideChars = false; - - if (token.length <= 4) { - // parsing hex number - tokens.push(parseInt(token, 16)); - token = ''; - } else { - // parsing hex UTF-16BE numbers - var str = []; - for (var k = 0, kk = token.length; k < kk; k += 4) { - var b = parseInt(token.substr(k, 4), 16); - if (b <= 0x10) { - k += 4; - b = (b << 16) | parseInt(token.substr(k, 4), 16); - b -= 0x10000; - str.push(0xD800 | (b >> 10)); - str.push(0xDC00 | (b & 0x3FF)); - break; - } - str.push(b); - } - tokens.push(String.fromCharCode.apply(String, str)); - token = ''; - } - } - } else { - token += String.fromCharCode(octet); - } - } - } - return charToUnicode; - }, - 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; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - var widths = dict.get('W'); - if (widths) { - var start = 0, end = 0; - for (var i = 0, ii = widths.length; i < ii; i++) { - var code = widths[i]; - if (isArray(code)) { - for (var j = 0, jj = code.length; j < jj; j++) - glyphsWidths[start++] = code[j]; - start = 0; - } else if (start) { - var width = widths[++i]; - for (var j = start; j <= code; j++) - glyphsWidths[j] = width; - start = 0; - } else { - start = code; - } - } - } - } else { - var firstChar = properties.firstChar; - var widths = dict.get('Widths'); - if (widths) { - var j = firstChar; - for (var 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 = metrics.widths; - defaultWidth = metrics.defaultWidth; - } - } - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0, widths = []; - var glyphWidths = Metrics[stdFontMap[name] || name]; - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - } else { - widths = glyphWidths; - } - - return { - defaultWidth: defaultWidth, - widths: widths - }; - }, - - translateFont: function PartialEvaluator_translateFont(dict, - xref, - resources, - dependency) { - var baseDict = dict; - var type = dict.get('Subtype'); - assertWellFormed(isName(type), 'invalid font Subtype'); - - var composite = false; - 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) - return null; - - dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; - - type = dict.get('Subtype'); - assertWellFormed(isName(type), 'invalid font Subtype'); - composite = true; - } - var maxCharIndex = composite ? 0xFFFF : 0xFF; - - var descriptor = dict.get('FontDescriptor'); - if (!descriptor) { - if (type.name == '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(); - descriptor.set('FontName', new Name(type.name)); - } 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)) - return null; - - // 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 = (serifFonts[fontNameWoStyle] || - (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) | - (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - var properties = { - type: type.name, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - this.extractDataStructures(dict, dict, xref, properties); - - return { - name: baseFontName, - dict: baseDict, - properties: properties - }; - } - } - - // 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'); - // Some bad pdf's have a string as the font name. - if (isString(fontName)) - fontName = new Name(fontName); - assertWellFormed(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 properties = { - type: type.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: dict.get('FontMatrix') || 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 - }; - this.extractWidths(dict, xref, descriptor, properties); - this.extractDataStructures(dict, baseDict, xref, properties); - - if (type.name === 'Type3') { - properties.coded = true; - var charProcs = dict.get('CharProcs').getAll(); - var fontResources = dict.get('Resources') || resources; - properties.charProcOperatorList = {}; - for (var key in charProcs) { - var glyphStream = charProcs[key]; - properties.charProcOperatorList[key] = - this.getOperatorList(glyphStream, fontResources, dependency); - } - } - - return { - name: fontName.name, - dict: baseDict, - file: fontFile, - properties: properties - }; - } - }; - - return PartialEvaluator; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - // Are soft masks and alpha values shapes or opacities? - this.alphaIsShape = false; - this.fontSize = 0; - this.textMatrix = IDENTITY_MATRIX; - this.leading = 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; - // Color spaces - this.fillColorSpace = null; - this.strokeColorSpace = null; - } - EvalState.prototype = { - }; - return EvalState; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -/** - * Maximum time to wait for a font to be loaded by font-face rules. - */ -var kMaxWaitForFontFace = 1000; - -// Unicode Private Use Area -var kCmapGlyphOffset = 0xE000; -var kSizeOfGlyphArea = 0x1900; -var kSymbolicFontGlyphOffset = 0xF000; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var kPDFGlyphSpaceUnits = 1000; - -// Until hinting is fully supported this constant can be used -var kHintingEnabled = false; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var Encodings = { - 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'], - 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'], - 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', '', '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'], - 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'], - 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', '', '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'], - symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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'], - 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', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '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'] -}; - -/** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ -var stdFontMap = { - 'ArialNarrow': 'Helvetica', - 'ArialNarrow-Bold': 'Helvetica-Bold', - 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', - 'ArialNarrow-Italic': 'Helvetica-Oblique', - 'ArialBlack': 'Helvetica', - 'ArialBlack-Bold': 'Helvetica-Bold', - 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', - 'ArialBlack-Italic': 'Helvetica-Oblique', - 'Arial': 'Helvetica', - 'Arial-Bold': 'Helvetica-Bold', - 'Arial-BoldItalic': 'Helvetica-BoldOblique', - 'Arial-Italic': 'Helvetica-Oblique', - 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', - 'Arial-BoldMT': 'Helvetica-Bold', - 'Arial-ItalicMT': 'Helvetica-Oblique', - 'ArialMT': 'Helvetica', - 'Courier-Bold': 'Courier-Bold', - 'Courier-BoldItalic': 'Courier-BoldOblique', - 'Courier-Italic': 'Courier-Oblique', - 'CourierNew': 'Courier', - 'CourierNew-Bold': 'Courier-Bold', - 'CourierNew-BoldItalic': 'Courier-BoldOblique', - 'CourierNew-Italic': 'Courier-Oblique', - 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', - 'CourierNewPS-BoldMT': 'Courier-Bold', - 'CourierNewPS-ItalicMT': 'Courier-Oblique', - 'CourierNewPSMT': 'Courier', - 'Helvetica-Bold': 'Helvetica-Bold', - 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', - 'Helvetica-Italic': 'Helvetica-Oblique', - 'Symbol-Bold': 'Symbol', - 'Symbol-BoldItalic': 'Symbol', - 'Symbol-Italic': 'Symbol', - 'TimesNewRoman': 'Times-Roman', - 'TimesNewRoman-Bold': 'Times-Bold', - 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', - 'TimesNewRoman-Italic': 'Times-Italic', - 'TimesNewRomanPS': 'Times-Roman', - 'TimesNewRomanPS-Bold': 'Times-Bold', - 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldMT': 'Times-Bold', - 'TimesNewRomanPS-Italic': 'Times-Italic', - 'TimesNewRomanPS-ItalicMT': 'Times-Italic', - 'TimesNewRomanPSMT': 'Times-Roman', - 'TimesNewRomanPSMT-Bold': 'Times-Bold', - 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPSMT-Italic': 'Times-Italic' -}; - -/** - * Holds the map of the non-standard fonts that might be included as a standard - * fonts without glyph data. - */ -var nonStdFontMap = { - 'ComicSansMS': 'Comic Sans MS', - 'ComicSansMS-Bold': 'Comic Sans MS-Bold', - 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', - 'ComicSansMS-Italic': 'Comic Sans MS-Italic', - 'LucidaConsole': 'Courier', - 'LucidaConsole-Bold': 'Courier-Bold', - 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', - 'LucidaConsole-Italic': 'Courier-Oblique' -}; - -var serifFonts = { - 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, - 'Aldus': true, 'Alexandria': true, 'Algerian': true, - 'American Typewriter': true, 'Antiqua': true, 'Apex': true, - 'Arno': true, 'Aster': true, 'Aurora': true, - 'Baskerville': true, 'Bell': true, 'Bembo': true, - 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, - 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, - 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, - 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, - 'Calvert': true, 'Capitals': true, 'Cambria': true, - 'Cartier': true, 'Caslon': true, 'Catull': true, - 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, - 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, - 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, - 'Cochin': true, 'Colonna': true, 'Computer Modern': true, - 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, - 'Corona': true, 'Ecotype': true, 'Egyptienne': true, - 'Elephant': true, 'Excelsior': true, 'Fairfield': true, - 'FF Scala': true, 'Folkard': true, 'Footlight': true, - 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, - 'Gentium': true, 'Georgia': true, 'Gloucester': true, - 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, - 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, - 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, - 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, - 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, - 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, - 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, - 'Lucida Bright': true, 'Melior': true, 'Memphis': true, - 'Miller': true, 'Minion': true, 'Modern': true, - 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, - 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, - 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, - 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, - 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, - 'Requiem': true, 'Rockwell': true, 'Roman': true, - 'Rotis Serif': true, 'Sabon': true, 'Scala': true, - 'Seagull': true, 'Sistina': true, 'Souvenir': true, - 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, - 'Sylfaen': true, 'Times': true, 'Trajan': true, - 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true, - 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, - 'Versailles': true, 'Wanted': true, 'Weiss': true, - 'Wide Latin': true, 'Windsor': true, 'XITS': true -}; - -var symbolsFonts = { - 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true -}; - -// Some characters, e.g. copyrightserif, 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. -function mapPrivateUseChars(code) { - switch (code) { - case 0xF8E9: // copyrightsans - case 0xF6D9: // copyrightserif - return 0x00A9; // copyright - default: - return code; - } -} - -var FontLoader = { - listeningForFontLoad: false, - - bind: function fontLoaderBind(fonts, callback) { - function checkFontsLoaded() { - for (var i = 0, ii = fonts.length; i < ii; i++) { - var fontObj = fonts[i]; - if (fontObj.loading) { - return false; - } - } - - document.documentElement.removeEventListener( - 'pdfjsFontLoad', checkFontsLoaded, false); - - callback(); - return true; - } - - var rules = [], names = [], fontsToLoad = []; - var fontCreateTimer = 0; - - 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; - - fontsToLoad.push(font); - - var str = ''; - var data = font.data; - if (data) { - var length = data.length; - for (var j = 0; j < length; j++) - str += String.fromCharCode(data[j]); - - var rule = font.bindDOM(str); - if (rule) { - rules.push(rule); - names.push(font.loadedName); - } - } - } - - this.listeningForFontLoad = false; - if (!isWorker && rules.length) { - FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad); - } - - if (!checkFontsLoaded()) { - document.documentElement.addEventListener( - 'pdfjsFontLoad', checkFontsLoaded, false); - } - }, - // Set things up so that at least one pdfjsFontLoad event is - // dispatched when all the @font-face |rules| for |names| have been - // loaded in a subdocument. It's expected that the load of |rules| - // has already started in this (outer) document, so that they should - // be ordered before the load in the subdocument. - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names, - fonts) { - /** Hack begin */ - // There's no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. This code will be obsoleted by Mozilla bug 471915. - // - // The only reliable way to know if a font is loaded in Gecko - // (at the moment) is document.onload in a document with - // a @font-face rule defined in a "static" stylesheet. We use a - // subdocument in an