let´s put the files_odfviewer application into the stable4 branch for convinience. We release it as part of ownCloud 4.0.x anyways.

This commit is contained in:
Frank Karlitschek 2012-06-09 23:18:56 +02:00
parent 689c8f5f09
commit be6848a549
289 changed files with 112818 additions and 0 deletions

View File

@ -0,0 +1,5 @@
<?php
OCP\Util::addStyle( 'files_odfviewer', 'webodf' );
OCP\Util::addStyle( 'files_odfviewer', 'odfviewer' );
OCP\Util::addScript('files_odfviewer', 'viewer' );
OCP\Util::addScript('files_odfviewer', 'webodf');

View File

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<info>
<id>files_odfviewer</id>
<name>ODF Viewer</name>
<description>Simple ODF viewer for owncloud</description>
<version>0.1</version>
<licence>AGPL</licence>
<author>Thomas Müller</author>
<require>4</require>
<shipped>true</shipped>
<default_enable/>
</info>

View File

@ -0,0 +1,20 @@
#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
}

View File

@ -0,0 +1,196 @@
@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;
}

View File

@ -0,0 +1,60 @@
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 =
'<div id="odf-toolbar">' +
'<input type="button" id="odf_close" value="Close">' +
'</div>';
$('#controls').append(odfToolbarHtml);
});
// fade out file list and show pdf canvas
$('table').fadeOut('slow').promise().done(function(){;
var canvashtml = '<div id="odf-canvas"></div>';
$('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();
});
});

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,343 @@
// 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;d<a;d+=1)b+=String.fromCharCode(c[d]&255);return b}function g(c){var b="",d,a=c.length,e,i,h;for(d=0;d<a;d+=1)e=c[d],128>e?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;i<c;i+=1)e[i]=a[i];return e};return new Uint8Array(new ArrayBuffer(c))}:function(c){var b=[];b.length=c;return b};this.concatByteArrays=a?function(c,b){var d,a=c.length,e=b.length,i=new this.ByteArray(a+e);for(d=0;d<a;d+=1)i[d]=c[d];for(d=0;d<e;d+=1)i[d+a]=b[d];return i}:function(c,b){return c.concat(b)};this.byteArrayFromArray=function(c){return c.slice()};this.byteArrayFromString=function(c,b){var d;
if("utf8"===b){d=c.length;var a,e,i,h=0;for(e=0;e<d;e+=1)i=c.charCodeAt(e),h+=1+(128<i)+(2048<i);a=new f.ByteArray(h);for(e=h=0;e<d;e+=1)i=c.charCodeAt(e),128>i?(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;e<d;e+=1)a[e]=c.charCodeAt(e)&255}return d=a};this.byteArrayToString=Runtime.byteArrayToString;this.readFile=function(c,b,d){if(g.hasOwnProperty(c))d(null,
g[c]);else{var a=new XMLHttpRequest;a.open("GET",c,!0);a.onreadystatechange=function(){var e;4===a.readyState&&(0===a.status&&!a.responseText?d("File "+c+" is empty."):200===a.status||0===a.status?(e="binary"===b?"undefined"!==typeof VBArray?(new VBArray(a.responseBody)).toArray():f.byteArrayFromString(a.responseText,"binary"):a.responseText,g[c]=e,d(null,e)):d(a.responseText||a.statusText))};a.overrideMimeType&&("binary"!==b?a.overrideMimeType("text/plain; charset="+b):a.overrideMimeType("text/plain; charset=x-user-defined"));
try{a.send(null)}catch(e){d(e.message)}}};this.read=function(c,b,a,k){if(g.hasOwnProperty(c))k(null,g[c].slice(b,b+a));else{var e=new XMLHttpRequest;e.open("GET",c,!0);e.onreadystatechange=function(){var i;4===e.readyState&&(0===e.status&&!e.responseText?k("File "+c+" is empty."):200===e.status||0===e.status?(i="undefined"!==typeof VBArray?(new VBArray(e.responseBody)).toArray():f.byteArrayFromString(e.responseText,"binary"),g[c]=i,k(null,i.slice(b,b+a))):k(e.responseText||e.statusText))};e.overrideMimeType&&
e.overrideMimeType("text/plain; charset=x-user-defined");try{e.send(null)}catch(i){k(i.message)}}};this.readFileSync=function(c,b){var a=new XMLHttpRequest,k;a.open("GET",c,!1);a.overrideMimeType&&("binary"!==b?a.overrideMimeType("text/plain; charset="+b):a.overrideMimeType("text/plain; charset=x-user-defined"));try{if(a.send(null),200===a.status||0===a.status)k=a.responseText}catch(e){}return k};this.writeFile=function(c,b,a){g[c]=b;var k=new XMLHttpRequest;k.open("PUT",c,!0);k.onreadystatechange=
function(){4===k.readyState&&(0===k.status&&!k.responseText?a("File "+c+" is empty."):200<=k.status&&300>k.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<c;a+=1)g[a]=f[a];return g};this.concatByteArrays=function(f,g){var a=new Buffer(f.length+g.length);f.copy(a,0,0);g.copy(a,f.length,0);return a};this.byteArrayFromString=function(f,g){return new Buffer(f,g)};this.byteArrayToString=function(f,g){return f.toString(g)};this.readFile=function(f,g,a){"binary"!==g?j.readFile(f,
g,a):j.readFile(f,null,a)};this.writeFile=function(f,g,a){j.writeFile(f,g,"binary",function(c){a(c||null)})};this.deleteFile=j.unlink;this.read=function(f,g,a,c){l&&(f=l+"/"+f);j.open(f,"r+",666,function(b,d){if(b)c(b);else{var k=new Buffer(a);j.read(d,k,0,a,g,function(a){j.close(d);c(a,k)})}})};this.readFileSync=function(f,g){return!g?"":j.readFileSync(f,g)};this.loadXML=function(){throw"Not implemented.";};this.isFile=function(f,g){l&&(f=l+"/"+f);j.stat(f,function(a,c){g(!a&&c.isFile())})};this.getFileSize=
function(f,g){l&&(f=l+"/"+f);j.stat(f,function(a,c){a?g(-1):g(c.size)})};this.log=function(f){process.stderr.write(f+"\n")};this.setTimeout=function(f,g){setTimeout(function(){f()},g)};this.libraryPaths=function(){return[__dirname]};this.setCurrentDirectory=function(f){l=f};this.currentDirectory=function(){return l};this.type=function(){return"NodeJSRuntime"};this.getDOMImplementation=function(){return null};this.exit=process.exit;this.getWindow=function(){return null}}
function RhinoRuntime(){var j=this,l=Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(),f,g,a="";l.setValidating(!1);l.setNamespaceAware(!0);l.setExpandEntityReferences(!1);l.setSchema(null);g=Packages.org.xml.sax.EntityResolver({resolveEntity:function(a,b){var d=new Packages.java.io.FileReader(b);return new Packages.org.xml.sax.InputSource(d)}});f=l.newDocumentBuilder();f.setEntityResolver(g);this.ByteArray=function(a){return[a]};this.byteArrayFromArray=function(a){return a};this.byteArrayFromString=
function(a){var b=[],d,k=a.length;for(d=0;d<k;d+=1)b[d]=a.charCodeAt(d)&255;return b};this.byteArrayToString=Runtime.byteArrayToString;this.concatByteArrays=function(a,b){return a.concat(b)};this.loadXML=function(a,b){var d=new Packages.java.io.File(a),k;try{k=f.parse(d)}catch(e){print(e);b(e);return}b(null,k)};this.readFile=function(a,b,d){var k=new Packages.java.io.File(a),e="binary"===b?"latin1":b;k.isFile()?(a=readFile(a,e),"binary"===b&&(a=j.byteArrayFromString(a,"binary")),d(null,a)):d(a+" is not a file.")};
this.writeFile=function(a,b,d){var a=new Packages.java.io.FileOutputStream(a),k,e=b.length;for(k=0;k<e;k+=1)a.write(b[k]);a.close();d(null)};this.deleteFile=function(a,b){(new Packages.java.io.File(a))["delete"]()?b(null):b("Could not delete "+a)};this.read=function(c,b,d,k){a&&(c=a+"/"+c);var e;e=c;var i="binary";(new Packages.java.io.File(e)).isFile()?("binary"===i&&(i="latin1"),e=readFile(e,i)):e=null;e?k(null,this.byteArrayFromString(e.substring(b,b+d),"binary")):k("Cannot read "+c)};this.readFileSync=
function(a,b){return!b?"":readFile(a,b)};this.isFile=function(c,b){a&&(c=a+"/"+c);var d=new Packages.java.io.File(c);b(d.isFile())};this.getFileSize=function(c,b){a&&(c=a+"/"+c);var d=new Packages.java.io.File(c);b(d.length())};this.log=print;this.setTimeout=function(a){a()};this.libraryPaths=function(){return["lib"]};this.setCurrentDirectory=function(c){a=c};this.currentDirectory=function(){return a};this.type=function(){return"RhinoRuntime"};this.getDOMImplementation=function(){return f.getDOMImplementation()};
this.exit=quit;this.getWindow=function(){return null}}var runtime=function(){return"undefined"!==typeof window?new BrowserRuntime(window.document.getElementById("logoutput")):"undefined"!==typeof require?new NodeJSRuntime:new RhinoRuntime}();
(function(){function j(f){var a=f[0],c;c=eval("if (typeof "+a+" === 'undefined') {eval('"+a+" = {};');}"+a);for(a=1;a<f.length-1;a+=1)c.hasOwnProperty(f[a])||(c=c[f[a]]={});return c[f[f.length-1]]}var l={},f={};runtime.loadClass=function(g){function a(a){var a=a.replace(".","/")+".js",b=runtime.libraryPaths(),e,c,h;runtime.currentDirectory&&b.push(runtime.currentDirectory());for(e=0;e<b.length;e+=1){c=b[e];if(!f.hasOwnProperty(c))if((h=runtime.readFileSync(b[e]+"/manifest.js","utf8"))&&h.length)try{f[c]=
eval(h)}catch(n){f[c]=null,runtime.log("Cannot load manifest for "+c+".")}else f[c]=null;if((c=f[c])&&c.indexOf&&-1!==c.indexOf(a))return b[e]+"/"+a}return null}if(!IS_COMPILED_CODE&&!l.hasOwnProperty(g)){var c=g.split("."),b;b=j(c);if(!b&&(b=function(b){var c,e;e=a(b);if(!e)throw b+" is not listed in any manifest.js.";try{c=runtime.readFileSync(e,"utf8")}catch(i){throw runtime.log("Error loading "+b+" "+i),i;}if(void 0===c)throw"Cannot load class "+b;try{c=eval(b+" = eval(code);")}catch(h){throw runtime.log("Error loading "+
b+" "+h),h;}return c}(g),!b||Runtime.getFunctionName(b)!==c[c.length-1]))throw runtime.log("Loaded code is not for "+c[c.length-1]),"Loaded code is not for "+c[c.length-1];l[g]=!0}}})();
(function(j){function l(f){if(f.length){var g=f[0];runtime.readFile(g,"utf8",function(a,c){function b(){var a;(a=eval(c))&&runtime.exit(a)}var d="";runtime.libraryPaths();-1!==g.indexOf("/")&&(d=g.substring(0,g.indexOf("/")));runtime.setCurrentDirectory(d);a?(runtime.log(a),runtime.exit(1)):b.apply(null,f)})}}j=Array.prototype.slice.call(j);"NodeJSRuntime"===runtime.type()?l(process.argv.slice(2)):"RhinoRuntime"===runtime.type()?l(j):l(j.slice(1))})("undefined"!==typeof arguments&&arguments);
// Input 2
core.Base64=function(){function j(a){var b=[],c,e=a.length;for(c=0;c<e;c+=1)b[c]=a.charCodeAt(c)&255;return b}function l(a){var b,c="",e,d=a.length-2;for(e=0;e<d;e+=3)b=a[e]<<16|a[e+1]<<8|a[e+2],c+=u[b>>>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<d;e+=4)i=(s[a.charAt(e)]||
0)<<18|(s[a.charAt(e+1)]||0)<<12|(s[a.charAt(e+2)]||0)<<6|(s[a.charAt(e+3)]||0),b.push(i>>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;c<e;c+=1)d=a[c],128>d?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;c<e;c+=1)d=a[c],128>d?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;e<b.length;)c+=String.fromCharCode.apply(String,b.slice(e,e+45E3)),e+=45E3;return c}function e(a,b,c){var e="",d,i,m;for(m=b;m<c;m+=1)b=a.charCodeAt(m)&255,128>b?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.length<d?b(e(a,0,a.length),!0):("string"!==typeof a&&(a=a.slice()),c())}function h(a){return g(j(a))}function n(a){return String.fromCharCode.apply(String,g(a))}function o(a){return String.fromCharCode.apply(String,g(j(a)))}var u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";(function(){var a=[],b;for(b=0;26>b;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<e;c+=1)b[a.charAt(c)]=c;return b}(u),p,w,B,A;(B=runtime.getWindow()&&runtime.getWindow().btoa)?p=function(a){return B(o(a))}:(B=c,p=function(a){return l(h(a))});(A=runtime.getWindow()&&runtime.getWindow().atob)?w=function(a){a=A(a);return e(a,0,a.length)}:(A=b,w=function(a){return k(f(a))});return function(){this.convertByteArrayToBase64=this.convertUTF8ArrayToBase64=l;this.convertBase64ToByteArray=
this.convertBase64ToUTF8Array=f;this.convertUTF16ArrayToByteArray=this.convertUTF16ArrayToUTF8Array=g;this.convertByteArrayToUTF16Array=this.convertUTF8ArrayToUTF16Array=a;this.convertUTF8StringToBase64=c;this.convertBase64ToUTF8String=b;this.convertUTF8StringToUTF16Array=d;this.convertByteArrayToUTF16String=this.convertUTF8ArrayToUTF16String=k;this.convertUTF8StringToUTF16String=i;this.convertUTF16StringToByteArray=this.convertUTF16StringToUTF8Array=h;this.convertUTF16ArrayToUTF8String=n;this.convertUTF16StringToUTF8String=
o;this.convertUTF16StringToBase64=p;this.convertBase64ToUTF16String=w;this.fromBase64=b;this.toBase64=c;this.atob=A;this.btoa=B;this.utob=o;this.btou=i;this.encode=p;this.encodeURI=function(a){return p(a).replace(/[+\/]/g,function(a){return a==="+"?"-":"_"}).replace(/\\=+$/,"")};this.decode=function(a){return w(a.replace(/[\-_]/g,function(a){return a==="-"?"+":"/"}))}}}();
// Input 3
core.RawDeflate=function(){function j(){this.dl=this.fc=0}function l(){this.extra_bits=this.static_tree=this.dyn_tree=null;this.max_code=this.max_length=this.elems=this.extra_base=0}function f(a,b,c,e){this.good_length=a;this.max_lazy=b;this.nice_length=c;this.max_chain=e}function g(){this.next=null;this.len=0;this.ptr=[];this.ptr.length=a;this.off=0}var a=8192,c,b,d,k,e=null,i,h,n,o,u,s,p,w,B,A,q,x,E,C,z,F,m,t,r,y,L,T,O,N,v,J,G,R,K,H,D,U,M,I,V,Z,S,$,Y,ha,ca,da,P,ia,pa,aa,ea,W,ba,ja,qa,ra=[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],fa=[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],Ha=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],va=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ka;ka=[new f(0,0,0,0),new f(4,4,8,4),new f(4,5,16,8),new f(4,6,32,32),new f(4,4,16,16),new f(8,16,32,32),new f(8,16,128,128),new f(8,32,128,256),new f(32,128,258,1024),new f(32,258,258,4096)];var la=function(m){e[h+i++]=m;if(h+i===a){var r;if(0!==i){null!==c?(m=c,c=c.next):m=new g;
m.next=null;m.len=m.off=0;null===b?b=d=m:d=d.next=m;m.len=i-h;for(r=0;r<m.len;r++)m.ptr[r]=e[h+r];i=h=0}}},ma=function(b){b&=65535;h+i<a-2?(e[h+i++]=b&255,e[h+i++]=b>>>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<<B,ma(w),w=a>>16-B,B+=b-16):(w|=a<<B,B+=b)},X=function(a,b){Q(b[a].fc,b[a].dl)},wa=function(a,b,c){return a[b].fc<a[c].fc||a[b].fc===a[c].fc&&S[b]<=S[c]},xa=function(a,b,c){var e;for(e=0;e<c&&qa<ja.length;e++)a[b+
e]=ja.charCodeAt(qa++)&255;return e},sa=function(){var a,b,c=65536-y-m;if(-1===c)c--;else if(65274<=m){for(a=0;32768>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<m?m-32506:0,r=m+258,n=o[c+d-1],h=o[c+d];F>=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]&&c<r);e=258-(r-c);c=r-258;if(e>d){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(2<O&&0===(P&4095)){var c=8*P,e=m-A,d;for(d=0;30>d;d++)c+=J[d].fc*(5+fa[d]);
c>>=3;if(ia<parseInt(P/2,10)&&c<parseInt(e/2,10))return!0}return 8191===P||8192===ia},ta=function(a,b){for(var c=I[b],e=b<<1;e<=V;){e<V&&wa(a,I[e+1],I[e])&&e++;if(wa(a,c,I[e]))break;I[b]=I[e];b=e;e<<=1}I[b]=c},za=function(a,b){var c=0;do c|=a&1,a>>=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;d<e;d++)0!==b[d].fc?(I[++V]=m=d,S[d]=0):b[d].dl=0;for(;2>V;)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(0<q);for(h=r;0!==h;h--)for(t=M[h];0!==t;)d=I[--a],d>c||(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<h&&d===m))(i<r?K[d].fc+=i:0!==d?(d!==
e&&K[d].fc++,K[16].fc++):10>=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(){8<B?ma(w):0<B&&la(w);B=w=0},Da=function(a,b){var c,e=0,d=0,m=0,i=0,h,r;if(0!==P){do{0===(e&7)&&(i=da[m++]);c=s[e++]&255;if(0===(i&1))X(c,a);else if(h=$[c],X(h+256+1,a),r=ra[h],0!==r&&(c-=ha[h],Q(c,r)),c=u[d++],h=(256>c?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<P)}X(256,a)},Ea=function(a,b){var c,e=-1,d,m=a[0].dl,i=0,h=7,r=4;0===m&&(h=138,r=3);for(c=
0;c<=b;c++)if(d=m,m=a[c+1].dl,!(++i<h&&d===m)){if(i<r){do X(d,K);while(0!==--i)}else 0!==d?(d!==e&&(X(d,K),i--),X(16,K),Q(i-3,2)):10>=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;e<d;e++)la(o[A+e])}else if(c===b)Q(2+a,3),Da(G,R);else{Q(4+a,3);d=H.max_code+1;b=D.max_code+1;e+=1;Q(d-257,5);Q(b-1,5);Q(e-4,4);for(c=0;c<e;c++)Q(K[va[c]].dl,3);Ea(v,d-1);Ea(J,b-1);Da(v,J)}Fa();0!==a&&Ca()},Ga=function(a,d,m){var r,t,n;for(r=0;null!==b&&r<m;){t=m-r;t>b.len&&(t=b.len);for(n=0;n<t;n++)a[d+r+n]=b.ptr[b.off+n];b.off+=t;b.len-=t;r+=t;0===b.len&&(t=b,b=b.next,t.next=c,c=t)}if(r===m)return r;
if(h<i){t=m-r;t>i-h&&(t=i-h);for(n=0;n<t;n++)a[d+r+n]=e[h+n];h+=t;r+=t;i===h&&(i=h=0)}return r},Ia=function(a,c,e){var d;if(!k){if(!r){B=w=0;var f,g;if(0===R[0].dl){H.dyn_tree=v;H.static_tree=G;H.extra_bits=ra;H.extra_base=257;H.elems=286;H.max_length=15;H.max_code=0;D.dyn_tree=J;D.static_tree=R;D.extra_bits=fa;D.extra_base=0;D.elems=30;D.max_length=15;D.max_code=0;U.dyn_tree=K;U.static_tree=null;U.extra_bits=Ha;U.extra_base=0;U.elems=19;U.max_length=7;for(g=f=U.max_code=0;28>g;g++){ha[g]=f;for(d=
0;d<1<<ra[g];d++)$[f++]=g}$[f-1]=g;for(g=f=0;16>g;g++){ca[g]=f;for(d=0;d<1<<fa[g];d++)Y[f++]=g}for(f>>=7;30>g;g++){ca[g]=f<<7;for(d=0;d<1<<fa[g]-7;d++)Y[256+f++]=g}for(d=0;15>=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<T&&32506>=m-x&&(z=ya(x),z>y&&(z=y),3===z&&4096<m-t&&z--);if(3<=F&&z<=F){g=ga(m-1-E,F-3);y-=F-1;F-=2;do m++,na();while(0!==--F);C=0;z=2;m++;g&&(oa(0),A=m)}else 0!==C?ga(0,o[m-1]&255)&&(oa(0),A=m):C=1,m++,y--;for(;262>y&&!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:9<h&&(h=9):h=6;O=h;r=k=!1;if(null===e){c=b=d=null;e=[];e.length=a;o=[];o.length=65536;u=[];u.length=8192;s=[];s.length=
32832;p=[];p.length=65536;v=[];v.length=573;for(h=0;573>h;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<h;t++)g[t]=String.fromCharCode(n[t]);f[f.length]=g.join("")}ja=null;return f.join("")}};
// Input 4
core.ByteArray=function(j){this.pos=0;this.data=j;this.readUInt32LE=function(){var j=this.data,f=this.pos+=4;return j[--f]<<24|j[--f]<<16|j[--f]<<8|j[--f]};this.readUInt16LE=function(){var j=this.data,f=this.pos+=2;return j[--f]<<8|j[--f]}};
// Input 5
core.ByteArrayWriter=function(j){var l=this,f=new runtime.ByteArray(0);this.appendByteArrayWriter=function(g){f=runtime.concatByteArrays(f,g.getByteArray())};this.appendByteArray=function(g){f=runtime.concatByteArrays(f,g)};this.appendArray=function(g){f=runtime.concatByteArrays(f,runtime.byteArrayFromArray(g))};this.appendUInt16LE=function(f){l.appendArray([f&255,f>>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;f<h.length;f++)h[f]=0;for(f=0;f<q.length;f++)q[f]=0;for(f=0;f<x.length;f++)x[f]=null;for(f=0;f<n.length;f++)n[f]=
0;for(f=0;f<s.length;f++)s[f]=0;i=256<b?a[256]:this.BMAX;o=a;j=0;f=b;do h[o[j]]++,j++;while(0<--f);if(h[0]==b)this.root=null,this.status=this.m=0;else{for(k=1;k<=this.BMAX&&0==h[k];k++);g=k;m<k&&(m=k);for(f=this.BMAX;0!=f&&0==h[f];f--);t=f;m>f&&(m=f);for(B=1<<k;k<f;k++,B<<=1)if(0>(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(++f<b);b=s[t];s[0]=f=0;o=n;j=0;
n=-1;E=q[0]=0;p=null;for(A=0;g<=t;g++)for(a=h[g];0<a--;){for(;g>E+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;++k<A&&!((r<<=1)<=h[++p]);)r-=h[p]}E+k>i&&E<i&&(k=i-E);A=1<<k;q[1+n]=k;p=Array(A);for(r=0;r<A;r++)p[r]=new z;u=null==u?this.root=new C:u.next=new C;u.next=null;u.list=p;x[n]=p;0<n&&(s[n]=f,y.b=q[n],y.e=16+k,y.t=p,k=(f&(1<<E)-1)>>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]<c?(y.e=256>o[j]?16:15,y.n=o[j++]):
(y.e=e[o[j]-c],y.n=d[o[j++]-c]);r=1<<g-E;for(k=f>>E;k<A;k+=r)p[k].e=y.e,p[k].b=y.b,p[k].n=y.n,p[k].t=y.t;for(k=1<<g-1;0!=(f&k);k>>=1)f^=k;for(f^=k;(f&(1<<E)-1)!=s[n];)E-=q[n],n--}this.m=q[1];this.status=0!=B&&1!=t?1:0}}},m=function(a){for(;b<a;)c|=(s.length==p?-1:s[p++])<<b,b+=8},t=function(a){return c&w[a]},r=function(a){c>>=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;16<f;){if(99==f)return-1;r(k.b);f-=16;m(f);k=k.t[t(f)];f=k.e}r(k.b);if(16==f)l&=
32767,a[b+g++]=j[l++]=k.n;else{if(15==f)break;m(f);e=k.n+t(f);r(f);m(u);k=n.list[t(u)];for(f=k.e;16<f;){if(99==f)return-1;r(k.b);f-=16;m(f);k=k.t[t(f)];f=k.e}r(k.b);m(f);i=l-k.n-t(f);for(r(f);0<e&&g<c;)e--,i&=32767,l&=32767,a[b+g++]=j[l++]=j[i++]}if(g==c)return c}d=-1;return g},L,T=function(a,b,c){var d,e,f,i,k,g,j,p=Array(316);for(d=0;d<p.length;d++)p[d]=0;m(5);g=257+t(5);r(5);m(5);j=1+t(5);r(5);m(4);d=4+t(4);r(4);if(286<g||30<j)return-1;for(e=0;e<d;e++)m(3),p[E[e]]=t(3),r(3);for(;19>e;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;d<i;)if(m(o),k=h.list[t(o)],e=k.b,r(e),e=k.n,16>e)p[d++]=f=e;else if(16==e){m(2);e=3+t(2);r(2);if(d+e>i)return-1;for(;0<e--;)p[d++]=f}else{17==e?(m(3),e=3+t(3),r(3)):(m(7),e=11+t(7),r(7));if(d+e>i)return-1;for(;0<e--;)p[d++]=0;f=0}o=9;e=new F(p,g,257,B,A,o);0==o&&(e.status=1);if(0!=e.status)return-1;h=e.root;o=e.m;for(d=0;d<j;d++)p[d]=p[d+g];u=6;e=new F(p,j,0,q,x,u);n=e.root;u=e.m;return 0==u&&257<g||0!=e.status?
-1:y(a,b,c)};this.inflate=function(E,C){null==j&&(j=Array(65536));b=c=l=0;d=-1;k=!1;e=i=0;h=null;s=E;p=0;var z=new runtime.ByteArray(C);a:{var w,G;for(w=0;w<C&&!(k&&-1==d);){if(0<e){if(0!=d)for(;0<e&&w<C;)e--,i&=32767,l&=32767,z[0+w++]=j[l++]=j[i++];else{for(;0<e&&w<C;)e--,l&=32767,m(8),z[0+w++]=j[l++]=t(8),r(8);0==e&&(d=-1)}if(w==C)break}if(-1==d){if(k)break;m(1);0!=t(1)&&(k=!0);r(1);m(2);d=t(2);r(2);h=null;e=0}switch(d){case 0:G=z;var R=0+w,K=C-w,H=void 0,H=b&7;r(H);m(16);H=t(16);r(16);m(16);if(H!=
(~c&65535))G=-1;else{r(16);e=H;for(H=0;0<e&&H<K;)e--,l&=32767,m(8),G[R+H++]=j[l++]=t(8),r(8);0==e&&(d=-1);G=H}break;case 1:if(null!=h)G=y(z,0+w,C-w);else b:{G=z;R=0+w;K=C-w;if(null==f){for(var D=void 0,H=Array(288),D=void 0,D=0;144>D;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(1<D.status){f=null;alert("HufBuild error: "+
D.status);G=-1;break b}g=D.root;L=D.m}h=f;n=g;o=a;u=L;G=y(G,R,K)}break;case 2:G=null!=h?y(z,0+w,C-w):T(z,0+w,C-w);break;default:G=-1}if(-1==G)break a;w+=G}}s=null;return z}};
// Input 7
core.Cursor=function(j,l){function f(a,b){for(var d=b;d&&d!==a;)d=d.parentNode;return d||b}function g(){var c,b,d;if(a.parentNode){b=0;for(c=a.parentNode.firstChild;c&&c!==a;)b+=1,c=c.nextSibling;a.previousSibling&&3===a.previousSibling.nodeType&&a.nextSibling&&3===a.nextSibling.nodeType&&(d=a.nextSibling,a.previousSibling.appendData(d.nodeValue));for(c=0;c<j.rangeCount;c+=1){var k=j.getRangeAt(c),e=b,i=void 0,h=void 0,i=a.parentNode,h=f(a,k.startContainer);f(a,k.endContainer);h===a?k.setStart(i,
e):h===i&&k.startOffset>e&&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;c<j.rangeCount;c+=1){var k=j.getRangeAt(c),e=a.previousSibling,i=d,h=b,n=e.length-i.length;k.startContainer===i?k.setStart(e,n+k.startOffset):k.startContainer===e.parentNode&&k.startOffset===h&&k.setStart(e,n);k.endContainer===i?k.setEnd(e,n+k.endOffset):k.endContainer===e.parentNode&&k.endOffset===h&&k.setEnd(e,n)}d.parentNode.removeChild(d)}a.parentNode.removeChild(a)}}
var a;a=l.createElementNS("urn:webodf:names:cursor","cursor");this.getNode=function(){return a};this.updateToSelection=function(){g();if(j.focusNode){var c=j.focusNode,b=j.focusOffset;if(3===c.nodeType){var d,f,e,i;i=c.parentNode;0===b?i.insertBefore(a,c):b===c.length?i.appendChild(a):(d=c.length,f=c.nextSibling,e=l.createTextNode(c.substringData(b,d)),c.deleteData(b,d),f?i.insertBefore(e,f):i.appendChild(e),i.insertBefore(a,e))}else if(9!==c.nodeType){for(d=c.firstChild;d&&b;)d=d.nextSibling,b-=
1;c.insertBefore(a,d)}}};this.remove=function(){g()}};
// Input 8
core.UnitTest=function(){};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(){function j(a){g+=1;runtime.log("fail",a)}function l(a,c){var b;try{if(a.length!==c.length)return!1;for(b=0;b<a.length;b+=1)if(a[b]!==c[b])return!1}catch(d){return!1}return!0}function f(a,c,b){("string"!==typeof c||"string"!==typeof b)&&runtime.log("WARN: shouldBe() expects string arguments");var d,f;try{f=eval(c)}catch(e){d=e}a=eval(b);d?j(c+" should be "+a+". Threw exception "+d):(0===a?f===a&&1/f===1/a:f===a||("number"===typeof a&&isNaN(a)?"number"===typeof f&&isNaN(f):
Object.prototype.toString.call(a)===Object.prototype.toString.call([])&&l(f,a)))?runtime.log("pass",c+" is "+b):typeof f===typeof a?j(c+" should be "+a+". Was "+(0===f&&0>1/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<n.length;i+=1)h=n[i],b=Runtime.getFunctionName(h),runtime.log("Running "+b),o=d.countFailedTests(),k.setUp(),h(),k.tearDown(),e[b]=o===d.countFailedTests();a(k.asyncTests())}};this.countFailedTests=function(){return j};this.results=function(){return l}};
// Input 9
core.PointWalker=function(j){function l(a){for(var c=-1;a;)a=a.previousSibling,c+=1;return c}var f=j,g=null,a=j&&j.firstChild,c=0;this.setPoint=function(b,d){f=b;c=d;if(3===f.nodeType)g=a=null;else{for(a=f.firstChild;d;)d-=1,a=a.nextSibling;g=a?a.previousSibling:f.lastChild}};this.stepForward=function(){var b;return 3===f.nodeType&&(b="number"===typeof f.nodeValue.length?f.nodeValue.length:f.nodeValue.length(),c<b)?(c+=1,!0):a?(1===a.nodeType?(f=a,g=null,a=f.firstChild,c=0):3===a.nodeType?(f=a,a=
g=null,c=0):(g=a,a=a.nextSibling,c+=1),!0):f!==j?(g=f,a=g.nextSibling,f=f.parentNode,c=l(g)+1,!0):!1};this.stepBackward=function(){return 3===f.nodeType&&0<c?(c-=1,!0):g?(1===g.nodeType?(f=g,g=f.lastChild,a=null,c=l(g)+1):3===g.nodeType?(f=g,a=g=null,c="number"===typeof f.nodeValue.length?f.nodeValue.length:f.nodeValue.length()):(a=g,g=g.previousSibling,c-=1),!0):f!==j?(a=f,g=a.previousSibling,f=f.parentNode,c=l(a),!0):!1};this.node=function(){return f};this.position=function(){return c};this.precedingSibling=
function(){return g};this.followingSibling=function(){return a}};
// Input 10
core.Async=function(){this.forEach=function(j,l,f){function g(a){b!==c&&(a?(b=c,f(a)):(b+=1,b===c&&f(null)))}var a,c=j.length,b=0;for(a=0;a<c;a+=1)l(j[a],g)}};
// Input 11
runtime.loadClass("core.RawInflate");runtime.loadClass("core.ByteArray");runtime.loadClass("core.ByteArrayWriter");runtime.loadClass("core.Base64");
core.Zip=function(j,l){function f(a){var b=[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],c,e,d=a.length,f=0,f=0;c=-1;for(e=0;e<d;e+=1)f=(c^a[e])&255,f=b[f],c=c>>>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;f<u;f+=1){m=new c(j,d);if(m.error){b(m.error,p);break a}n[n.length]=
m}b(null,p)}})))}}function d(a,b){var c=null,e,d;for(d=0;d<n.length;d+=1)if(e=n[d],e.filename===a){c=e;break}c?c.data?b(null,c.data):c.load(b):b(a+" not found.",null)}function k(a,b){d(a,function(a,c){if(a)return b(a,null);c=runtime.byteArrayToString(c,"utf8");b(null,c)})}function e(b){var c=new core.ByteArrayWriter("utf8"),e=0;c.appendArray([80,75,3,4,20,0,0,0,0,0]);b.data&&(e=b.data.length);c.appendUInt32LE(a(b.date));c.appendUInt32LE(f(b.data));c.appendUInt32LE(e);c.appendUInt32LE(e);c.appendUInt16LE(b.filename.length);
c.appendUInt16LE(0);c.appendString(b.filename);b.data&&c.appendByteArray(b.data);return c}function i(b,c){var e=new core.ByteArrayWriter("utf8"),d=0;e.appendArray([80,75,1,2,20,0,20,0,0,0,0,0]);b.data&&(d=b.data.length);e.appendUInt32LE(a(b.date));e.appendUInt32LE(f(b.data));e.appendUInt32LE(d);e.appendUInt32LE(d);e.appendUInt16LE(b.filename.length);e.appendArray([0,0,0,0,0,0,0,0,0,0,0,0]);e.appendUInt32LE(c);e.appendString(b.filename);return e}function h(a,b){if(a===n.length)b(null);else{var c=n[a];
void 0!==c.data?h(a+1,b):c.load(function(c){c?b(c):h(a+1,b)})}}var n,o,u,s=(new core.RawInflate).inflate,p=this,w=new core.Base64;this.load=d;this.save=function(a,b,e,d){var f,h;for(f=0;f<n.length;f+=1)if(h=n[f],h.filename===a){h.set(a,b,e,d);return}h=new c(j);h.set(a,b,e,d);n.push(h)};this.write=function(a){h(0,function(b){if(b)a(b);else{var b=new core.ByteArrayWriter("utf8"),c,d,f,h=[0];for(c=0;c<n.length;c+=1)b.appendByteArrayWriter(e(n[c])),h.push(b.getLength());f=b.getLength();for(c=0;c<n.length;c+=
1)d=n[c],b.appendByteArrayWriter(i(d,h[c]));c=b.getLength()-f;b.appendArray([80,75,5,6,0,0,0,0]);b.appendUInt16LE(n.length);b.appendUInt16LE(n.length);b.appendUInt32LE(c);b.appendUInt32LE(f);b.appendArray([0,0]);runtime.writeFile(j,b.getByteArray(),a)}})};this.loadContentXmlAsFragments=function(a,b){k(a,function(a,c){if(a)return b.rootElementReady(a);b.rootElementReady(null,c,!0)})};this.loadAsString=k;this.loadAsDOM=function(a,b){k(a,function(a,c){a?b(a,null):(c=(new DOMParser).parseFromString(c,
"text/xml"),b(null,c))})};this.loadAsDataURL=function(a,b,c){d(a,function(a,e){if(a)return c(a,null);var d=0,f;b||(b=80===e[1]&&78===e[2]&&71===e[3]?"image/png":255===e[0]&&216===e[1]&&255===e[2]?"image/jpeg":71===e[0]&&73===e[1]&&70===e[2]?"image/gif":"");for(f="data:"+b+";base64,";d<e.length;)f+=w.convertUTF8ArrayToBase64(e.slice(d,Math.min(d+45E3,e.length))),d+=45E3;c(null,f)})};this.getEntries=function(){return n.slice()};o=-1;null===l?n=[]:runtime.getFileSize(j,function(a){o=a;0>o?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<e;i+=1)if(h=k.item(i),"http://www.w3.org/2000/xmlns/"!==h.namespaceURI&&(o=l.filter?l.filter.acceptNode(h):1,1===o)){if(h.namespaceURI){o=h.prefix;var u=h.namespaceURI;c.hasOwnProperty(u)?o=c[u]+":":(c[u]!==o&&(c[u]=o),o+=":")}else o="";
n+=" "+(o+h.localName+'="'+h.nodeValue+'"')}for(i in c)c.hasOwnProperty(i)&&((o=c[i])?"xmlns"!==o&&(d+=" xmlns:"+c[i]+'="'+i+'"'):d+=' xmlns="'+i+'"');d+=n+">"}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+="</"+g.nodeName+">"),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<a.e.length;)if(d=
a.e[c],"ref"===d.name){k=b[d.a.name];if(!k)throw d.a.name+" was not defined.";d=a.e.slice(c+1);a.e=a.e.slice(0,c);a.e=a.e.concat(k.e);a.e=a.e.concat(d)}else c+=1,g(d,b);d=a.e;if("choice"===j&&(!d||!d[1]||"empty"===d[1].name))!d||!d[0]||"empty"===d[0].name?(delete a.e,a.name="empty"):(d[1]=d[0],d[0]={name:"empty"});if("group"===j||"interleave"===j)"empty"===d[0].name?"empty"===d[1].name?(delete a.e,a.name="empty"):(j=a.name=d[1].name,a.names=d[1].names,d=a.e=d[1].e):"empty"===d[1].name&&(j=a.name=
d[0].name,a.names=d[0].names,d=a.e=d[0].e);"oneOrMore"===j&&"empty"===d[0].name&&(delete a.e,a.name="empty");if("attribute"===j){k=a.names?a.names.length:0;for(var s,p=a.localnames=[k],w=a.namespaces=[k],c=0;c<k;c+=1)s=f(a.names[c]),w[c]=s[0],p[c]=s[1]}"interleave"===j&&("interleave"===d[0].name?"interleave"===d[1].name?a.e=d[0].e.concat(d[1].e):a.e=[d[1]].concat(d[0].e):"interleave"===d[1].name&&(a.e=[d[0]].concat(d[1].e)))}function a(b,c){for(var d=0,f;b.e&&d<b.e.length;)f=b.e[d],"elementref"===
f.name?(f.id=f.id||0,b.e[d]=c[f.id]):"element"!==f.name&&a(f,c),d+=1}var c=this,b,d={"http://www.w3.org/XML/1998/namespace":"xml"},k;k=function(a,b,c){var g=[],j,u,s=a.localName,p=[];j=a.attributes;var w=s,B=p,A={},q,x;for(q=0;q<j.length;q+=1)if(x=j.item(q),x.namespaceURI)"http://www.w3.org/2000/xmlns/"===x.namespaceURI&&(d[x.value]=x.localName);else{"name"===x.localName&&("element"===w||"attribute"===w)&&B.push(x.value);if("name"===x.localName||"combine"===x.localName||"type"===x.localName){var E=
x,C;C=x.value;C=C.replace(/^\s\s*/,"");for(var z=/\s/,F=C.length-1;z.test(C.charAt(F));)F-=1;C=C.slice(0,F+1);E.value=C}A[x.localName]=x.value}j=A;j.combine=j.combine||void 0;a=a.firstChild;w=g;B=p;for(A="";a;){if(1===a.nodeType&&"http://relaxng.org/ns/structure/1.0"===a.namespaceURI){if(q=k(a,b,w))"name"===q.name?B.push(d[q.a.ns]+":"+q.text):"choice"===q.name&&q.names&&q.names.length&&(B=B.concat(q.names),delete q.names),w.push(q)}else 3===a.nodeType&&(A+=a.nodeValue);a=a.nextSibling}a=A;"value"!==
s&&"param"!==s&&(a=/^\s*([\s\S]*\S)?\s*$/.exec(a)[1]);"value"===s&&void 0===j.type&&(j.type="token",j.datatypeLibrary="");if(("attribute"===s||"element"===s)&&void 0!==j.name)u=f(j.name),g=[{name:"name",text:u[1],a:{ns:u[0]}}].concat(g),delete j.name;"name"===s||"nsName"===s||"value"===s?void 0===j.ns&&(j.ns=""):delete j.ns;"name"===s&&(u=f(a),j.ns=u[0],a=u[1]);if(1<g.length&&("define"===s||"oneOrMore"===s||"zeroOrMore"===s||"optional"===s||"list"===s||"mixed"===s))g=[{name:"group",e:l({name:"group",
e:g}).e}];2<g.length&&"element"===s&&(g=[g[0]].concat({name:"group",e:l({name:"group",e:g.slice(1)}).e}));1===g.length&&"attribute"===s&&g.push({name:"text",text:a});if(1===g.length&&("choice"===s||"group"===s||"interleave"===s))s=g[0].name,p=g[0].names,j=g[0].a,a=g[0].text,g=g[0].e;else if(2<g.length&&("choice"===s||"group"===s||"interleave"===s))g=l({name:s,e:g}).e;"mixed"===s&&(s="interleave",g=[g[0],{name:"text"}]);"optional"===s&&(s="choice",g=[g[0],{name:"empty"}]);"zeroOrMore"===s&&(s="choice",
g=[{name:"oneOrMore",e:[g[0]]},{name:"empty"}]);if("define"===s&&j.combine){a:{w=j.combine;B=j.name;A=g;for(q=0;c&&q<c.length;q+=1)if(x=c[q],"define"===x.name&&x.a&&x.a.name===B){x.e=[{name:w,e:x.e.concat(A)}];c=x;break a}c=null}if(c)return}c={name:s};g&&0<g.length&&(c.e=g);for(u in j)if(j.hasOwnProperty(u)){c.a=j;break}void 0!==a&&(c.text=a);p&&0<p.length&&(c.names=p);"element"===s&&(c.id=b.length,b.push(c),c={name:"elementref",id:c.id});return c};this.parseRelaxNGDOM=function(e,f){var h=[],n=k(e&&
e.documentElement,h,void 0),o,l,s={};for(o=0;o<n.e.length;o+=1)l=n.e[o],"define"===l.name?s[l.a.name]=l:"start"===l.name&&(b=l);if(!b)return[new j("No Relax NG start element was found.")];g(b,s);for(o in s)s.hasOwnProperty(o)&&g(s[o],s);for(o=0;o<h.length;o+=1)g(h[o],s);f&&(c.rootPattern=f(b.e[0],h));a(b,h);for(o=0;o<h.length;o+=1)a(h[o],h);c.start=b;c.elements=h;c.nsmap=d;return null}};
// Input 15
runtime.loadClass("xmldom.RelaxNGParser");
xmldom.RelaxNG=function(){function j(a){return function(){var b;return function(){void 0===b&&(b=a());return b}}()}function l(a,b){return function(){var c={},d=0;return function(e){var f=e.hash||e.toString(),h;h=c[f];if(void 0!==h)return h;c[f]=h=b(e);h.hash=a+d.toString();d+=1;return h}}()}function f(a){return function(){var b={};return function(c){var d,e;e=b[c.localName];if(void 0===e)b[c.localName]=e={};else if(d=e[c.namespaceURI],void 0!==d)return d;return e[c.namespaceURI]=d=a(c)}}()}function g(a,
b,c){return function(){var d={},e=0;return function(f,h){var i=b&&b(f,h),g,k;if(void 0!==i)return i;i=f.hash||f.toString();g=h.hash||h.toString();k=d[i];if(void 0===k)d[i]=k={};else if(i=k[g],void 0!==i)return i;k[g]=i=c(f,h);i.hash=a+e.toString();e+=1;return i}}()}function a(b,c){"choice"===c.p1.type?a(b,c.p1):b[c.p1.hash]=c.p1;"choice"===c.p2.type?a(b,c.p2):b[c.p2.hash]=c.p2}function c(a,b){return{type:"element",nc:a,nullable:!1,textDeriv:function(){return q},startTagOpenDeriv:function(c){return a.contains(c)?
o(b,x):q},attDeriv:function(){return q},startTagCloseDeriv:function(){return this}}}function b(){return{type:"list",nullable:!1,hash:"list",textDeriv:function(){return x}}}function d(a,b,c,f){if(b===q)return q;if(f>=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<k&&(g=i,i=k,k=g,g=f,f=h,h=g);g=d[i];if(void 0===g)d[i]=g={};else if(i=g[k],void 0!==i)return i;g[k]=i=c(f,h);i.hash=a+e.toString();e+=1;return i}}()}("interleave",function(a,b){if(a===q||b===q)return q;if(a===x)return b;if(b===x)return a},function(a,b){return{type:"interleave",p1:a,p2:b,nullable:a.nullable&&b.nullable,textDeriv:function(c,d){return i(h(a.textDeriv(c,d),b),h(a,b.textDeriv(c,d)))},startTagOpenDeriv:f(function(c){return i(C(function(a){return h(a,
b)},a.startTagOpenDeriv(c)),C(function(b){return h(a,b)},b.startTagOpenDeriv(c)))}),attDeriv:function(c,d){return i(h(a.attDeriv(c,d),b),h(a,b.attDeriv(c,d)))},startTagCloseDeriv:j(function(){return h(a.startTagCloseDeriv(),b.startTagCloseDeriv())})}});n=g("group",function(a,b){if(a===q||b===q)return q;if(a===x)return b;if(b===x)return a},function(a,b){return{type:"group",p1:a,p2:b,nullable:a.nullable&&b.nullable,textDeriv:function(c,d){var e=n(a.textDeriv(c,d),b);return a.nullable?i(e,b.textDeriv(c,
d)):e},startTagOpenDeriv:function(c){var d=C(function(a){return n(a,b)},a.startTagOpenDeriv(c));return a.nullable?i(d,b.startTagOpenDeriv(c)):d},attDeriv:function(c,d){return i(n(a.attDeriv(c,d),b),n(a,b.attDeriv(c,d)))},startTagCloseDeriv:j(function(){return n(a.startTagCloseDeriv(),b.startTagCloseDeriv())})}});o=g("after",function(a,b){if(a===q||b===q)return q},function(a,b){return{type:"after",p1:a,p2:b,nullable:!1,textDeriv:function(c,d){return o(a.textDeriv(c,d),b)},startTagOpenDeriv:f(function(c){return C(function(a){return o(a,
b)},a.startTagOpenDeriv(c))}),attDeriv:function(c,d){return o(a.attDeriv(c,d),b)},startTagCloseDeriv:j(function(){return o(a.startTagCloseDeriv(),b)}),endTagDeriv:j(function(){return a.nullable?b:q})}});u=l("oneormore",function(a){return a===q?q:{type:"oneOrMore",p:a,nullable:a.nullable,textDeriv:function(b,c){return n(a.textDeriv(b,c),i(this,x))},startTagOpenDeriv:function(b){var c=this;return C(function(a){return n(a,i(c,x))},a.startTagOpenDeriv(b))},attDeriv:function(b,c){return n(a.attDeriv(b,
c),i(this,x))},startTagCloseDeriv:j(function(){return u(a.startTagCloseDeriv())})}});p=g("attribute",void 0,function(a,b){return{type:"attribute",nullable:!1,nc:a,p:b,attDeriv:function(c,d){return a.contains(d)&&(b.nullable&&/^\s+$/.test(d.nodeValue)||b.textDeriv(c,d.nodeValue).nullable)?x:q},startTagCloseDeriv:function(){return q}}});s=l("value",function(a){return{type:"value",nullable:!1,value:a,textDeriv:function(b,c){return c===a?x:q},attDeriv:function(){return q},startTagCloseDeriv:function(){return this}}});
B=l("data",function(a){return{type:"data",nullable:!1,dataType:a,textDeriv:function(){return x},attDeriv:function(){return q},startTagCloseDeriv:function(){return this}}});C=function t(a,b){return"after"===b.type?o(b.p1,a(b.p2)):"choice"===b.type?i(t(a,b.p1),t(a,b.p2)):b};z=function(a,b,c){for(var e=c.currentNode,b=b.startTagOpenDeriv(e),b=d(a,b,e.attributes,0),f=b=b.startTagCloseDeriv(),e=c.currentNode,b=c.firstChild(),h=[],g;b;)1===b.nodeType?h.push(b):3===b.nodeType&&!/^\s*$/.test(b.nodeValue)&&
h.push(b.nodeValue),b=c.nextSibling();0===h.length&&(h=[""]);g=f;for(f=0;g!==q&&f<h.length;f+=1)b=h[f],"string"===typeof b?g=/^\s*$/.test(b)?i(g,g.textDeriv(a,b)):g.textDeriv(a,b):(c.currentNode=b,g=z(a,g,c));c.currentNode=e;return b=g.endTagDeriv()};w=function(a){var b,c,d;if("name"===a.name)b=a.text,c=a.a.ns,a={name:b,ns:c,hash:"{"+c+"}"+b,contains:function(a){return a.namespaceURI===c&&a.localName===b}};else if("choice"===a.name){b=[];c=[];k(b,c,a);a="";for(d=0;d<b.length;d+=1)a+="{"+c[d]+"}"+
b[d]+",";a={hash:a,contains:function(a){var d;for(d=0;d<b.length;d+=1)if(b[d]===a.localName&&c[d]===a.namespaceURI)return!0;return!1}}}else a={hash:"anyName",contains:function(){return!0}};return a};A=function r(a,d){var e,f;if("elementref"===a.name){e=a.id||0;a=d[e];if(void 0!==a.name){var g=a;e=d[g.id]={hash:"element"+g.id.toString()};g=c(w(g.e[0]),A(g.e[1],d));for(f in g)g.hasOwnProperty(f)&&(e[f]=g[f]);f=e}else f=a;return f}switch(a.name){case "empty":return x;case "notAllowed":return q;case "text":return E;
case "choice":return i(r(a.e[0],d),r(a.e[1],d));case "interleave":e=r(a.e[0],d);for(f=1;f<a.e.length;f+=1)e=h(e,r(a.e[f],d));return e;case "group":return n(r(a.e[0],d),r(a.e[1],d));case "oneOrMore":return u(r(a.e[0],d));case "attribute":return p(w(a.e[0]),r(a.e[1],d));case "value":return s(a.text);case "data":return e=a.a&&a.a.type,void 0===e&&(e=""),B(e);case "list":return b()}throw"No support for "+a.name;};this.makePattern=function(a,b){var c={},d;for(d in b)b.hasOwnProperty(d)&&(c[d]=b[d]);return d=
A(a,c)};this.validate=function(a,b){var c;a.currentNode=a.root;c=z(null,F,a);c.nullable?b(null):(runtime.log("Error in Relax NG validation: "+c),b(["Error in Relax NG validation: "+c]))};this.init=function(a){F=a}};
// Input 16
runtime.loadClass("xmldom.RelaxNGParser");
xmldom.RelaxNG2=function(){function j(a,c){this.message=function(){c&&(a+=1===c.nodeType?" Element ":" Node ",a+=c.nodeName,c.nodeValue&&(a+=" with value '"+c.nodeValue+"'"),a+=".");return a}}function l(b,c,f,e){return"empty"===b.name?null:a(b,c,f,e)}function f(a,d){if(2!==a.e.length)throw"Element with wrong # of elements: "+a.e.length;for(var f=d.currentNode,e=f?f.nodeType:0,g=null;1<e;){if(8!==e&&(3!==e||!/^\s+$/.test(d.currentNode.nodeValue)))return[new j("Not allowed node of type "+e+".")];e=
(f=d.nextSibling())?f.nodeType:0}if(!f)return[new j("Missing element "+a.names)];if(a.names&&-1===a.names.indexOf(c[f.namespaceURI]+":"+f.localName))return[new j("Found "+f.nodeName+" instead of "+a.names+".",f)];if(d.firstChild()){for(g=l(a.e[1],d,f);d.nextSibling();)if(e=d.currentNode.nodeType,(!d.currentNode||!(3===d.currentNode.nodeType&&/^\s+$/.test(d.currentNode.nodeValue)))&&8!==e)return[new j("Spurious content.",d.currentNode)];if(d.parentNode()!==f)return[new j("Implementation error.")]}else g=
l(a.e[1],d,f);d.nextSibling();return g}var g,a,c;a=function(b,c,g,e){var i=b.name,h=null;if("text"===i)a:{for(var n=(b=c.currentNode)?b.nodeType:0;b!==g&&3!==n;){if(1===n){h=[new j("Element not allowed here.",b)];break a}n=(b=c.nextSibling())?b.nodeType:0}c.nextSibling();h=null}else if("data"===i)h=null;else if("value"===i)e!==b.text&&(h=[new j("Wrong value, should be '"+b.text+"', not '"+e+"'",g)]);else if("list"===i)h=null;else if("attribute"===i)a:{if(2!==b.e.length)throw"Attribute with wrong # of elements: "+
b.e.length;i=b.localnames.length;for(h=0;h<i;h+=1){e=g.getAttributeNS(b.namespaces[h],b.localnames[h]);""===e&&!g.hasAttributeNS(b.namespaces[h],b.localnames[h])&&(e=void 0);if(void 0!==n&&void 0!==e){h=[new j("Attribute defined too often.",g)];break a}n=e}h=void 0===n?[new j("Attribute not found: "+b.names,g)]:l(b.e[1],c,g,n)}else if("element"===i)h=f(b,c,g);else if("oneOrMore"===i){e=0;do n=c.currentNode,i=a(b.e[0],c,g),e+=1;while(!i&&n!==c.currentNode);1<e?(c.currentNode=n,h=null):h=i}else if("choice"===
i){if(2!==b.e.length)throw"Choice with wrong # of options: "+b.e.length;n=c.currentNode;if("empty"===b.e[0].name){if(i=a(b.e[1],c,g,e))c.currentNode=n;h=null}else{if(i=l(b.e[0],c,g,e))c.currentNode=n,i=a(b.e[1],c,g,e);h=i}}else if("group"===i){if(2!==b.e.length)throw"Group with wrong # of members: "+b.e.length;h=a(b.e[0],c,g)||a(b.e[1],c,g)}else if("interleave"===i)a:{for(var n=b.e.length,e=[n],o=n,u,s,p,w;0<o;){u=0;s=c.currentNode;for(h=0;h<n;h+=1)p=c.currentNode,!0!==e[h]&&e[h]!==p&&(w=b.e[h],(i=
a(w,c,g))?(c.currentNode=p,void 0===e[h]&&(e[h]=!1)):p===c.currentNode||"oneOrMore"===w.name||"choice"===w.name&&("oneOrMore"===w.e[0].name||"oneOrMore"===w.e[1].name)?(u+=1,e[h]=p):(u+=1,e[h]=!0));if(s===c.currentNode&&u===o)break;if(0===u){for(h=0;h<n;h+=1)if(!1===e[h]){h=[new j("Interleave does not match.",g)];break a}break}for(h=o=0;h<n;h+=1)!0!==e[h]&&(o+=1)}h=null}else throw i+" not allowed in nonEmptyPattern.";return h};this.validate=function(a,c){a.currentNode=a.root;var f=l(g.e[0],a,a.root);
c(f)};this.init=function(a,d){g=a;c=d}};
// Input 17
xmldom.OperationalTransformInterface=function(){};xmldom.OperationalTransformInterface.prototype.retain=function(){};xmldom.OperationalTransformInterface.prototype.insertCharacters=function(){};xmldom.OperationalTransformInterface.prototype.insertElementStart=function(){};xmldom.OperationalTransformInterface.prototype.insertElementEnd=function(){};xmldom.OperationalTransformInterface.prototype.deleteCharacters=function(){};xmldom.OperationalTransformInterface.prototype.deleteElementStart=function(){};
xmldom.OperationalTransformInterface.prototype.deleteElementEnd=function(){};xmldom.OperationalTransformInterface.prototype.replaceAttributes=function(){};xmldom.OperationalTransformInterface.prototype.updateAttributes=function(){};
// Input 18
xmldom.OperationalTransformDOM=function(){this.retain=function(){};this.insertCharacters=function(){};this.insertElementStart=function(){};this.insertElementEnd=function(){};this.deleteCharacters=function(){};this.deleteElementStart=function(){};this.deleteElementEnd=function(){};this.replaceAttributes=function(){};this.updateAttributes=function(){};this.atEnd=function(){return!0}};
// Input 19
xmldom.XPath=function(){function j(a,b,c){return-1!==a&&(a<b||-1===b)&&(a<c||-1===c)}function l(a){for(var b=[],c=0,d=a.length,e;c<d;){var f=a,g=d,i=b,k="",l=[],E=f.indexOf("[",c),C=f.indexOf("/",c),z=f.indexOf("=",c);j(C,E,z)?(k=f.substring(c,C),c=C+1):j(E,C,z)?(k=f.substring(c,E),c=h(f,E,l)):j(z,C,E)?(k=f.substring(c,z),c=z):(k=f.substring(c,g),c=g);i.push({location:k,predicates:l});if(c<d&&"="===a[c]){e=a.substring(c+1,d);if(2<e.length&&("'"===e[0]||'"'===e[0]))e=e.slice(1,e.length-1);else try{e=
parseInt(e,10)}catch(F){}c=d}}return{steps:b,value:e}}function f(){}function g(){var a,c=!1;this.setNode=function(c){a=c};this.reset=function(){c=!1};this.next=function(){var b=c?null:a;c=!0;return b}}function a(a,c,b){this.reset=function(){a.reset()};this.next=function(){for(var d=a.next();d&&!(d=d.getAttributeNodeNS(c,b));)d=a.next();return d}}function c(a,c){var b=a.next(),d=null;this.reset=function(){a.reset();b=a.next();d=null};this.next=function(){for(;b;){if(d)if(c&&d.firstChild)d=d.firstChild;
else{for(;!d.nextSibling&&d!==b;)d=d.parentNode;d===b?b=a.next():d=d.nextSibling}else{do(d=b.firstChild)||(b=a.next());while(b&&!d)}if(d&&1===d.nodeType)return d}return null}}function b(a,c){this.reset=function(){a.reset()};this.next=function(){for(var b=a.next();b&&!c(b);)b=a.next();return b}}function d(a,c,d){var c=c.split(":",2),e=d(c[0]),f=c[1];return new b(a,function(a){return a.localName===f&&a.namespaceURI===e})}function k(a,c,d){var e=new g,f=i(e,c,d),h=c.value;return void 0===h?new b(a,function(a){e.setNode(a);
f.reset();return f.next()}):new b(a,function(a){e.setNode(a);f.reset();return(a=f.next())&&a.nodeValue===h})}function e(a,c,b){var d=a.ownerDocument,e=[],e=new g;e.setNode(a);a=l(c);e=i(e,a,b);a=[];for(b=e.next();b;)a.push(b),b=e.next();return e=a}var i,h;h=function(a,c,b){for(var d=c,e=a.length,f=0;d<e;)"]"===a[d]?(f-=1,0>=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<e.steps.length;g+=1){i=e.steps[g];h=i.location;""===h?b=new c(b,!1):"@"===h[0]?(j=h.slice(1).split(":",2),b=new a(b,f(j[0]),j[1])):"."!==h&&(b=new c(b,!1),-1!==h.indexOf(":")&&(b=d(b,h,f)));for(h=0;h<i.predicates.length;h+=1)j=i.predicates[h],b=k(b,j,f)}return b};xmldom.XPath=function(){this.getODFElementsWithXPath=e};return xmldom.XPath}();
// Input 20
odf.StyleInfo=function(){function j(f,g){for(var a=l[f.localName],c=a&&a[f.namespaceURI],b=c?c.length:0,d,k,e,a=0;a<b;a+=1)if(d=f.getAttributeNS(c[a].ns,c[a].localname))k=c[a].keygroup,(e=g[k])||(e=g[k]={}),e[d]=1;for(a=f.firstChild;a;)1===a.nodeType&&(c=a,j(c,g)),a=a.nextSibling}var l;this.UsedKeysList=function(f){var g={};this.uses=function(a){var c=a.localName,b=a.getAttributeNS("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","name")||a.getAttributeNS("urn:oasis:names:tc:opendocument:xmlns:style:1.0",
"name"),a="style"===c?a.getAttributeNS("urn:oasis:names:tc:opendocument:xmlns:style:1.0","family"):"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"===a.namespaceURI?"data":c;return(a=g[a])?0<a[b]:!1};j(f,g)};this.canElementHaveStyle=function(f,g){var a=l[g.localName];return(a=a&&a[g.namespaceURI])&&0<a.length};l=function(f){var g,a,c,b,d,j={},e;for(g in f)if(f.hasOwnProperty(g)){c=f[g];d=c.length;for(a=0;a<d;a+=1)b=c[a],e=j[b.en]=j[b.en]||{},e=e[b.ens]=e[b.ens]||[],e.push({ns:b.ans,localname:b.a,
keygroup:g})}return j}({text:[{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"tab-stop",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"leader-text-style"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"drop-cap",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"notes-configuration",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"citation-body-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"notes-configuration",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"citation-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"a",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"alphabetical-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"linenumbering-configuration",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"list-level-style-number",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"ruby-text",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"span",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"a",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
a:"visited-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"text-properties",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"text-line-through-text-style"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"alphabetical-index-source",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"main-entry-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-bibliography",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-chapter",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-link-end",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-link-start",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"index-entry-page-number",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-span",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-tab-stop",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-entry-text",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-title-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"list-level-style-bullet",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"outline-level-style",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"}],paragraph:[{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"caption",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"circle",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"connector",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"control",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"custom-shape",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"ellipse",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"frame",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"line",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"measure",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"path",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polyline",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"rect",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"regular-polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:office:1.0",
en:"annotation",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:form:1.0",en:"column",ans:"urn:oasis:names:tc:opendocument:xmlns:form:1.0",a:"text-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"next-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"body",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"even-columns",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"even-rows",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"first-column",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
en:"first-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"last-column",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"last-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"odd-columns",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"odd-rows",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"paragraph-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"notes-configuration",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"default-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"alphabetical-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"bibliography-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"h",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"illustration-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-source-style",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"object-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"p",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"table-of-content-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-index-entry-template",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"page-layout-properties",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"register-truth-ref-style-name"}],chart:[{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"axis",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"chart",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"data-label",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
en:"data-point",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"equation",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"error-indicator",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"floor",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"footer",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"grid",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"legend",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"mean-value",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"plot-area",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"regression-curve",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"series",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"stock-gain-marker",
ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"stock-loss-marker",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"stock-range-line",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"subtitle",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"title",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",en:"wall",ans:"urn:oasis:names:tc:opendocument:xmlns:chart:1.0",a:"style-name"}],section:[{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"alphabetical-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"bibliography",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"illustration-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"index-title",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"object-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"section",
ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-of-content",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-index",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"}],ruby:[{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"ruby",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"}],table:[{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",en:"query",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",en:"table-representation",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"background",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"table",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"}],"table-column":[{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",en:"column",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"table-column",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"}],"table-row":[{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",
en:"query",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",a:"default-row-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",en:"table-representation",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",a:"default-row-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"table-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"}],"table-cell":[{ens:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",en:"column",ans:"urn:oasis:names:tc:opendocument:xmlns:database:1.0",
a:"default-cell-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"table-column",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"default-cell-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"table-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"default-cell-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"body",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
en:"covered-table-cell",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"even-columns",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"covered-table-cell",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"even-columns",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"even-rows",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"first-column",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"first-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"last-column",
ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"last-row",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"odd-columns",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",en:"odd-rows",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",
en:"table-cell",ans:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",a:"style-name"}],graphic:[{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"cube",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"extrude",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"rotate",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"scene",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"sphere",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"caption",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"circle",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"connector",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"control",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"custom-shape",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"ellipse",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"frame",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"g",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"line",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"measure",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"page-thumbnail",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"path",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polyline",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"rect",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"regular-polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:office:1.0",en:"annotation",
ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"}],presentation:[{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"cube",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"extrude",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"rotate",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"scene",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",en:"sphere",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"caption",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"circle",
ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"connector",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"control",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"custom-shape",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"ellipse",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"frame",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"g",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"line",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"measure",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"page-thumbnail",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"path",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"polyline",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"rect",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
en:"regular-polygon",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:office:1.0",en:"annotation",ans:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",a:"style-name"}],"drawing-page":[{ens:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",en:"page",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",en:"notes",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"handout-master",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"master-page",ans:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",a:"style-name"}],"list-style":[{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"list",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"numbered-paragraph",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"list-item",ans:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",a:"style-override"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"list-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},
{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"percentage-data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",en:"date-time-decl",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"creation-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"creation-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"database-display",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"editing-duration",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"expression",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"meta-field",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"modification-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"modification-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"print-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"print-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-formula",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-defined",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-field-get",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"user-field-input",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-get",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-input",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-set",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"}],data:[{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"style",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"percentage-data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",en:"date-time-decl",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"creation-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"creation-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"database-display",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"editing-duration",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"expression",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"meta-field",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"modification-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"modification-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"print-date",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"print-time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"table-formula",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"time",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-defined",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",
en:"user-field-get",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"user-field-input",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-get",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-input",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
a:"data-style-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:text:1.0",en:"variable-set",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"data-style-name"}],"page-layout":[{ens:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",en:"notes",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"page-layout-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",en:"handout-master",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"page-layout-name"},{ens:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",
en:"master-page",ans:"urn:oasis:names:tc:opendocument:xmlns:style:1.0",a:"page-layout-name"}]})};
// Input 21
odf.Style2CSS=function(){function j(a,b){var c={},d,e,f;if(!b)return c;for(d=b.firstChild;d;){d.namespaceURI===h&&"style"===d.localName?f=d.getAttributeNS(h,"family"):d.namespaceURI===n&&"list-style"===d.localName&&(f="list");if(e=f&&d.getAttributeNS&&d.getAttributeNS(h,"name"))c[f]||(c[f]={}),c[f][e]=d;d=d.nextSibling}return c}function l(a,c){if(!c||!a)return null;if(a[c])return a[c];var b,d;for(b in a)if(a.hasOwnProperty(b)&&(d=l(a[b].derivedStyles,c)))return d;return null}function f(a,c,b){var d=
c[a],e,g;d&&((e=d.getAttributeNS(h,"parent-style-name"),g=null,e&&(g=l(b,e),!g&&c[e]&&(f(e,c,b),g=c[e],c[e]=null)),g)?(g.derivedStyles||(g.derivedStyles={}),g.derivedStyles[a]=d):b[a]=d)}function g(a,c){for(var b in a)a.hasOwnProperty(b)&&(f(b,a,c),a[b]=null)}function a(a,c){var b=u[a],d;if(null===b)return null;d="["+b+'|style-name="'+c+'"]';"presentation"===b&&(b="draw",d='[presentation|style-name="'+c+'"]');return b+"|"+s[a].join(d+","+b+"|")+d}function c(b,d,e){var f=[],g,h;f.push(a(b,d));for(g in e.derivedStyles)if(e.derivedStyles.hasOwnProperty(g))for(h in d=
c(b,g,e.derivedStyles[g]),d)d.hasOwnProperty(h)&&f.push(d[h]);return f}function b(a,b,c){if(!a)return null;for(a=a.firstChild;a;){if(a.namespaceURI===b&&a.localName===c)return b=a;a=a.nextSibling}return null}function d(a,b){var c="",d,e;for(d in b)b.hasOwnProperty(d)&&(d=b[d],(e=a.getAttributeNS(d[0],d[1]))&&(c+=d[2]+":"+e+";"));return c}function k(a,b,c,d){b='text|list[text|style-name="'+b+'"]';for(c=(c=c.getAttributeNS(n,"level"))&&parseInt(c,10);1<c;)b+=" > 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(0<t.length&&(r=t.item(0).getAttributeNS(i,"href")))m+="background-image: url('odfkit:"+r+"');",t=t.item(0),m+=d(t,w);l+=m}if(m=b(j,h,"graphic-properties"))m=""+d(m,A),l+=m;if(m=b(j,h,"table-cell-properties"))m=""+d(m,q),l+=m;if(0!==l.length)try{a.insertRule(g+"{"+l+"}",a.cssRules.length)}catch(O){throw O;}}for(var N in j.derivedStyles)j.derivedStyles.hasOwnProperty(N)&&e(a,f,N,j.derivedStyles[N])}var i="http://www.w3.org/1999/xlink",
h="urn:oasis:names:tc:opendocument:xmlns:style:1.0",n="urn:oasis:names:tc:opendocument:xmlns:text:1.0",o={draw:"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",fo:"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",office:"urn:oasis:names:tc:opendocument:xmlns:office:1.0",presentation:"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",style:h,svg:"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",table:"urn:oasis:names:tc:opendocument:xmlns:table:1.0",text:n,xlink:i},u=
{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"},s={graphic:"circle,connected,control,custom-shape,ellipse,frame,g,line,measure,page,page-thumbnail,path,polygon,polyline,rect,regular-polygon".split(","),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".split(","),
presentation:"caption,circle,connector,control,custom-shape,ellipse,frame,g,line,measure,page-thumbnail,path,polygon,polyline,rect,regular-polygon".split(","),ruby:["ruby","ruby-text"],section:"alphabetical-index,bibliography,illustration-index,index-title,object-index,section,table-of-content,table-index,user-index".split(","),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".split(","),
"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".split(","),list:["list-item"]},p=[["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","color","color"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
"background-color","background-color"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","font-weight","font-weight"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","font-style","font-style"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","font-size","font-size"]],w=[[h,"repeat","background-repeat"]],B=[["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","background-color","background-color"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
"text-align","text-align"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","padding-left","padding-left"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","padding-right","padding-right"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","padding-top","padding-top"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","padding-bottom","padding-bottom"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-left","border-left"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
"border-right","border-right"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-top","border-top"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-bottom","border-bottom"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","margin-left","margin-left"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","margin-right","margin-right"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","margin-top","margin-top"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
"margin-bottom","margin-bottom"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border","border"]],A=[["urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","fill-color","background-color"],["urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","fill","background"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","min-height","min-height"],["urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","stroke","border"],["urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
"stroke-color","border-color"]],q=[["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","background-color","background-color"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-left","border-left"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-right","border-right"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-top","border-top"],["urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","border-bottom","border-bottom"]];
this.namespaces=o;this.namespaceResolver=function(a){return o[a]||null};this.namespaceResolver.lookupNamespaceURI=this.namespaceResolver;this.style2css=function(a,b,c){for(var d,f,h,i,k;a.cssRules.length;)a.deleteRule(a.cssRules.length-1);d=null;b&&(d=b.ownerDocument);c&&(d=c.ownerDocument);if(d){for(f in o)if(o.hasOwnProperty(f)){i="@namespace "+f+" url("+o[f]+");";try{a.insertRule(i,a.cssRules.length)}catch(p){}}b=j(d,b);f=j(d,c);c={};for(k in u)if(u.hasOwnProperty(k))for(h in d=c[k]={},g(b[k],
d),g(f[k],d),d)d.hasOwnProperty(h)&&e(a,k,h,d[h])}}};
// Input 22
runtime.loadClass("core.Base64");runtime.loadClass("xmldom.XPath");runtime.loadClass("odf.Style2CSS");
odf.FontLoader=function(){function j(c,b,d,f,e){var g,h=0,l;for(l in c)c.hasOwnProperty(l)&&(h===d&&(g=l),h+=1);if(!g)return e();b.load(c[g].href,function(h,l){if(h)runtime.log(h);else{var n=f,n=document.styleSheets[0],p='@font-face { font-family: "'+g+'"; src: url(data:application/x-font-ttf;charset=binary;base64,'+a.convertUTF8ArrayToBase64(l)+') format("truetype"); }';try{n.insertRule(p,n.cssRules.length)}catch(w){runtime.log("Problem inserting rule in CSS: "+p)}}return j(c,b,d+1,f,e)})}function l(a,
b,d){j(a,b,0,d,function(){})}var f=new odf.Style2CSS,g=new xmldom.XPath,a=new core.Base64;odf.FontLoader=function(){this.loadFonts=function(a,b,d){var j={},e,i,h;if(a){a=g.getODFElementsWithXPath(a,"style:font-face[svg:font-face-src]",f.namespaceResolver);for(e=0;e<a.length;e+=1)i=a[e],h=i.getAttributeNS(f.namespaces.style,"name"),i=g.getODFElementsWithXPath(i,"svg:font-face-src/svg:font-face-uri",f.namespaceResolver),0<i.length&&(i=i[0].getAttributeNS(f.namespaces.xlink,"href"),j[h]={href:i})}l(j,
b,d)}};return odf.FontLoader}();
// Input 23
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(){function j(a,b,c){for(a=a?a.firstChild:null;a;){if(a.localName===c&&a.namespaceURI===b)return a;a=a.nextSibling}return null}function l(a){var b,c=h.length;for(b=0;b<c;b+=1)if(a.namespaceURI===e&&a.localName===h[b])return b;return-1}function f(a,b){var c=a.automaticStyles,e;b&&(e=new d.UsedKeysList(b));this.acceptNode=function(a){return"http://www.w3.org/1999/xhtml"===a.namespaceURI?3:e&&a.parentNode===c&&1===a.nodeType?e.uses(a)?1:2:1}}function g(a,b){if(b){var c=l(b),
d,e=a.firstChild;if(-1!==c){for(;e;){d=l(e);if(-1!==d&&d>c)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'<?xml version="1.0" encoding="UTF-8"?><office:'+a+" "+c+' office:version="1.2">'}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+"</office:document-meta>"}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+"</office:document-settings>"}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+"</office:document-styles>"}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+"</office:document-content>"}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;g<f.length;g+=0){a=void 0;c=[];for(a=(new j(f[g])).next();a;)l.canElementHaveStyle("paragraph",
a)&&c.push(a);for(a=0;a<c.length;a+=1)-1===b.indexOf(c[a])&&b.push(c[a])}return b};this.getTextStyles=function(){return[]}};
// Input 25
runtime.loadClass("odf.OdfContainer");runtime.loadClass("odf.Formatting");runtime.loadClass("xmldom.XPath");
odf.OdfCanvas=function(){function j(a){function b(){for(;0<c.cssRules.length;)c.deleteRule(0);c.insertRule("office|presentation draw|page {display:none;}",0);c.insertRule("office|presentation draw|page:nth-child("+d+") {display:block;}",1)}var c=a.sheet,d=1;this.showNextPage=function(){d+=1;b()};this.showPreviousPage=function(){1<d&&(d-=1,b())};this.css=a}function l(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent?a.attachEvent("on"+b,c):a["on"+b]=c}function f(a){function b(a,c){for(;c;){if(c===
a)return!0;c=c.parentNode}return!1}function c(){var f=[],g=runtime.getWindow().getSelection(),h,i;for(h=0;h<g.rangeCount;h+=1)i=g.getRangeAt(h),null!==i&&b(a,i.startContainer)&&b(a,i.endContainer)&&f.push(i);if(f.length===d.length){for(g=0;g<f.length&&!(f[g]===d[g]?0:null===f[g]||null===d[g]||f[g].startContainer!==d[g].startContainer||f[g].startOffset!==d[g].startOffset||f[g].endContainer!==d[g].endContainer||f[g].endOffset!==d[g].endOffset);g+=1);if(g===f.length)return}d=f;var g=[f.length],j,k=a.ownerDocument;
for(h=0;h<f.length;h+=1)i=f[h],j=k.createRange(),j.setStart(i.startContainer,i.startOffset),j.setEnd(i.endContainer,i.endOffset),g[h]=j;d=g;g=e.length;for(f=0;f<g;f+=1)e[f](a,d)}var d=[],e=[];this.addListener=function(a,b){var c,d=e.length;for(c=0;c<d;c+=1)if(e[c]===b)return;e.push(b)};l(a,"mouseup",c);l(a,"keyup",c);l(a,"keydown",c)}function g(a){for(a=a.firstChild;a;){if(a.namespaceURI===o&&"binary-data"===a.localName)return"data:image/png;base64,"+a.textContent;a=a.nextSibling}return""}function a(a,
b,c,d){function e(b){b='draw|image[styleid="'+a+'"] {'+("background-image: url("+b+");")+"}";d.insertRule(b,d.cssRules.length)}c.setAttribute("styleid",a);var f=c.getAttributeNS(p,"href"),h;if(f)try{b.getPartUrl?(f=b.getPartUrl(f),e(f)):(h=b.getPart(f),h.onchange=function(a){e(a.url)},h.load())}catch(i){runtime.log("slight problem: "+i)}else f=g(c),e(f)}function c(b,c,d){function e(b,c,d,f){x.addToQueue(function(){a(b,c,d,f)})}var f,g;f=c.getElementsByTagNameNS(h,"image");for(c=0;c<f.length;c+=1)g=
f.item(c),e("image"+c,b,g,d)}function b(a,b,c){function d(a,b){"video/"===b.substr(0,6)?(e=h.createElementNS(h.documentElement.namespaceURI,"video"),e.setAttribute("controls","controls"),f=h.createElement("source"),f.setAttribute("src",a),f.setAttribute("type",b),e.appendChild(f),c.parentNode.appendChild(e)):c.innerHtml="Unrecognised Plugin"}var e,f,h=c.ownerDocument,i;if(a=c.getAttributeNS(p,"href"))try{b.getPartUrl?(a=b.getPartUrl(a),d(a,"video/mp4")):(i=b.getPart(a),i.onchange=function(a){d(a.url,
a.mimetype)},i.load())}catch(j){runtime.log("slight problem: "+j)}else runtime.log("using MP4 data fallback"),a=g(c),d(a,"video/mp4")}function d(a,c,d){function e(a,c,d,f){x.addToQueue(function(){b(a,c,d,f)})}var f,g;f=c.getElementsByTagNameNS(h,"plugin");runtime.log("Loading Videos:");for(c=0;c<f.length;c+=1)runtime.log("...Found a video."),g=f.item(c),e("video"+c,a,g,d)}function k(a){var b=a.getElementsByTagName("style"),c=a.getElementsByTagName("head")[0],d="",e,b=b&&0<b.length?b[0].cloneNode(!1):
a.createElement("style");for(e in i)i.hasOwnProperty(e)&&e&&(d+="@namespace "+e+" url("+i[e]+");\n");b.appendChild(a.createTextNode(d));c.appendChild(b);return b}var e=new odf.Style2CSS,i=e.namespaces,h=i.draw,n=i.fo,o=i.office,u=i.svg,s=i.text,p=i.xlink,w=runtime.getWindow(),B=new xmldom.XPath,A={},q,x=new function(){function a(d){c=!0;runtime.setTimeout(function(){try{d()}catch(e){runtime.log(e)}c=!1;0<b.length&&a(b.pop())},10)}var b=[],c=!1;this.clearQueue=function(){b.length=0};this.addToQueue=
function(d){if(0===b.length&&!c)return a(d);b.push(d)}};odf.OdfCanvas=function(a){function b(){var c=a.firstChild.firstChild;c&&(a.style.WebkitTransform="scale("+v+")",a.style.WebkitTransformOrigin="left top",a.style.width=Math.round(v*c.offsetWidth)+"px",a.style.height=Math.round(v*c.offsetHeight)+"px")}function g(f){function i(){for(var g=a;g.firstChild;)g.removeChild(g.firstChild);a.style.display="inline-block";g=f.rootElement;a.ownerDocument.importNode(g,!0);o.setOdfContainer(f);var j=T;(new odf.Style2CSS).style2css(j.sheet,
g.styles,g.automaticStyles);var j=f,k=O.sheet,l;l=g.body;var p,q,w;q=[];for(p=l.firstChild;p&&p!==l;)if(p.namespaceURI===h&&(q[q.length]=p),p.firstChild)p=p.firstChild;else{for(;p&&p!==l&&!p.nextSibling;)p=p.parentNode;p&&p.nextSibling&&(p=p.nextSibling)}for(w=0;w<q.length;w+=1){p=q[w];var t="frame"+w,x=k;p.setAttribute("styleid",t);var v=void 0,y=p.getAttributeNS(s,"anchor-type"),G=p.getAttributeNS(u,"x"),z=p.getAttributeNS(u,"y"),F=p.getAttributeNS(u,"width"),L=p.getAttributeNS(u,"height"),P=p.getAttributeNS(n,
"min-height"),N=p.getAttributeNS(n,"min-width");if("as-char"===y)v="display: inline-block;";else if(y||G||z)v="position: absolute;";else if(F||L||P||N)v="display: block;";G&&(v+="left: "+G+";");z&&(v+="top: "+z+";");F&&(v+="width: "+F+";");L&&(v+="height: "+L+";");P&&(v+="min-height: "+P+";");N&&(v+="min-width: "+N+";");v&&(v="draw|"+p.localName+'[styleid="'+t+'"] {'+v+"}",x.insertRule(v,x.cssRules.length))}w=B.getODFElementsWithXPath(l,".//*[*[@text:anchor-type='paragraph']]",e.namespaceResolver);
for(q=0;q<w.length;q+=1)l=w[q],l.setAttributeNS&&l.setAttributeNS("urn:webodf","containsparagraphanchor",!0);k.insertRule("draw|page { background-color:#fff; }",k.cssRules.length);for(l=a;l.firstChild;)l.removeChild(l.firstChild);l=m.createElement("div");l.style.display="inline-block";l.style.background="white";l.appendChild(g);a.appendChild(l);c(j,g.body,k);d(j,g.body,k);b();if(A.hasOwnProperty("statereadychange")){g=A.statereadychange;for(j=0;j<g.length;j+=1)g[j](void 0)}}p===f&&(p.state===odf.OdfContainer.DONE?
i():p.onchange=i)}function i(){if(q){for(var a=q.ownerDocument.createDocumentFragment();q.firstChild;)a.insertBefore(q.firstChild,null);q.parentNode.replaceChild(a,q)}}var m=a.ownerDocument,p,o=new odf.Formatting,y=new f(a),L=new j(k(m)),T=k(m),O=k(m),N=!1,v=1;this.odfContainer=function(){return p};this.slidevisibilitycss=function(){return L.css};this.load=this.load=function(b){x.clearQueue();a.innerHTML="loading "+b;p=new odf.OdfContainer(b,function(a){p=a;g(a)});p.onstatereadychange=g};this.save=
function(a){i();p.save(a)};this.setEditable=function(a){(N=a)||i()};this.addListener=function(a,b){if("selectionchange"===a)y.addListener(a,b);else{var c=A[a];void 0===c&&(c=A[a]=[]);b&&-1===c.indexOf(b)&&c.push(b)}};this.getFormatting=function(){return o};this.setZoomLevel=function(a){v=a;b()};this.getZoomLevel=function(){return v};this.fitToContainingElement=function(c,d){var e=a.offsetHeight/v;v=c/(a.offsetWidth/v);d/e<v&&(v=d/e);b()};this.fitToWidth=function(c){v=c/(a.offsetWidth/v);b()};this.fitToHeight=
function(c){v=c/(a.offsetHeight/v);b()};this.showNextPage=function(){L.showNextPage()};this.showPreviousPage=function(){L.showPreviousPage()};this.showAllPages=function(){};l(a,"click",function(a){for(var a=a||w.event,b=a.target,c=w.getSelection(),d=0<c.rangeCount?c.getRangeAt(0):null,e=d&&d.startContainer,f=d&&d.startOffset,g=d&&d.endContainer,h=d&&d.endOffset;b&&!(("p"===b.localName||"h"===b.localName)&&b.namespaceURI===s);)b=b.parentNode;N&&b&&b.parentNode!==q&&((q?q.parentNode&&i():(q=b.ownerDocument.createElement("p"),
q.style||(q=b.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml","p")),q.style.margin="0px",q.style.padding="0px",q.style.border="0px",q.setAttribute("contenteditable",!0)),b.parentNode.replaceChild(q,b),q.appendChild(b),q.focus(),d&&(c.removeAllRanges(),d=b.ownerDocument.createRange(),d.setStart(e,f),d.setEnd(g,h),c.addRange(d)),a.preventDefault)?(a.preventDefault(),a.stopPropagation()):(a.returnValue=!1,a.cancelBubble=!0))})};return odf.OdfCanvas}();
// Input 26
runtime.loadClass("xmldom.XPath");runtime.loadClass("odf.Style2CSS");
gui.PresenterUI=function(){var j=new odf.Style2CSS,l=new xmldom.XPath,f=j.namespaceResolver;return function(g){var a=this;a.setInitialSlideMode=function(){a.startSlideMode("single")};a.keyDownHandler=function(c){if(!(c.target.isContentEditable||"input"===c.target.nodeName))switch(c.keyCode){case 84:a.toggleToolbar();break;case 37:case 8:a.prevSlide();break;case 39:case 32:a.nextSlide();break;case 36:a.firstSlide();break;case 35:a.lastSlide()}};a.root=function(){return a.odf_canvas.odfContainer().rootElement};
a.firstSlide=function(){a.slideChange(function(){return 0})};a.lastSlide=function(){a.slideChange(function(a,b){return b-1})};a.nextSlide=function(){a.slideChange(function(a,b){return a+1<b?a+1:-1})};a.prevSlide=function(){a.slideChange(function(a){return 1>a?-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;d<a.length;d+=1)b.push([a[d].getAttribute("draw:name"),a[d]]);return b};a.fillPageList=function(c,b){for(var d=a.getPages(c),f,e,g;b.firstChild;)b.removeChild(b.firstChild);for(f=0;f<d.length;f+=1)e=document.createElement("option"),g=l.getODFElementsWithXPath(d[f][1],'./draw:frame[@presentation:class="title"]//draw:text-box/text:p',xmldom.XPath),g=0<g.length?g[0].textContent:d[f][0],e.textContent=f+1+": "+g,b.appendChild(e)};a.startSlideMode=function(c){var b=document.getElementById("pagelist"),
d=a.odf_canvas.slidevisibilitycss().sheet;for(a.slide_mode=c;0<d.cssRules.length;)d.deleteRule(0);a.selectSlide(0);"single"===a.slide_mode?(d.insertRule("draw|page { position:fixed; left:0px;top:30px; z-index:1; }",0),d.insertRule("draw|page[slide_current] { z-index:2;}",1),d.insertRule("draw|page { -webkit-transform: scale(1);}",2),a.fitToWindow(),window.addEventListener("resize",a.fitToWindow,!1)):"cont"===a.slide_mode&&window.removeEventListener("resize",a.fitToWindow,!1);a.fillPageList(a.odf_canvas.odfContainer().rootElement,
b)};a.toggleToolbar=function(){var c,b,d;c=a.odf_canvas.slidevisibilitycss().sheet;b=-1;for(d=0;d<c.cssRules.length;d+=1)if(".toolbar"===c.cssRules[d].cssText.substring(0,8)){b=d;break}-1<b?c.deleteRule(b):c.insertRule(".toolbar { position:fixed; left:0px;top:-200px; z-index:0; }",0)};a.fitToWindow=function(){var c=a.getPages(a.root()),b=(window.innerHeight-40)/c[0][1].clientHeight,c=(window.innerWidth-10)/c[0][1].clientWidth,b=b<c?b:c,c=a.odf_canvas.slidevisibilitycss().sheet;c.deleteRule(2);c.insertRule("draw|page { \n-moz-transform: scale("+
b+"); \n-moz-transform-origin: 0% 0%; -webkit-transform-origin: 0% 0%; -webkit-transform: scale("+b+"); -o-transform-origin: 0% 0%; -o-transform: scale("+b+"); -ms-transform-origin: 0% 0%; -ms-transform: scale("+b+"); }",2)};a.load=function(c){a.odf_canvas.load(c)};a.odf_element=g;a.odf_canvas=new odf.OdfCanvas(a.odf_element);a.odf_canvas.addListener("statereadychange",a.setInitialSlideMode);a.slide_mode="undefined";document.addEventListener("keydown",a.keyDownHandler,!1)}}();
// Input 27
gui.Caret=function(j,l){l.ownerDocument.createElementNS("urn:webodf:names:cursor","cursor");this.updateToSelection=function(){1===j.rangeCount&&j.getRangeAt(0)}};
// Input 28
runtime.loadClass("core.Cursor");
gui.SelectionMover=function(j,l){function f(a,c){if(0!==j.rangeCount){var f=j.getRangeAt(0);if(f.startContainer&&1===f.startContainer.nodeType){l.setPoint(f.startContainer,f.startOffset);c();f=l.node();l.position();var e=[],g;for(g=0;g<j.rangeCount;g+=1)e[g]=j.getRangeAt(g);j.removeAllRanges();0===e.length&&(e[0]=f.ownerDocument.createRange());e[e.length-1].setStart(l.node(),l.position());for(g=0;g<e.length;g+=1)j.addRange(e[g])}}}function g(){c.updateToSelection();for(var a=c.getNode().getBoundingClientRect(),
d=a.left,f=a.top,a=!1;!a;){c.remove();if(j.focusNode&&1===j.focusNode.nodeType){l.setPoint(j.focusNode,j.focusOffset);l.stepForward();var a=l.node(),e=l.position();j.collapse(a,e);c.updateToSelection()}a=c.getNode().getBoundingClientRect();a=a.top!==f&&a.left>d}}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: '</' attr(customns_name) '>';}\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(",")})();

1
apps/files_odfviewer/src/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build

View File

@ -0,0 +1,9 @@
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/

View File

@ -0,0 +1,17 @@
#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/

View File

@ -0,0 +1,9 @@
[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

View File

@ -0,0 +1,160 @@
# 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

View File

@ -0,0 +1,13 @@
--- ./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);
}

View File

@ -0,0 +1,93 @@
/**
* Copyright (C) 2011 KO GmbH <jos.van.den.oever@kogmbh.com>
* @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);
}
});

View File

@ -0,0 +1,30 @@
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)

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.webodf" android:versionCode="1" android:versionName="1.0">
<supports-screens android:largeScreens="true"
android:normalScreens="true" android:smallScreens="true"
android:resizeable="true" android:anyDensity="true" />
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:label="@string/app_name" android:name=".WebODFActivity"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/vnd.oasis.opendocument.text" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/vnd.oasis.opendocument.presentation" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet" />
</intent-filter>
</activity>
<activity android:name="com.phonegap.DroidGap" android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,41 @@
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})

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns = "http://www.w3.org/ns/widgets"
xmlns:gap = "http://phonegap.com/ns/1.0"
id = "org.webodf.phonegap.one"
version = "1.0.0">
<name>WebODF: online/offline office</name>
<description>
A viewer for ODF files.
</description>
<author href="http://webodf.org/"
email="jos.van.den.oever@kogmbh.com">
Jos van den Oever
</author>
<gap:platforms>
<gap:platform name="android" minVersion="2.1" />
<gap:platform name="webos" />
<gap:platform name="symbian.wrt" />
<gap:platform name="blackberry" project="widgets"/>
</gap:platforms>
<icon src="icon.png" gap:role="default" />
<feature name="http://api.phonegap.com/1.0/file"/>
<preference name="autorotate" value="false" readonly="true"/>
<preference name="orientation" value="default"/>
</widget>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<title>WebODF</title>
<link href="sencha-touch.css" rel="stylesheet" type="text/css" />
<link href="webodf.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="phonegap-1.4.1.js"></script>
<script type="text/javascript" src="sencha-touch.js"></script>
<script type="text/javascript" src="webodf.js"></script>
<script type="text/javascript" src="app/app.js"></script>
<script type="text/javascript" src="app/controller/Files.js"></script>
<script type="text/javascript" src="app/model/FileSystem.js"></script>
<script type="text/javascript" src="app/store/FileStore.js"></script>
<script type="text/javascript" src="app/views/FileDetail.js"></script>
<script type="text/javascript" src="app/views/FilesList.js"></script>
<script type="text/javascript" src="app/views/OdfView.js"></script>
<script type="text/javascript" src="app/views/Viewport.js"></script>
<script type="text/javascript">
var applicationReady = false,
deviceReady = false,
startScanningDirectories;
document.addEventListener("deviceready", function () {
deviceReady = true;
if (applicationReady) {
startScanningDirectories();
}
}, false);
/**
* Override this function so it waits until the device is ready.
*/
onApplicationLaunch = function (app) {
"use strict";
applicationReady = true;
startScanningDirectories = function () {
if (typeof invokeString !== "undefined" && invokeString) {
app.openUrl(invokeString);
}
app.startScanningDirectories();
};
if (deviceReady) {
startScanningDirectories();
}
};
</script>
</head><body></body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/noteview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="10pt" />
</ScrollView>
</LinearLayout>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, WebODFActivity!</string>
<string name="app_name">WebODF</string>
</resources>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<phonegap>
<access origin="http://127.0.0.1*"/>
<log level="DEBUG"/>
</phonegap>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<plugins>
<plugin name="App" value="com.phonegap.App"/>
<plugin name="Geolocation" value="com.phonegap.GeoBroker"/>
<plugin name="Device" value="com.phonegap.Device"/>
<plugin name="Accelerometer" value="com.phonegap.AccelListener"/>
<plugin name="Compass" value="com.phonegap.CompassListener"/>
<plugin name="Media" value="com.phonegap.AudioHandler"/>
<plugin name="Camera" value="com.phonegap.CameraLauncher"/>
<plugin name="Contacts" value="com.phonegap.ContactManager"/>
<plugin name="Crypto" value="com.phonegap.CryptoHandler"/>
<plugin name="File" value="com.phonegap.FileUtils"/>
<plugin name="Network Status" value="com.phonegap.NetworkManager"/>
<plugin name="Notification" value="com.phonegap.Notification"/>
<plugin name="Storage" value="com.phonegap.Storage"/>
<plugin name="Temperature" value="com.phonegap.TempListener"/>
<plugin name="FileTransfer" value="com.phonegap.FileTransfer"/>
<plugin name="Capture" value="com.phonegap.Capture"/>
</plugins>

View File

@ -0,0 +1,33 @@
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 + "';");
}
}

View File

@ -0,0 +1,3 @@
# /bin/bash
cd assets
for f in `find . -type f`; do cp ../../webodf/$f $f; done

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
OASIS OpenDocument v1.0
OASIS standard, 1 May 2005
Relax-NG Manifest Schema
$Id$
© 2002-2005 OASIS Open
© 1999-2005 Sun Microsystems, Inc.
-->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
<define name="manifest">
<element name="manifest:manifest">
<oneOrMore>
<ref name="file-entry"/>
</oneOrMore>
</element>
</define>
<start>
<choice>
<ref name="manifest"/>
</choice>
</start>
<define name="file-entry">
<element name="manifest:file-entry">
<ref name="file-entry-attlist"/>
<optional>
<ref name="encryption-data"/>
</optional>
</element>
</define>
<define name="file-entry-attlist" combine="interleave">
<attribute name="manifest:full-path">
<data type="string"/>
</attribute>
</define>
<define name="file-entry-attlist" combine="interleave">
<optional>
<attribute name="manifest:size">
<data type="nonNegativeInteger"/>
</attribute>
</optional>
</define>
<define name="file-entry-attlist" combine="interleave">
<attribute name="manifest:media-type">
<data type="string"/>
</attribute>
</define>
<define name="encryption-data">
<element name="manifest:encryption-data">
<ref name="encryption-data-attlist"/>
<ref name="algorithm"/>
<ref name="key-derivation"/>
</element>
</define>
<define name="encryption-data-attlist" combine="interleave">
<attribute name="manifest:checksum-type">
<data type="string"/>
</attribute>
</define>
<define name="encryption-data-attlist" combine="interleave">
<attribute name="manifest:checksum">
<data type="base64Binary"/>
</attribute>
</define>
<define name="algorithm">
<element name="manifest:algorithm">
<ref name="algorithm-attlist"/>
<empty/>
</element>
</define>
<define name="algorithm-attlist" combine="interleave">
<attribute name="manifest:algorithm-name">
<data type="string"/>
</attribute>
</define>
<define name="algorithm-attlist" combine="interleave">
<attribute name="manifest:initialisation-vector">
<data type="base64Binary"/>
</attribute>
</define>
<define name="key-derivation">
<element name="manifest:key-derivation">
<ref name="key-derivation-attlist"/>
<empty/>
</element>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:key-derivation-name">
<data type="string"/>
</attribute>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:salt">
<data type="base64Binary"/>
</attribute>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:iteration-count">
<data type="nonNegativeInteger"/>
</attribute>
</define>
</grammar>

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
OASIS OpenDocument v1.1
OASIS Standard, 1 Feb 2007
Relax-NG Manifest Schema
$Id$
© 2002-2007 OASIS Open
© 1999-2007 Sun Microsystems, Inc.
-->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
<define name="manifest">
<element name="manifest:manifest">
<oneOrMore>
<ref name="file-entry"/>
</oneOrMore>
</element>
</define>
<start>
<choice>
<ref name="manifest"/>
</choice>
</start>
<define name="file-entry">
<element name="manifest:file-entry">
<ref name="file-entry-attlist"/>
<optional>
<ref name="encryption-data"/>
</optional>
</element>
</define>
<define name="file-entry-attlist" combine="interleave">
<attribute name="manifest:full-path">
<data type="string"/>
</attribute>
</define>
<define name="file-entry-attlist" combine="interleave">
<optional>
<attribute name="manifest:size">
<data type="nonNegativeInteger"/>
</attribute>
</optional>
</define>
<define name="file-entry-attlist" combine="interleave">
<attribute name="manifest:media-type">
<data type="string"/>
</attribute>
</define>
<define name="encryption-data">
<element name="manifest:encryption-data">
<ref name="encryption-data-attlist"/>
<ref name="algorithm"/>
<ref name="key-derivation"/>
</element>
</define>
<define name="encryption-data-attlist" combine="interleave">
<attribute name="manifest:checksum-type">
<data type="string"/>
</attribute>
</define>
<define name="encryption-data-attlist" combine="interleave">
<attribute name="manifest:checksum">
<data type="base64Binary"/>
</attribute>
</define>
<define name="algorithm">
<element name="manifest:algorithm">
<ref name="algorithm-attlist"/>
<empty/>
</element>
</define>
<define name="algorithm-attlist" combine="interleave">
<attribute name="manifest:algorithm-name">
<data type="string"/>
</attribute>
</define>
<define name="algorithm-attlist" combine="interleave">
<attribute name="manifest:initialisation-vector">
<data type="base64Binary"/>
</attribute>
</define>
<define name="key-derivation">
<element name="manifest:key-derivation">
<ref name="key-derivation-attlist"/>
<empty/>
</element>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:key-derivation-name">
<data type="string"/>
</attribute>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:salt">
<data type="base64Binary"/>
</attribute>
</define>
<define name="key-derivation-attlist" combine="interleave">
<attribute name="manifest:iteration-count">
<data type="nonNegativeInteger"/>
</attribute>
</define>
</grammar>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
OASIS OpenDocument v1.0
OASIS Standard, 1 May 2005
Strict Relax-NG Schema
$Id$
© 2002-2005 OASIS Open
© 1999-2005 Sun Microsystems, Inc.
-->
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<include href="OpenDocument-schema-v1.0-os.rng">
<define name="office-meta-content">
<ref name="office-meta-content-strict"/>
</define>
<define name="style-page-layout-properties-content">
<ref name="style-page-layout-properties-content-strict"/>
</define>
<define name="style-header-footer-properties-content">
<ref name="style-header-footer-properties-content-strict"/>
</define>
<define name="style-drawing-page-properties-content">
<ref name="style-drawing-page-properties-content-strict"/>
</define>
<define name="style-text-properties-content">
<ref name="style-text-properties-content-strict"/>
</define>
<define name="style-paragraph-properties-content">
<ref name="style-paragraph-properties-content-strict"/>
</define>
<define name="style-ruby-properties-content">
<ref name="style-ruby-properties-content-strict"/>
</define>
<define name="style-section-properties-content">
<ref name="style-section-properties-content-strict"/>
</define>
<define name="style-list-level-properties-content">
<ref name="style-list-level-properties-content-strict"/>
</define>
<define name="style-table-properties-content">
<ref name="style-table-properties-content-strict"/>
</define>
<define name="style-table-column-properties-content">
<ref name="style-table-column-properties-content-strict"/>
</define>
<define name="style-table-row-properties-content">
<ref name="style-table-row-properties-content-strict"/>
</define>
<define name="style-table-cell-properties-content">
<ref name="style-table-cell-properties-content-strict"/>
</define>
<define name="style-graphic-properties-content">
<ref name="style-graphic-properties-content-strict"/>
</define>
<define name="style-chart-properties-content">
<ref name="style-properties-content"/>
</define>
</include>
</grammar>

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
OASIS OpenDocument v1.1
OASIS Standard, 1 Feb 2007
Strict Relax-NG Schema
$Id$
© 2002-2007 OASIS Open
© 1999-2007 Sun Microsystems, Inc.
-->
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<include href="OpenDocument-schema-v1.1.rng">
<define name="office-meta-content">
<ref name="office-meta-content-strict"/>
</define>
<define name="style-page-layout-properties-content">
<ref name="style-page-layout-properties-content-strict"/>
</define>
<define name="style-header-footer-properties-content">
<ref name="style-header-footer-properties-content-strict"/>
</define>
<define name="style-drawing-page-properties-content">
<ref name="style-drawing-page-properties-content-strict"/>
</define>
<define name="style-text-properties-content">
<ref name="style-text-properties-content-strict"/>
</define>
<define name="style-paragraph-properties-content">
<ref name="style-paragraph-properties-content-strict"/>
</define>
<define name="style-ruby-properties-content">
<ref name="style-ruby-properties-content-strict"/>
</define>
<define name="style-section-properties-content">
<ref name="style-section-properties-content-strict"/>
</define>
<define name="style-list-level-properties-content">
<ref name="style-list-level-properties-content-strict"/>
</define>
<define name="style-table-properties-content">
<ref name="style-table-properties-content-strict"/>
</define>
<define name="style-table-column-properties-content">
<ref name="style-table-column-properties-content-strict"/>
</define>
<define name="style-table-row-properties-content">
<ref name="style-table-row-properties-content-strict"/>
</define>
<define name="style-table-cell-properties-content">
<ref name="style-table-cell-properties-content-strict"/>
</define>
<define name="style-graphic-properties-content">
<ref name="style-graphic-properties-content-strict"/>
</define>
<define name="style-chart-properties-content">
<ref name="style-chart-properties-content-strict"/>
</define>
</include>
</grammar>

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Open Document Format for Office Applications (OpenDocument) Version 1.2
Candidate OASIS Standard (COS) 01, 10 May 2011
Digital Signatures Relax-NG Schema
Source: http://docs.oasis-open.org/office/v1.2/cos01/
Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
All capitalized terms in the following text have the meanings assigned to them
in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
full Policy may be found at the OASIS website.
This document and translations of it may be copied and furnished to others, and
derivative works that comment on or otherwise explain it or assist in its
implementation may be prepared, copied, published, and distributed, in whole or
in part, without restriction of any kind, provided that the above copyright
notice and this section are included on all such copies and derivative works.
However, this document itself may not be modified in any way, including by
removing the copyright notice or references to OASIS, except as needed for the
purpose of developing any document or deliverable produced by an OASIS
Technical Committee (in which case the rules applicable to copyrights, as set
forth in the OASIS IPR Policy, must be followed) or as required to translate it
into languages other than English.
The limited permissions granted above are perpetual and will not be revoked by
OASIS or its successors or assigns.
This document and the information contained herein is provided on an "AS IS"
basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
FITNESS FOR A PARTICULAR PURPOSE.
-->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:dsig="urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
>
<start>
<choice>
<ref name="dsig-document-signatures"/>
</choice>
</start>
<define name="dsig-document-signatures">
<element name="dsig:document-signatures">
<ref name="dsig-document-signatures-attlist"/>
<oneOrMore>
<ref name="ds-signature"/>
</oneOrMore>
</element>
</define>
<define name="dsig-document-signatures-attlist">
<attribute name="dsig:version">
<value>1.2</value>
</attribute>
</define>
<define name="ds-signature">
<element name="ds:Signature">
<!-- The permitted content of this element is the permitted -->
<!-- content of the Signature element defined by W3C XML -->
<!-- Signature Syntax and Processing (Second Edition). -->
<!-- See OpenDocument v1.2 part 3, section 4.3. -->
<ref name="dsMarkup"/>
</element>
</define>
<define name="dsMarkup">
<zeroOrMore>
<choice>
<attribute>
<anyName/>
</attribute>
<text/>
<element>
<anyName/>
<ref name="dsMarkup"/>
</element>
</choice>
</zeroOrMore>
</define>
</grammar>

View File

@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Open Document Format for Office Applications (OpenDocument) Version 1.2
Candidate OASIS Standard (COS) 01, 10 May 2011
Manifest Relax-NG Schema
Source: http://docs.oasis-open.org/office/v1.2/cos01/
Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
All capitalized terms in the following text have the meanings assigned to them
in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
full Policy may be found at the OASIS website.
This document and translations of it may be copied and furnished to others, and
derivative works that comment on or otherwise explain it or assist in its
implementation may be prepared, copied, published, and distributed, in whole or
in part, without restriction of any kind, provided that the above copyright
notice and this section are included on all such copies and derivative works.
However, this document itself may not be modified in any way, including by
removing the copyright notice or references to OASIS, except as needed for the
purpose of developing any document or deliverable produced by an OASIS
Technical Committee (in which case the rules applicable to copyrights, as set
forth in the OASIS IPR Policy, must be followed) or as required to translate it
into languages other than English.
The limited permissions granted above are perpetual and will not be revoked by
OASIS or its successors or assigns.
This document and the information contained herein is provided on an "AS IS"
basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
FITNESS FOR A PARTICULAR PURPOSE.
-->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"
>
<start>
<choice>
<ref name="manifest"/>
</choice>
</start>
<define name="manifest">
<element name="manifest:manifest">
<ref name="manifest-attlist"/>
<oneOrMore>
<ref name="file-entry"/>
</oneOrMore>
</element>
</define>
<define name="manifest-attlist">
<attribute name="manifest:version">
<value>1.2</value>
</attribute>
</define>
<define name="file-entry">
<element name="manifest:file-entry">
<ref name="file-entry-attlist"/>
<optional>
<ref name="encryption-data"/>
</optional>
</element>
</define>
<define name="file-entry-attlist">
<interleave>
<attribute name="manifest:full-path">
<ref name="string"/>
</attribute>
<optional>
<attribute name="manifest:size">
<ref name="nonNegativeInteger"/>
</attribute>
</optional>
<attribute name="manifest:media-type">
<ref name="string"/>
</attribute>
<optional>
<attribute name="manifest:preferred-view-mode">
<choice>
<value>edit</value>
<value>presentation-slide-show</value>
<value>read-only</value>
<ref name="namespacedToken"/>
</choice>
</attribute>
</optional>
<optional>
<attribute name="manifest:version">
<ref name="string"/>
</attribute>
</optional>
</interleave>
</define>
<define name="encryption-data">
<element name="manifest:encryption-data">
<ref name="encryption-data-attlist"/>
<ref name="algorithm"/>
<optional>
<ref name="start-key-generation"/>
</optional>
<ref name="key-derivation"/>
</element>
</define>
<define name="encryption-data-attlist">
<interleave>
<attribute name="manifest:checksum-type">
<choice>
<value>SHA1/1K</value>
<ref name="anyURI"/>
</choice>
</attribute>
<attribute name="manifest:checksum">
<ref name="base64Binary"/>
</attribute>
</interleave>
</define>
<define name="algorithm">
<element name="manifest:algorithm">
<ref name="algorithm-attlist"/>
<ref name="anyElements"/>
</element>
</define>
<define name="algorithm-attlist">
<interleave>
<attribute name="manifest:algorithm-name">
<choice>
<value>Blowfish CFB</value>
<ref name="anyURI"/>
</choice>
</attribute>
<attribute name="manifest:initialisation-vector">
<ref name="base64Binary"/>
</attribute>
</interleave>
</define>
<define name="anyAttListOrElements">
<zeroOrMore>
<attribute>
<anyName/>
<text/>
</attribute>
</zeroOrMore>
<ref name="anyElements"/>
</define>
<define name="anyElements">
<zeroOrMore>
<element>
<anyName/>
<mixed>
<ref name="anyAttListOrElements"/>
</mixed>
</element>
</zeroOrMore>
</define>
<define name="key-derivation">
<element name="manifest:key-derivation">
<ref name="key-derivation-attlist"/>
<empty/>
</element>
</define>
<define name="key-derivation-attlist">
<interleave>
<attribute name="manifest:key-derivation-name">
<choice>
<value>PBKDF2</value>
<ref name="anyURI"/>
</choice>
</attribute>
<attribute name="manifest:salt">
<ref name="base64Binary"/>
</attribute>
<attribute name="manifest:iteration-count">
<ref name="nonNegativeInteger"/>
</attribute>
<optional>
<attribute name="manifest:key-size">
<ref name="nonNegativeInteger"/>
</attribute>
</optional>
</interleave>
</define>
<define name="start-key-generation">
<element name="manifest:start-key-generation">
<ref name="start-key-generation-attlist"/>
<empty/>
</element>
</define>
<define name="start-key-generation-attlist">
<interleave>
<attribute name="manifest:start-key-generation-name">
<choice>
<value>SHA1</value>
<ref name="anyURI"/>
</choice>
</attribute>
<optional>
<attribute name="manifest:key-size">
<ref name="nonNegativeInteger"/>
</attribute>
</optional>
</interleave>
</define>
<define name="base64Binary">
<data type="base64Binary"/>
</define>
<define name="namespacedToken">
<data type="QName">
<param name="pattern">[^:]+:[^:]+</param>
</data>
</define>
<define name="nonNegativeInteger">
<data type="nonNegativeInteger"/>
</define>
<define name="string">
<data type="string"/>
</define>
<define name="anyURI">
<data type="anyURI"/>
</define>
</grammar>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,779 @@
/*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();
}

View File

@ -0,0 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<title>docnosis</title>
<!-- <script src="../../webodf/webodf.js" type="text/javascript" charset="utf-8"></script> -->
<script src="../../webodf/lib/runtime.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">//<![CDATA[
runtime.libraryPaths = function () {
return ["../../webodf/lib/"];
};
//]]></script>
<script src="docnosis.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">//<![CDATA[
runtime.libraryPaths = function () {
return ["../../webodf/lib/"];
};
window.addEventListener("load", function () {
var docnosis = document.getElementById("docnosis");
new Docnosis(docnosis);
}, false);
//]]></script>
</head>
<body>
<div id="docnosis"></div>
</body>
</html>

View File

@ -0,0 +1,35 @@
# 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})

View File

@ -0,0 +1,36 @@
/*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);
}

View File

@ -0,0 +1,13 @@
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

View File

@ -0,0 +1,196 @@
/*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]);

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<style type="text/css" media="screen">
body, html, div {
padding: 0px;
margin: 0px;
border: 0px;
}
body, html {
height: 100%;
text-align: center;
}
html > body {
background: black;
}
div#toolbar {
background: white;
padding: 7px;
border-bottom: 1px solid black;
}
div#toolbar > span {
border: 1px solid black;
padding: 2px;
}
div#toolbar > span:hover {
background: #CCCCCC;
}
</style>
<link rel="stylesheet" type="text/css" href="webodf.css"/>
<script src="webodf.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">//<![CDATA[
var webodffirefox = {
url: undefined,
data: undefined,
odfcanvas: undefined
};
window.addEventListener('odfload', function webViewerLoad(evt) {
runtime.loadClass("odf.OdfCanvas");
var wf = webodffirefox,
params = document.location.search.substring(1).split('&'),
param,
odfelement = document.getElementById("odf"),
data = evt.detail;
for (i = 0; i < params.length; i += 1) {
param = params[i].split('=');
params[unescape(param[0])] = unescape(param[1]);
}
wf.url = params.file;
wf.data = data;
wf.odfcanvas = new odf.OdfCanvas(odfelement);
runtime.read = function (path, offset, length, callback) {
var d = data.slice(offset, offset + length);
callback(null, d);
}
runtime.getFileSize = function (path, callback) {
callback(data.length);
}
wf.odfcanvas.load(params.file);
}, true);
function addButton(parent, label, onclick) {
var doc = parent.ownerDocument,
button = doc.createElement("span");
button.appendChild(doc.createTextNode(label));
button.onclick = onclick;
parent.appendChild(button);
}
function init() {
runtime.loadClass("core.Base64");
var toolbar = document.getElementById("toolbar");
addButton(toolbar, "download", function onclick() {
window.location.href = webodffirefox.url + "#download";
});
}
window.setTimeout(function () {
init();
}, 1);
//--></script>
<title></title>
</head>
<body>
<div id="toolbar">
</div>
<div id="odf"/>
</body>
</html>

View File

@ -0,0 +1,34 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>uriloader@webodf.js</em:id>
<em:name>WebODF</em:name>
<em:type>2</em:type>
<em:version>@WEBODF_VERSION@</em:version>
<em:iconURL>chrome://webodf.js/skin/icon.png</em:iconURL>
<em:targetApplication>
<!-- Firefox -->
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>3.6</em:minVersion>
<em:maxVersion>9.*</em:maxVersion>
</Description>
</em:targetApplication>
<em:targetApplication>
<!-- Fennec -->
<Description>
<em:id>{a23983c0-fd0e-11dc-95ff-0800200c9a66}</em:id>
<em:minVersion>4.0</em:minVersion>
<em:maxVersion>9.*</em:maxVersion>
</Description>
</em:targetApplication>
<em:bootstrap>true</em:bootstrap>
<em:unpack>true</em:unpack>
<em:creator>Jos van den Oever</em:creator>
<em:description>OpenDocument Viewer</em:description>
<em:homepageURL>http://webodf.org/</em:homepageURL>
</Description>
</RDF>

View File

@ -0,0 +1,77 @@
/**
* Copyright (C) 2011 KO GmbH <jos.van.den.oever@kogmbh.com>
* @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);
}
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -0,0 +1,512 @@
// !$*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 = "<group>"; };
CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "../Default-Landscape~ipad.png"; sourceTree = "<group>"; };
CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = WebODF/Classes/minizip/unzip.c; sourceTree = "<group>"; };
CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = WebODF/Classes/minizip/ioapi.c; sourceTree = "<group>"; };
CB29ECC014FFBC1B00CEAEE3 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mztools.c; path = WebODF/Classes/minizip/mztools.c; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
CB533DAE14DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
CB533DB014DABDA600C733F6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WebODF-Prefix.pch"; sourceTree = "<group>"; };
CB533DB314DABDA600C733F6 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = "<absolute>"; };
CB533DB814DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = "<group>"; };
CB533DBF14DABDA600C733F6 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = "<group>"; };
CB533DC114DABDA600C733F6 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = "<group>"; };
CB533DC314DABDA600C733F6 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = "<group>"; };
CB533DC614DABDA600C733F6 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = "<group>"; };
CB533DC814DABDA600C733F6 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = "<group>"; };
CB533DCC14DABDA600C733F6 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = "<group>"; };
CB533DCF14DABDA600C733F6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = "<group>"; };
CB533DD014DABDA600C733F6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = "<group>"; };
CB533DD214DABDA600C733F6 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = "<group>"; };
CB533DD314DABDA600C733F6 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = "<group>"; };
CB533DD514DABDA600C733F6 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = "<group>"; };
CBD2B77114FF8E9700FC3A44 /* NativeZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NativeZip.h; path = Classes/NativeZip.h; sourceTree = "<group>"; };
CBD2B77214FF8E9700FC3A44 /* NativeZip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NativeZip.m; path = Classes/NativeZip.m; sourceTree = "<group>"; };
CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebViewCache.h; path = Classes/WebViewCache.h; sourceTree = "<group>"; };
CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebViewCache.m; path = Classes/WebViewCache.m; sourceTree = "<group>"; };
/* 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 = "<group>";
};
CB533D8D14DABDA500C733F6 /* Products */ = {
isa = PBXGroup;
children = (
CB533D8C14DABDA500C733F6 /* KO Viewer.app */,
);
name = Products;
sourceTree = "<group>";
};
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 = "<group>";
};
CB533DAA14DABDA600C733F6 /* WebODF */ = {
isa = PBXGroup;
children = (
CB533DB314DABDA600C733F6 /* PhoneGap.framework */,
CB533DB514DABDA600C733F6 /* Resources */,
CB533DCE14DABDA600C733F6 /* Classes */,
CB533DAB14DABDA600C733F6 /* Supporting Files */,
);
path = WebODF;
sourceTree = "<group>";
};
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 = "<group>";
};
CB533DB514DABDA600C733F6 /* Resources */ = {
isa = PBXGroup;
children = (
CB533DB614DABDA600C733F6 /* en.lproj */,
CB533DBE14DABDA600C733F6 /* icons */,
CB533DC514DABDA600C733F6 /* splash */,
);
name = Resources;
sourceTree = "<group>";
};
CB533DB614DABDA600C733F6 /* en.lproj */ = {
isa = PBXGroup;
children = (
CB533DB714DABDA600C733F6 /* Localizable.strings */,
);
name = en.lproj;
sourceTree = "<group>";
};
CB533DBE14DABDA600C733F6 /* icons */ = {
isa = PBXGroup;
children = (
CB533DBF14DABDA600C733F6 /* icon.png */,
CB533DC114DABDA600C733F6 /* icon@2x.png */,
CB533DC314DABDA600C733F6 /* icon-72.png */,
);
name = icons;
sourceTree = "<group>";
};
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 = "<group>";
};
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 = "<group>";
};
/* 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 = "<group>";
};
CB533DB714DABDA600C733F6 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
CB533DB814DABDA600C733F6 /* en */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* 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 */;
}

View File

@ -0,0 +1,52 @@
/*
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 <UIKit/UIKit.h>
#ifdef PHONEGAP_FRAMEWORK
#import <PhoneGap/PGViewController.h>
#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

View File

@ -0,0 +1,202 @@
/*
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 <PhoneGap/PGPlugin.h>
#import <PhoneGap/PGURLProtocol.h>
#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

View File

@ -0,0 +1,17 @@
//
// MainViewController.h
// FooBar
//
// Created by Shazron Abdullah on 12-01-26.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#ifdef PHONEGAP_FRAMEWORK
#import <PhoneGap/PGViewController.h>
#else
#import "PGViewController.h"
#endif
@interface MainViewController : PGViewController
@end

View File

@ -0,0 +1,47 @@
//
// 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

View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1280</int>
<string key="IBDocument.SystemVersion">11C25</string>
<string key="IBDocument.InterfaceBuilderVersion">1919</string>
<string key="IBDocument.AppKitVersion">1138.11</string>
<string key="IBDocument.HIToolboxVersion">566.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="NS.object.0">916</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>IBProxyObject</string>
<string>IBUIView</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="IBProxyObject" id="372490531">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBProxyObject" id="975951072">
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUIView" id="191373211">
<reference key="NSNextResponder"/>
<int key="NSvFlags">274</int>
<string key="NSFrame">{{0, 20}, {320, 460}}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
<object class="NSColorSpace" key="NSCustomColorSpace">
<int key="NSID">2</int>
</object>
</object>
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="191373211"/>
</object>
<int key="connectionID">3</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="191373211"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="372490531"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="975951072"/>
<reference key="parent" ref="0"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
<string key="-1.CustomClassName">MainViewController</string>
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="-2.CustomClassName">UIResponder</string>
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">3</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">MainViewController</string>
<string key="superclassName">UIViewController</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MainViewController.h</string>
</object>
</object>
</array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<string key="IBCocoaTouchPluginVersion">916</string>
</data>
</archive>

View File

@ -0,0 +1,33 @@
//
// 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 <Foundation/Foundation.h>
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

View File

@ -0,0 +1,299 @@
//
// 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

View File

@ -0,0 +1,13 @@
#import <PhoneGap/PGPlugin.h>
@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

View File

@ -0,0 +1,79 @@
#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

View File

@ -0,0 +1,15 @@
//
// WebCache.h
// KO Viewer
//
// Created by Tobias Hintze on 3/5/12.
// Copyright (c) 2012 KO GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface WebViewCache : NSURLCache
- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry;
@end

View File

@ -0,0 +1,72 @@
//
// 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

View File

@ -0,0 +1,132 @@
/* 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<RAND_HEAD_LEN)
return 0;
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
* output of rand() to get less predictability, since rand() is
* often poorly implemented.
*/
if (++calls == 1)
{
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
}
init_keys(passwd, pkeys, pcrc_32_tab);
for (n = 0; n < RAND_HEAD_LEN-2; n++)
{
c = (rand() >> 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

View File

@ -0,0 +1,177 @@
/* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}

View File

@ -0,0 +1,75 @@
/* 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

View File

@ -0,0 +1,28 @@
/*
Additional tools for Minizip
Code: Xavier Roche '2004
License: Same as ZLIB (www.gzip.org)
*/
/* Code */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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)

View File

@ -0,0 +1,31 @@
/*
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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,354 @@
/* 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 */

View File

@ -0,0 +1,15 @@
//
// 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

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>TopActivityIndicator</key>
<string>gray</string>
<key>EnableLocation</key>
<false/>
<key>EnableViewportScale</key>
<false/>
<key>AutoHideSplashScreen</key>
<true/>
<key>ShowSplashScreenSpinner</key>
<true/>
<key>MediaPlaybackRequiresUserAction</key>
<false/>
<key>AllowInlineMediaPlayback</key>
<false/>
<key>OpenAllWhitelistURLsInWebView</key>
<false/>
<key>ExternalHosts</key>
<array>
<string>zipserver</string>
</array>
<key>Plugins</key>
<dict>
<key>ZipClass</key>
<string>NativeZip</string>
<key>com.phonegap.accelerometer</key>
<string>PGAccelerometer</string>
<key>com.phonegap.camera</key>
<string>PGCamera</string>
<key>com.phonegap.connection</key>
<string>PGConnection</string>
<key>com.phonegap.contacts</key>
<string>PGContacts</string>
<key>com.phonegap.debugconsole</key>
<string>PGDebugConsole</string>
<key>com.phonegap.file</key>
<string>PGFile</string>
<key>com.phonegap.filetransfer</key>
<string>PGFileTransfer</string>
<key>com.phonegap.geolocation</key>
<string>PGLocation</string>
<key>com.phonegap.notification</key>
<string>PGNotification</string>
<key>com.phonegap.media</key>
<string>PGSound</string>
<key>com.phonegap.mediacapture</key>
<string>PGCapture</string>
<key>com.phonegap.splashscreen</key>
<string>PGSplashScreen</string>
<key>com.phonegap.battery</key>
<string>PGBattery</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,25 @@
/*
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";

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon.png</string>
</array>
<key>CFBundleTypeName</key>
<string>OpenDocument Text</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>org.oasis.opendocument.text</string>
</array>
</dict>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon.png</string>
</array>
<key>CFBundleTypeName</key>
<string>OpenDocument Presentation</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>org.oasis.opendocument.presentation</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleIconFiles</key>
<array>
<string>icon.png</string>
<string>icon@2x.png</string>
<string>icon-72.png</string>
</array>
<key>CFBundleIdentifier</key>
<string>WebODF-03</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>org.gnu.gnu-zip-archive</string>
</array>
<key>UTTypeDescription</key>
<string>OpenDocument Text</string>
<key>UTTypeIdentifier</key>
<string>org.oasis.opendocument.text</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>odt</string>
<key>public.mime-type</key>
<string>application/vnd.oasis.opendocument.text</string>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>org.gnu.gnu-zip-archive</string>
</array>
<key>UTTypeDescription</key>
<string>OpenDocument Presentation</string>
<key>UTTypeIdentifier</key>
<string>org.oasis.opendocument.presentation</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>odp</string>
<key>public.mime-type</key>
<string>application/vnd.oasis.opendocument.presentation</string>
</dict>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'WebODF' target in the 'WebODF' project
//
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

View File

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

View File

@ -0,0 +1,32 @@
/*
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 <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
return retVal;
}

View File

@ -0,0 +1,52 @@
<!DOCTYPE html>
<html>
<head>
<title>WebODF</title>
<link href="sencha-touch.css" rel="stylesheet" type="text/css" />
<link href="webodf.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="phonegap-1.4.1.js"></script>
<script type="text/javascript" src="sencha-touch.js"></script>
<script type="text/javascript" src="webodf.js"></script>
<script type="text/javascript" src="nativezip.js"></script>
<script type="text/javascript" src="app/app.js"></script>
<script type="text/javascript" src="app/controller/Files.js"></script>
<script type="text/javascript" src="app/model/FileSystem.js"></script>
<script type="text/javascript" src="app/store/FileStore.js"></script>
<script type="text/javascript" src="app/views/FileDetail.js"></script>
<script type="text/javascript" src="app/views/FilesList.js"></script>
<script type="text/javascript" src="app/views/OdfView.js"></script>
<script type="text/javascript" src="app/views/Viewport.js"></script>
<script type="text/javascript">
var applicationReady = false,
deviceReady = false,
startScanningDirectories,
application;
document.addEventListener("deviceready", function () {
deviceReady = true;
if (applicationReady) {
startScanningDirectories();
}
}, false);
/**
* Override this function so it waits until the device is ready.
*/
onApplicationLaunch = function (app) {
"use strict";
application = app;
applicationReady = true;
startScanningDirectories = function () {
if (typeof invokeString !== "undefined" && invokeString) {
app.openUrl(invokeString);
}
app.startScanningDirectories();
};
if (deviceReady) {
startScanningDirectories();
}
};
function handleOpenURL(url) {
application.openUrl(url);
}
</script>
</head><body></body>
</html>

View File

@ -0,0 +1,84 @@
/*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);
};

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
include(${QT_USE_FILE})
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_QTCORE_INCLUDE_DIR})
QT4_WRAP_CPP(NATIVEQTCLIENT_MOC
odfview.h
../qtjsruntime/nativeio.h
../qtjsruntime/nam.h
)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/application.qrc
"<RCC><qresource prefix='/'>")
foreach(FILE ${HTML5UIFILES} ${LIBJSFILES} index.html scripts.js webodf.css)
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc
"<file>www/${FILE}</file>\n")
endforeach(FILE ${HTML5UIFILES})
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc
"</qresource></RCC>")
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)

View File

@ -0,0 +1 @@
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.

View File

@ -0,0 +1,18 @@
<RCC>
<qresource prefix="/">
<file>www/app/app.js</file>
<file>www/app/controller/Files.js</file>
<file>www/app/model/FileSystem.js</file>
<file>www/app/store/FileStore.js</file>
<file>www/app/views/FileDetail.js</file>
<file>www/app/views/FilesList.js</file>
<file>www/app/views/OdfView.js</file>
<file>www/app/views/Viewport.js</file>
<file>www/index.html</file>
<file>www/scripts.js</file>
<file>www/sencha-touch.css</file>
<file>www/sencha-touch.js</file>
<file>www/webodf.css</file>
<file>www/webodf.js</file>
</qresource>
</RCC>

View File

@ -0,0 +1,10 @@
#include "odfview.h"
#include <QtGui/QApplication>
#include <QtCore/QTimer>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
OdfView view;
view.show();
return a.exec();
}

Some files were not shown because too many files have changed in this diff Show More