Diffstat (limited to 'frontend/gamma/tests/tests/Clipperz') (more/less context) (show whitespace changes)
74 files changed, 19556 insertions, 0 deletions
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.html b/frontend/gamma/tests/tests/Clipperz/Async.html new file mode 100644 index 0000000..02f4de2 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Async.html @@ -0,0 +1,53 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Async - test</title> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> + +<pre id="test"> +<!--<script type="text/javascript" src="User.data.js"></script>//--> +<script type="text/javascript" src="Async.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Async.test.js b/frontend/gamma/tests/tests/Clipperz/Async.test.js new file mode 100644 index 0000000..fa6daca --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Async.test.js @@ -0,0 +1,687 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +testObject = function (aLabel) { + this._label = aLabel; + this._sibling = null; +} + +testObject.prototype = { + 'label': function () { + return MochiKit.Async.succeed(this._label); + }, + + 'shouldHit': function () { + var filterRegExp; + + filterRegExp = new RegExp("hit", "i"); + + return Clipperz.Async.callbacks("testObject.shouldHit", [ + MochiKit.Base.method(this, 'label'), + MochiKit.Base.method(filterRegExp, 'test') + ]); + }, + + 'sibling': function () { + return this._sibling; + }, + + 'setSibling': function (aSibling) { + this._sibling = aSibling; + } + +} + +var tests = { + + //------------------------------------------------------------------------- + + 'succeedingForkedDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred", + [ + MochiKit.Base.partial(MochiKit.Async.succeed, 3), + MochiKit.Base.partial(MochiKit.Async.succeed, 2) + ], someTestArgs + )); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); + SimpleTest.is(sum, 5, "the sum of all the returned results should be 5"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", + [ + MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + ], someTestArgs + )); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'failingForkedDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred", + [ + MochiKit.Async.succeed, + MochiKit.Async.fail + ], someTestArgs + )); + deferredResult.addCallback(function () { + SimpleTest.ok(false, "forkAndJoin should fail, and execution path should NOT go through here"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(true, "forkAndJoin should fail and execution path should go through here") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingCollectResultsDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test succeedingCollectResultsDeferrer', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('Async.test succeedingCollectResultsDeferrer', { + 'first': MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + 'second': MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + 'third': MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); + SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); + SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResultsWithParameter_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResultsWithParameter_test', someTestArgs); + deferredResult.collectResults({ + 'add_3': MochiKit.Base.partial(MochiKit.Base.operator.add, 3), + 'sub_8': MochiKit.Base.partial(MochiKit.Base.operator.sub, 8), + 'mul_4': MochiKit.Base.partial(MochiKit.Base.operator.mul, 4) + }); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['add_3'], 8, "adding 3 to the passed value (5) returns 8"); + SimpleTest.is(anAsyncResult['sub_8'], 3, "subtracting the passed value (5) to 8 returns 3"); + SimpleTest.is(anAsyncResult['mul_4'], 20, "multiplying the passed value (5) by 4 returns 20"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.callback(5); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingCollectResultsDeferrer_alternative_syntax_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('succeedingCollectResultsDeferrer_alternative_syntax_test', someTestArgs); + deferredResult.collectResults({ + 'first': MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + 'second': MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + 'third': MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + }); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); + SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); + SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'failingCollectResultsDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test failingCollectResultsDeferrer', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('Async.test failingCollectResultsDeferrer', { + 'succeed': MochiKit.Base.partial(MochiKit.Async.succeed, 3), + 'fail': MochiKit.Base.partial(MochiKit.Async.fail, 2) + }, someTestArgs)); + deferredResult.addCallback(function() { + SimpleTest.ok(false, "collectResults should fail and execution path should NOT go through here"); + }); + deferredResult.addErrback(function (anAsyncResult) { + var result; + + result = anAsyncResult['message']; + SimpleTest.is(MochiKit.Base.keys(result).length, 2, "the result has exactly 2 values"); +//console.log("anAsyncResult", anAsyncResult); + SimpleTest.ok(!(result['succeed'] instanceof Error), "the successful value is actually successful"); + SimpleTest.ok(result['fail'] instanceof Error, "the failed value is actually failed"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResults_withSimpleArrayListOfCalls_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResults_withSimpleArrayListOfCalls_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withSimpleArrayListOfCalls_test - collectResults', { + 'path1': [ + MochiKit.Base.partial(MochiKit.Async.succeed, 3) + ], + 'path2': MochiKit.Base.partial(MochiKit.Async.succeed, 2) + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['path1'], 3, "the result of the first path is 3"); + SimpleTest.is(anAsyncResult['path2'], 2, "the result of the second path is 2"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResults_withArrayListOfCalls_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResults_withArrayListOfCalls_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withArrayListOfCalls_test - collectResults', { + 'path1': [ + MochiKit.Base.partial(MochiKit.Async.succeed, {key1:'value1', key2:'value2'}), + Clipperz.Base.serializeJSON + ], + 'path2': [ + MochiKit.Base.partial(MochiKit.Async.succeed, {key3:'value3', key4:'value4'}), + Clipperz.Base.serializeJSON + ] + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['path1'], "{\"key1\":\"value1\",\"key2\":\"value2\"}", "the result of the first path is correct"); + SimpleTest.is(anAsyncResult['path2'], "{\"key3\":\"value3\",\"key4\":\"value4\"}", "the result of the second path is correct"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredSort_test': function (someTestArgs) { + var deferredResult; + var testArray; + + testArray = [ + {key:'key2', label:function () { return MochiKit.Async.succeed('label2')} }, + {key:'key3', label:function () { return MochiKit.Async.succeed('label3')} }, + {key:'key7', label:function () { return MochiKit.Async.succeed('label7')} }, + {key:'key1', label:function () { return MochiKit.Async.succeed('label1')} }, + {key:'key5', label:function () { return MochiKit.Async.succeed('label5')} }, + {key:'key4', label:function () { return MochiKit.Async.succeed('label4')} }, + {key:'key9', label:function () { return MochiKit.Async.succeed('label9')} }, + {key:'key8', label:function () { return MochiKit.Async.succeed('label8')} }, + {key:'key6', label:function () { return MochiKit.Async.succeed('label6')} } + ] + + deferredResult = new Clipperz.Async.Deferred('deferredSort_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aObject, bObject) { + var result; + + result = Clipperz.Async.deferredCompare(MochiKit.Base.compare, aObject.label(), bObject.label()); + + return result; + }); + deferredResult.addCallback(function (aSortedArray) { + SimpleTest.is(aSortedArray.length, testArray.length, "The sorted array should have the same number of objects as the original one"); + SimpleTest.is(aSortedArray[0]['key'], 'key1', "[0] -> key1"); + SimpleTest.is(aSortedArray[1]['key'], 'key2', "[1] -> key2"); + SimpleTest.is(aSortedArray[2]['key'], 'key3', "[2] -> key3"); + SimpleTest.is(aSortedArray[3]['key'], 'key4', "[3] -> key4"); + SimpleTest.is(aSortedArray[4]['key'], 'key5', "[4] -> key5"); + SimpleTest.is(aSortedArray[5]['key'], 'key6', "[5] -> key6"); + SimpleTest.is(aSortedArray[6]['key'], 'key7', "[6] -> key7"); + SimpleTest.is(aSortedArray[7]['key'], 'key8', "[7] -> key8"); + SimpleTest.is(aSortedArray[8]['key'], 'key9', "[8] -> key9"); + }); + deferredResult.callback(testArray); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'callbacks_test': function (someTestArgs) { + return Clipperz.Async.callbacks("callbacks_test", [ + MochiKit.Base.partial(MochiKit.Base.operator.add, 5), + Clipperz.Async.Test.is(15, "Clipperz.Async.callbacks seems to work") + ], someTestArgs, 10); + }, + + //------------------------------------------------------------------------- + + 'deferredAcquireLockTest': function (someTestArgs) { + var deferredLock; + var deferredResult; + var anotherDeferred; + var deferredResults; + + deferredLock = new MochiKit.Async.DeferredLock(); + deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(function () { + SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); + }); + + anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); + anotherDeferred.acquireLock(deferredLock); + anotherDeferred.addCallback(function () { + SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') + }); + anotherDeferred.addErrback(function (anError) { + SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); + }); + + deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); + MochiKit.Async.callLater(1, function () { + anotherDeferred.cancel(); + }); + + deferredResult.callback(); + anotherDeferred.callback(); + return deferredResults; + }, + + //------------------------------------------------------------------------- + + 'deferredLockAcquireTest': function (someTestArgs) { + var deferredLock; + var defferedResult; + var anotherDeferred; + var deferredResults; + + deferredLock = new MochiKit.Async.DeferredLock(); + deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); + deferredResult.addMethod(deferredLock, 'acquire'); + deferredResult.addCallback(function () { + SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); + }); + + anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); + anotherDeferred.addMethod(deferredLock, 'acquire'); + anotherDeferred.addCallback(function () { + SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') + }); + anotherDeferred.addErrback(function (anError) { + SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); + }); + + + deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); + MochiKit.Async.callLater(1, function () { + anotherDeferred.cancel(); + }); + + deferredResult.callback(); + anotherDeferred.callback() + + return deferredResults; + }, + + //------------------------------------------------------------------------- + + 'deferredFilter_test': function (someTestArgs) { + var deferredResult; + var testObjects; + var filterRegExp; + var deferredFilterFunction; + + testObjects = [ + {key: '1', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 1') }, + {key: '2', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 2') }, + {key: '3', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 3') }, + {key: '4', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 4') }, + {key: '5', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 5') }, + {key: '6', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 6') }, + {key: '7', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 7') }, + {key: '8', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 8') }, + {key: '9', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 9') }, + {key:'10', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 10') } + ] + + filterRegExp = new RegExp("hit", "i"); + + deferredFilterFunction = function (aRegExp, anObject) { + return Clipperz.Async.callbacks("deferredFilterFunction", [ + MochiKit.Base.method(anObject, 'label'), + MochiKit.Base.method(aRegExp, 'test'), + function (doesItMatch) { + var result; + + if (doesItMatch) { + result = MochiKit.Async.succeed('match'); + } else { + result = MochiKit.Async.fail('miss'); + } + + return result; + } + ], someTestArgs); + }; + + deferredResult = new Clipperz.Async.Deferred("deferredFilter_test", someTestArgs); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.partial(deferredFilterFunction, filterRegExp), testObjects); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp"); + SimpleTest.is(aResult[0]['key'], '2', "The first item to match is the one with key:2"); + SimpleTest.is(aResult[1]['key'], '4', "The first item to match is the one with key:4"); + SimpleTest.is(aResult[2]['key'], '7', "The first item to match is the one with key:7"); + SimpleTest.is(aResult[3]['key'], '10', "The first item to match is the one with key:10"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredFilter_methodcaller_test': function (someTestArgs) { + var deferredResult; + var testObjects; + var filterRegExp; + var deferredFilterFunction; + + testObjects = [ + new testObject('skip 1'), + new testObject('hit 2'), + new testObject('skip 3'), + new testObject('hit 4'), + new testObject('skip 5'), + new testObject('skip 6'), + new testObject('hit 7'), + new testObject('skip 8'), + new testObject('skip 9'), + new testObject('hit 10') + ]; + + deferredResult = new Clipperz.Async.Deferred("deferredFilter_methodcaller_test", someTestArgs); +// deferredResult.addCallback(function () { return testObjects[0]; }); + deferredResult.addCallback(MochiKit.Async.succeed, testObjects[0]); + deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addTest(false, "the first element shoud return 'false' to the 'shouldHit' method"); + + deferredResult.addCallback(MochiKit.Async.succeed, testObjects[1]); + deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addTest(true, "the second element shoud return 'true' to the 'shouldHit' method"); + + deferredResult.addCallback(MochiKit.Async.succeed, testObjects); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp"); + SimpleTest.is(aResult[0]._label, 'hit 2', "The first item to match is the one with key:2"); + SimpleTest.is(aResult[1]._label, 'hit 4', "The first item to match is the one with key:4"); + SimpleTest.is(aResult[2]._label, 'hit 7', "The first item to match is the one with key:7"); + SimpleTest.is(aResult[3]._label, 'hit 10', "The first item to match is the one with key:10"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setItem_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + deferredResult = new Clipperz.Async.Deferred("setItem_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, "Value 1"); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'key1'); + deferredResult.addCallback(MochiKit.Async.succeed, "Value 2"); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'key2'); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setItemOnObject_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("setItemOnObject_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key1', "Value 1"); + deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key2', "Value 2"); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setDeferredItemOnObject_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("setDeferredItemOnObject_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key1', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 1")); + deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key2', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 2")); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addIf_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("addIf_test", someTestArgs); + + deferredResult.addCallback(MochiKit.Async.succeed, true); + deferredResult.addIf([ + MochiKit.Base.partial(SimpleTest.ok, true, "when a true value is passed, the 'then' branch is executed") + ], [ + MochiKit.Base.partial(SimpleTest.ok, false, "when a true value is passed, the 'else' branch should NOT be executed") + ]); + + deferredResult.addCallback(MochiKit.Async.succeed, false); + deferredResult.addIf([ + MochiKit.Base.partial(SimpleTest.ok, false, "when a false value is passed, the 'then' branch should NOT be executed") + ], [ + MochiKit.Base.partial(SimpleTest.ok, true, "when a false value is passed, the 'else' branch is executed") + ]); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addMethod_test': function (someTestArgs) { + var deferredResult; + var testObjectInstance; + var testObjectInstance_2; + var label; + var testObjectInstanceGetter; + + label = "Test - Label"; + testObjectInstance = new testObject(label); + testObjectInstance_2 = new testObject(label + label); + testObjectInstance.setSibling(testObjectInstance_2); + + testObjectInstanceGetter = function () { + return testObjectInstance; + } + + deferredResult = new Clipperz.Async.Deferred("addMethod_test", someTestArgs); + deferredResult.addMethod(testObjectInstance, 'label'); + deferredResult.addTest(label, "the addMethod seems to work"); + + deferredResult.addMethod(testObjectInstanceGetter(), 'label'); + deferredResult.addTest(label, "the addMethod seems to work"); + + deferredResult.addMethod(testObjectInstance.sibling(), 'label'); + deferredResult.addTest(label+label, "the addMethod seems to work"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'callbacksWithErrors_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("callbacksWithErrors_test", someTestArgs); + deferredResult.addCallback(MochiKit.Base.partial(Clipperz.Async.callbacks, "callbacksWithErrors_test - callbacks", [ + function () { return 10; }, + function (aValue) { pippo = pluto + aValue; }, + function (aValue) { SimpleTest.ok(false, "this code should never be executed"); return aValue; } + ], {trace:someTestArgs})); + deferredResult.addCallback(SimpleTest.ok, false, "the inner code should raise an exception and exit through the error chain"); + deferredResult.addErrback(SimpleTest.ok, true, "the inner code should raise an exception and exit through the error chain"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredVars_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("deferredVars_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, "test string"); + deferredResult.setValue('testKey'); + deferredResult.addCallback(MochiKit.Async.succeed, "another string"); + deferredResult.getValue('testKey'); + deferredResult.addTest("test string", "The right string has been fetched"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.Async", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/Base.html b/frontend/gamma/tests/tests/Clipperz/Base.html new file mode 100644 index 0000000..6b29417 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Base.html @@ -0,0 +1,55 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Base - TEST</title> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> + + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript" src="Base.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Base.test.js b/frontend/gamma/tests/tests/Clipperz/Base.test.js new file mode 100644 index 0000000..e5c7caf --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Base.test.js @@ -0,0 +1,367 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + + +//============================================================================= + +testEvalJSON = function(aString, shouldFail, aDescription) { + var result; + + if (shouldFail == true) { + try { + result = Clipperz.Base.evalJSON(aString); + is(true, false, aDescription + ": vulnerability not caught"); +//console.log(result); + } catch(exception) { + is(true, true, aDescription + ": vulnerability correctly caught"); + } + } else { + try { + result = Clipperz.Base.evalJSON(aString); + is(true, true, aDescription + ": configuration correctly checked"); + } catch(exception) { + is(true, false, aDescription + ": configuration wrongly caught as malicious"); +// console.log(exception); + } + } + + return result; +} + +//============================================================================= + +var tests = { + + '001_test': function () { + var stringToSplit; + var splittedString; + + stringToSplit = "stringToSplit"; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2); + is(splittedString.length, 7); + is(splittedString[0], 'st'); + is(splittedString[1], 'ri'); + is(splittedString[2], 'ng'); + is(splittedString[3], 'To'); + is(splittedString[4], 'Sp'); + is(splittedString[5], 'li'); + is(splittedString[6], 't', "test that should pass"); + + stringToSplit = "stringToSplit"; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); + is(splittedString.length, 1); + is(splittedString[0], 'stringToSplit'); + + stringToSplit = null; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); + is(splittedString.length, 0); + }, + + //------------------------------------------------------------------------- + + '002_test': function () { + var anObject; + + anObject = "String"; + is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)"); + anObject = new String("String"); + is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)"); + + anObject = 120; + is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)"); + anObject = new Number(120); + is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)"); + + anObject = true; + is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)"); + anObject = new Boolean(true); + is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)"); + + anObject = new Date; + is(Clipperz.Base.objectType(anObject), 'date', "test on dates"); + + anObject = new Error("test"); + is(Clipperz.Base.objectType(anObject), 'error', "test on errors"); + + anObject = function() {}; + is(Clipperz.Base.objectType(anObject), 'function', "test on functions"); + + anObject = new Object(); + is(Clipperz.Base.objectType(anObject), 'object', "test on objects"); + + + anObject = [1, 2, 3]; + is(Clipperz.Base.objectType(anObject), 'array', "test on arrays"); + }, + + //------------------------------------------------------------------------- + + '003_test': function () { + var original, clone; + + original = { + a: "a", + b: "b" + }; + + clone = Clipperz.Base.deepClone(original); + is(MochiKit.Base.compare(original, clone), 0, "simple cloning return two equal objects"); + + clone.c = "c"; + is(MochiKit.Base.compare(original, clone), -1, "changing an object leave the original object unchanged"); + + original = { + a: "a", + b: "b", + nested: { + a1: "a1", + b1: "b1" + } + }; + + clone = Clipperz.Base.deepClone(original); + is(MochiKit.Base.compare(original, clone), 0, "cloning of an object with nested values return two equal objects"); + + clone.nested.c1 = "c1"; + is(MochiKit.Base.compare(original, clone), -1, "changing a nested value leave the original object unchanged"); + }, + + //------------------------------------------------------------------------- + + '004_test': function () { + var jsonString; + + jsonString = '{"page": {"title": "Example Attack"},"form": { "attributes": { "action": "javascript:opener.document.body.innerHTML = \'hacked!\';close();", "style": "-moz-binding:url(\'http://ha.ckers.org/xssmoz.xml#xss\')", "method": null }, "inputs": [{"type": "text", "name": "username", "value": ""}, {"type": "password", "name": "password", "value": ""}]},"version": "0.2.3" }'; + testEvalJSON(jsonString, false, ""); + + // jsonString = '{"0":{"label":"<script>alert(\"Ciao Marco\")< /script>","key":"ebc9782019bf9aa757e9c4d716ab303e2050b60c4b9a06b18ab09a417e0ddf00"}, "1":{"label":"<iframe><script>alert(\\"Ciao ragazzi\\")< /script></iframe>", "key":"413cfb122a1601c50e0f9462978ba77a36fdcecb49dda7550ee129dc114ba328"}}'; + jsonString = new Clipperz.ByteArray().appendBase64String("eyIwIjp7ImxhYmVsIjoiPHNjcmlwdD5hbGVydChcIkNpYW8gTWFyY29cIik8L3NjcmlwdD4iLCAia2V5IjoiZWJjOTc4MjAxOWJmOWFhNzU3ZTljNGQ3MTZhYjMwM2UyMDUwYjYwYzRiOWEwNmIxOGFiMDlhNDE3ZTBkZGYwMCJ9LCAiMSI6eyJsYWJlbCI6IjxpZnJhbWU+PHNjcmlwdD5hbGVydChcIkNpYW8gcmFnYXp6aVwiKTwvc2NyaXB0PjwvaWZyYW1lPiIsICJrZXkiOiI0MTNjZmIxMjJhMTYwMWM1MGUwZjk0NjI5NzhiYTc3YTM2ZmRjZWNiNDlkZGE3NTUwZWUxMjlkYzExNGJhMzI4In19").asString(); + testEvalJSON(jsonString, false); + + jsonString = 'alert("foobar");'; + testEvalJSON(jsonString, true); + + // jsonString = '<script>alert("foobar");< /script>'; + jsonString = new Clipperz.ByteArray().appendBase64String("PHNjcmlwdD5hbGVydCgiZm9vYmFyIik7PC9zY3JpcHQ+").asString(); + testEvalJSON(jsonString, true); + + jsonString = '{"xss": alert("XSS!")}'; + testEvalJSON(jsonString, true); + + jsonString = '{"inner": {"xss": alert("XSS!")}}'; + testEvalJSON(jsonString, true); + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.itemgetter_test': function () { + var anObject; + + anObject = { + key1: 'value1', + key2: { + key2_1: 'value2_1', + key2_2: 'value2_2' + }, + key3: { + key3_1: { + key3_1_1: 'value3_1_1', + key3_1_2: 'value3_1_2' + }, + key3_2: { + key3_2_1: 'value3_2_1', + key3_2_2: 'value3_2_2' + } + } + }; + + SimpleTest.is(Clipperz.Base.itemgetter('key1')(anObject), "value1", "Clipperz.Base.itemgetter works as MochiKit.Base.itemgetter"); + SimpleTest.is(Clipperz.Base.itemgetter('key2.key2_1')(anObject), "value2_1", "Clipperz.Base.itemgetter works also with keypaths"); + SimpleTest.is(Clipperz.Base.itemgetter('key3.key3_2.key3_2_2')(anObject), "value3_2_2", "Clipperz.Base.itemgetter works also with 'long' keypaths"); + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.caseInsensitiveCompare_test': function () { + var comparator; + var objects; + + comparator = Clipperz.Base.caseInsensitiveCompare; + objects = [ 'ccc', 'aaa', 'bbb', 'eee', 'ddd']; + SimpleTest.isDeeply(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); + + comparator = MochiKit.Base.compare; + objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd']; + SimpleTest.isDeeply(['AAA', 'EEE', 'bbb', 'ccc', 'ddd'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); + + comparator = Clipperz.Base.caseInsensitiveCompare; + objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd']; + SimpleTest.isDeeply(['AAA', 'bbb', 'ccc', 'ddd', 'EEE'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.reverseComparator_test': function () { + var comparator; + var objects; + + comparator = MochiKit.Base.compare; + objects = [5, 3, 2, 4, 1]; + SimpleTest.isDeeply([1, 2, 3, 4, 5], objects.sort(comparator), "a regular comparator works fine"); + + comparator = Clipperz.Base.reverseComparator(MochiKit.Base.compare); + objects = [5, 3, 2, 4, 1]; + SimpleTest.isDeeply([5, 4, 3, 2 ,1], objects.sort(comparator), "a reversed comparator works fine"); + + comparator = MochiKit.Base.keyComparator('label'); + objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}]; + SimpleTest.isDeeply([ {label:"1"}, {label:"2"}, {label:"3"}, {label:"4"}, {label:"5"}], objects.sort(comparator), "a regular keyComparator works fine"); + + comparator = Clipperz.Base.reverseComparator(MochiKit.Base.keyComparator('label')); + objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}]; + SimpleTest.isDeeply([ {label:"5"}, {label:"4"}, {label:"3"}, {label:"2"}, {label:"1"}], objects.sort(comparator), "a reversed keyComparator works fine"); + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.map_test': function () { + var objects; + var computedObjecs; + + objects = [5, 3, 2, 4, 1]; + computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects); + SimpleTest.isDeeply(computedObjecs, [10, 6, 4, 8, 2], "the mapped values of the array do match"); + + objects = { + 'five': 5, + 'three': 3, + 'two': 2, + 'four': 4, + 'one': 1 + }; + computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects); + SimpleTest.isDeeply(computedObjecs, { + 'five': 10, + 'three': 6, + 'two': 4, + 'four': 8, + 'one': 2 + }, "the mapped values of the object do match"); + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.isUrl_test': function () { + var urlTestCases; + + urlTestCases = [ + {url:'http://foo.com/blah_blah', expectedResult:true}, + {url:'http://foo.com/blah_blah', expectedResult:true}, + {url:'http://foo.com/blah_blah/', expectedResult:true}, + {url:'http://foo.com/blah_blah_(wikipedia)', expectedResult:true}, + {url:'http://foo.com/blah_blah.', expectedResult:true}, + {url:'http://foo.com/blah_blah/.', expectedResult:true}, + {url:'http://foo.com/blah_blah,', expectedResult:true}, + {url:'http://✪df.ws/123', expectedResult:true}, + {url:'http://➡.ws/䨹', expectedResult:true}, + {url:'www.➡.ws/䨹', expectedResult:true}, + {url:'http://www.example.com/wpstyle/?p=364.', expectedResult:true}, + {url:'www.clipperz.com', expectedResult:true}, + {url:'http://www.clipperz.com', expectedResult:true}, + {url:'http://clipperz.com', expectedResult:true}, + + {url:'clipperz.com', expectedResult:false}, +// {url:'www.clipperz', expectedResult:false}, +// {url:'www.abc', expectedResult:false}, + {url:'joe@clipperz.com', expectedResult:false}, + {url:'<http://foo.com/blah_blah>', expectedResult:false}, + {url:'<http://foo.com/blah_blah/>', expectedResult:false}, + {} + ]; + + MochiKit.Base.map(function (someValues) { + if (typeof(someValues['url']) != 'undefined') { + SimpleTest.is(Clipperz.Base.isUrl(someValues['url']), someValues['expectedResult'], "testing url '" + someValues['url'] + "' - expected result: " + someValues['expectedResult']); + } + }, urlTestCases); + +/* + // RegExp and test strings courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah'), true, "url test +1"); + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/'), true, "url test +2"); + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah_(wikipedia)'), true, "url test +3"); + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah.'), true, "url test +4"); + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/.'), true, "url test +5"); + SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah>'), true, "url test +6"); + SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah/>'), true, "url test +7"); + SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah,'), true, "url test +8"); + SimpleTest.is(Clipperz.Base.isUrl('http://✪df.ws/123'), true, "url test +9"); + SimpleTest.is(Clipperz.Base.isUrl('http://➡.ws/䨹'), true, "url test +10"); + SimpleTest.is(Clipperz.Base.isUrl('www.➡.ws/䨹'), true, "url test +11"); + SimpleTest.is(Clipperz.Base.isUrl('http://www.example.com/wpstyle/?p=364.'),true, "url test +12"); + SimpleTest.is(Clipperz.Base.isUrl('www.clipperz.com'), true, "url test +13"); + SimpleTest.is(Clipperz.Base.isUrl('http://www.clipperz.com'), true, "url test +14"); + +// SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com'), true, "url test +13"); // FAIL +// SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com:8080'), true, "url test +14"); // FAIL +// SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com'), true, "url test +15"); // FAIL +// SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com:8080'), true, "url test +16"); // FAIL + + + SimpleTest.is(Clipperz.Base.isUrl('joe@clipperz.com'), false, "url test -1"); + SimpleTest.is(Clipperz.Base.isUrl('rdar://1234'), false, "url test -2"); + SimpleTest.is(Clipperz.Base.isUrl('rdar:/1234'), false, "url test -3"); + SimpleTest.is(Clipperz.Base.isUrl('http://example.com:8080 x-yojimbo-item://6303E4C1-xxxx-45A6-AB9D-3A908F59AE0E'), false, "url test -4"); + SimpleTest.is(Clipperz.Base.isUrl('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e'), false, "url test -5"); +*/ + }, + + //------------------------------------------------------------------------- + + 'Clipperz.Base.isEmail_test': function () { + var emailTestCases; + + emailTestCases = [ + {email:'joe@clipperz.com', expectedResult:true}, + + {email:'http://foo.com/blah_blah', expectedResult:false} + ]; + + MochiKit.Base.map(function (someValues) { + SimpleTest.is(Clipperz.Base.isEmail(someValues['email']), someValues['expectedResult'], "testing email '" + someValues['email'] + "' - expected result: " + someValues['expectedResult']); + }, emailTestCases); + }, + + //------------------------------------------------------------------------- + + 'syntaxFix': MochiKit.Base.noop +} + +//============================================================================= + +SimpleTest.runDeferredTests("Clipperz.Base", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.html b/frontend/gamma/tests/tests/Clipperz/ByteArray.html new file mode 100644 index 0000000..c8b8ae7 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.html @@ -0,0 +1,71 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.ByteArray - tests</title> + + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script> + <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script --> + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> + +<pre id="test"> +<script> + Clipperz_IEisBroken = false; +</script> + <script type="text/javascript"> + var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a."; + var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; + var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; + </script> + <script type="text/javascript" src="ByteArray.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js new file mode 100644 index 0000000..ef2660e --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js @@ -0,0 +1,893 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'core_tests': function (someTestArgs) { +// var deferredResult; + +// deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs); +// deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray(); + + try { + byteArray.checkByteValue(512); + is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + }; + +// }); +// deferredResult.callback(); + +// return deferredResult; + + }, + + //------------------------------------------------------------------------- + + 'basic_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + var byteArrayIterator; + var nextBlock; + + byteArray = new Clipperz.ByteArray(); + is(byteArray.length(), 0, "before adding any element the length is 0"); + byteArray.appendByte(10); + is(byteArray.length(), 1, "adding a single byte the length == 1"); + is(byteArray.byteAtIndex(0), 10, "the first element is correct"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values"); + is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element"); + is(nextBlock[0], 10, "the element of the returned block is correct"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "after the last element, the nextBlock returns null"); + + byteArray = new Clipperz.ByteArray(); + byteArray.appendBytes(10, 20, 45, 38); + is(byteArray.length(), 4, "Appending more bytes, returns the right length"); + is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]"); + is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]"); + is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]"); + is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]"); + + byteArray2 = new Clipperz.ByteArray(); + byteArray2.appendBytes([10, 20, 45, 38]); + is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values"); + + byteArray2 = new Clipperz.ByteArray(); + byteArray2.appendBytes([20, 11, 3, 22]); + is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize"); + is(nextBlock[0], 10, "the values returned by nextBlock are right [1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 20, "the values returned by nextBlock are right [2]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 45, "the values returned by nextBlock are right [3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 38, "the values returned by nextBlock are right [4]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "after the last block the nextBlock method returns null"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length"); + is(nextBlock[0], 10, "and also the data are fine [1][0]"); + is(nextBlock[1], 20, "and also the data are fine [1][1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "also the second block size is right"); + is(nextBlock[0], 45, "and also the data are fine [2][0]"); + is(nextBlock[1], 38, "and also the data are fine [2][1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with a bigger blockSize, at the end the returned value is null"); + + byteArray = new Clipperz.ByteArray(11,22,33,44,55,66,77,88,99); + is(byteArray.length(), 9, ""); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "the last block of an odd byte array has always the same size"); + is(nextBlock[0], 99, "the last element is returned"); + is(nextBlock[1], 0, "and a 0 is return for the extra values"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(32/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 11, "32 bit blockSize [1][0]"); + is(nextBlock[1], 22, "32 bit blockSize [1][1]"); + is(nextBlock[2], 33, "32 bit blockSize [1][2]"); + is(nextBlock[3], 44, "32 bit blockSize [1][3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 55, "32 bit blockSize [2][0]"); + is(nextBlock[1], 66, "32 bit blockSize [2][1]"); + is(nextBlock[2], 77, "32 bit blockSize [2][2]"); + is(nextBlock[3], 88, "32 bit blockSize [2][3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 4, "the last block of an odd byte array has always the same size"); + is(nextBlock[0], 99, "the last element is returned (2)"); + is(nextBlock[1], 0, "and a 0 is return for the extra values (2.1)"); + is(nextBlock[2], 0, "and a 0 is return for the extra values (2.2)"); + is(nextBlock[3], 0, "and a 0 is return for the extra values (2.3)"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned (2)"); + + byteArray = new Clipperz.ByteArray([11,22,33,44,55,66,77,88,99,100, 111, 122, 133, 144, 155, 166, 177]); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "using a blockSize of 128 bit, the nextBlock return a 16 elements array"); + + byteArray = new Clipperz.ByteArray(); + try { + byteArray.appendByte(512); + is(false, true, "appending a value greater that a byte (0x200) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + }; + + try { + byteArray.appendByte(256); + is(false, true, "appending a value greater that a byte (0x100) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") + }; + + byteArray.appendByte(255); + is(byteArray.length(), 1, "appending a value that feets a single byte does not raise any exception"); + + byteArray = new Clipperz.ByteArray(10, 20, 30, 40, 50); + byteArray2 = new Clipperz.ByteArray("0x0a141e2832"); + is(byteArray.equals(byteArray2), true, "the hex constructor works fine"); + + byteArray2 = byteArray.clone(); + is(byteArray.equals(byteArray2), true, "the clone method works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'compare_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("compare_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray1; + var byteArray2; + var result; + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = byteArray1.compare(byteArray2); + is(result, 0, "equal compare"); + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0x05", 16); + result = byteArray1.compare(byteArray2); + is(result, 1, "'OxXXXXXXX'.compare('0x05')"); + result = byteArray2.compare(byteArray1); + is(result, -1, "'0x05'.compare('OxXXXXXXX')"); + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0xff", 16); + result = byteArray1.compare(byteArray2); + is(result, 1, "'OxXXXXXXX'.compare('0xff')"); + result = byteArray2.compare(byteArray1); + is(result, -1, "'0xff'.compare('OxXXXXXXX')"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'shiftLeft_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("shiftLeft_tests", someTestArgs); + deferredResult.addCallback(function() { + + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'nextBlockArray_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("nextBlockArray_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArrayIterator; + var nextBlock; + + byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); + nextBlock = byteArrayIterator.nextBlockArray(); + is(nextBlock.toHexString(), "0x8cf53d90077df9a043bf8d10b470b144", "nextBlockArray first iteration"); + nextBlock = byteArrayIterator.nextBlockArray(); + is(nextBlock.toHexString(), "0x784411c93a4d504556834dae3ea4a5bb", "nextBlockArray second iteration"); + + byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "nextBlock first iteration length"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "nextBlock second iteration length"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'xor_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("xor_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + + byteArray = new Clipperz.ByteArray("0x55555555555555555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2).toHexString(), "0x55aa555555aa555555aa555555aa5555", "the xorMergeWithBlock method works fine"); + + byteArray = new Clipperz.ByteArray("0x555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2, 'left', 'truncate').toHexString(), "0x55aa555555aa555555", "the xorMergeWithBlock (left, truncate) method works fine"); + + byteArray = new Clipperz.ByteArray("0x555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2, 'right', 'truncate').toHexString(), "0x5555aa555555aa5555", "the xorMergeWithBlock (right, truncate) method works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'increment_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("increment_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var number; + var i,c; + + number = new Clipperz.Crypto.BigInt("55555555555555555555555555555555", 16); + byteArray = new Clipperz.ByteArray("0x" + number.asString(16)); + c = 2048; + for (i=0; i<c; i++) { + byteArray.increment(); + } + is(byteArray.toHexString(), "0x" + number.add(2048).asString(16), "Clipperz.ByteArray.increment works"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'split_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("split_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray("0xa1b2c3d4"); + is(byteArray.split(0, 2).toHexString(), "0xa1b2", "byteArray.split(0,2) works fine"); + is(byteArray.split(2).toHexString(), "0xc3d4", "byteArray.split(2) works fine"); + is(byteArray.split(1, 3).toHexString(), "0xb2c3", "byteArray.split(1,3) works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'appendBlock_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("appendBlock_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + + byteArray = new Clipperz.ByteArray("0xa1b2c3d4"); + byteArray2 = new Clipperz.ByteArray("0x1a2b3c4d"); + is(byteArray.appendBlock(byteArray2).toHexString(), "0xa1b2c3d41a2b3c4d", "the appendBlock method works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'appendWords_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("appendWords_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray(); + byteArray.appendWords(0xa1b2c4d4, 0x1a2b3c4d); + is(byteArray.toHexString(), "0xa1b2c4d41a2b3c4d", "test appendWords"); + + byteArray = new Clipperz.ByteArray(); + byteArray.appendBigEndianWords(0xa1b2c4d4, 0x1a2b3c4d); + is(byteArray.toHexString(), "0xd4c4b2a14d3c2b1a", "test appendBigEndianWords"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setByteAtIndex_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("setByteAtIndex_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6"); + byteArray.setByteAtIndex(10, 0); + is(byteArray.toHexString(), "0x0ab2c3d4e5f6", "setByteAtIndex( , 0) works fine"); + + byteArray.setByteAtIndex(10, 5); + is(byteArray.toHexString(), "0x0ab2c3d4e50a", "setByteAtIndex( , 5) works fine"); + + byteArray.setByteAtIndex(10, 6); + is(byteArray.toHexString(), "0x0ab2c3d4e50a0a", "setByteAtIndex( , 6) works fine"); + + byteArray.setByteAtIndex(10, 10); + is(byteArray.toHexString(), "0x0ab2c3d4e50a0a0000000a", "setByteAtIndex( , 10) works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'string_encoding_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("string_encoding_tests", someTestArgs); + deferredResult.addCallback(function() { + is(Clipperz.ByteArray.unicodeToUtf8HexString(40), "28", "String encoding - One byte character - middle"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(127), "7f", "String encoding - One byte character - top"); + + is(Clipperz.ByteArray.unicodeToUtf8HexString(128), "c280", "String encoding - Two bytes character - bottom"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(300), "c4ac", "String encoding - Two bytes character - middle"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(2047), "dfbf", "String encoding - Two bytes character - top"); + + is(Clipperz.ByteArray.unicodeToUtf8HexString(2048), "e0a080", "String encoding - Three bytes character - bottom"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(8192), "e28080", "String encoding - Three bytes character - middle"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(65535), "efbfbf", "String encoding - Three bytes character - top"); + + is(Clipperz.ByteArray.unicodeToUtf8HexString(65536), "f0908080", "String encoding - Four bytes character - bottom"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(1000000), "f3b48980", "String encoding - Four bytes character - middle"); + is(Clipperz.ByteArray.unicodeToUtf8HexString(2097151), "f7bfbfbf", "String encoding - Four bytes character - top"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'string_decoding_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("string_decoding_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + var unicodeString; + + is(new Clipperz.ByteArray("0x28").asString().charCodeAt(0), 40, "String decoding - One byte character - middle"); + is(new Clipperz.ByteArray("0x7f").asString().charCodeAt(0), 127, "String decoding - One byte character - top"); + + is(new Clipperz.ByteArray("0xc280").asString().charCodeAt(0), 128, "String decoding - Two bytes character - bottom"); + is(new Clipperz.ByteArray("0xc4ac").asString().charCodeAt(0), 300, "String decoding - Two bytes character - middle"); + is(new Clipperz.ByteArray("0xceb1").asString().charCodeAt(0), 945, "String decoding - Two bytes char: greek lowercase alpha - α"); + is(new Clipperz.ByteArray("0xd790").asString().charCodeAt(0), 1488, "String decoding - Two bytes char: hebrew Aleph - א"); + is(new Clipperz.ByteArray("0xdfbf").asString().charCodeAt(0), 2047, "String decoding - Two bytes character - top"); + + is(new Clipperz.ByteArray("0xe0a080").asString().charCodeAt(0), 2048, "String decoding - Three bytes character - bottom"); + is(new Clipperz.ByteArray("0xe0bc80").asString().charCodeAt(0), 3840, "String decoding - Three bytes char: tibetan syllable Om - ༀ"); + is(new Clipperz.ByteArray("0xe28080").asString().charCodeAt(0), 8192, "String decoding - Three bytes character - middle"); + is(new Clipperz.ByteArray("0xe4b899").asString().charCodeAt(0), 19993, "String decoding - Three bytes char: CJK ideograph - 丙"); + is(new Clipperz.ByteArray("0xefbfbf").asString().charCodeAt(0), 65535, "String decoding - Three bytes character - top"); + +/* + is(new Clipperz.ByteArray("0xf0908080").asString().charCodeAt(0), 65536, "String decoding - Four bytes character - bottom"); + is(new Clipperz.ByteArray("0xf0a08294").asString().charCodeAt(0), 131220, "String decoding - Four bytes char: CJK extended ideograph - "); + is(new Clipperz.ByteArray("0xf3b48980").asString().charCodeAt(0), 1000000, "String decoding - Four bytes character - middle"); + is(new Clipperz.ByteArray("0xf7bfbfbf").asString().charCodeAt(0), 2097151, "String decoding - Four bytes character - top"); + + is(String.fromCharCode(65535).charCodeAt(0), 65535, "test fromCharCode - charCodeAt (65535)"); + is(String.fromCharCode(65536).charCodeAt(0), 65536, "test fromCharCode - charCodeAt (65536)"); + is(String.fromCharCode(1000000).charCodeAt(0), 1000000, "test fromCharCode - charCodeAt (1000000)"); +*/ + //---------------------------------------------------------- + + byteArray = new Clipperz.ByteArray("ABCD"); + byteArray2 = new Clipperz.ByteArray("0x41424344"); + is(byteArray.toHexString(), byteArray2.toHexString(), "the string constructor works fine (1 byte codes)"); + + unicodeString = "una stringa un po' piu' semplice"; + byteArray = new Clipperz.ByteArray(unicodeString); + is(byteArray.asString(), unicodeString, ""); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'base64_encoding_decoding_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("base64_encoding_decoding_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray("\n"); + is(byteArray.toBase64String(), "Cg==", "base64 encoding test (1)"); + + byteArray = new Clipperz.ByteArray("what"); + is(byteArray.toBase64String(), "d2hhdA==", "base64 encoding test (2)"); + + byteArray = new Clipperz.ByteArray("what will print out"); + is(byteArray.toBase64String(), "d2hhdCB3aWxsIHByaW50IG91dA==", "base64 encoding test (3)"); + + byteArray = new Clipperz.ByteArray("what will print out "); + is(byteArray.toBase64String(), "d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQgICAgICA=", "base64 encoding test (4)"); + + byteArray = new Clipperz.ByteArray("what will print out"); + is(byteArray.toBase64String(), "d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQ=", "base64 encoding test (5)"); + + byteArray = new Clipperz.ByteArray().appendBase64String("Cg=="); + is(byteArray.asString(), "\n", "base64 encoding test (1)"); + + byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdA=="); + is(byteArray.asString(), "what", "base64 encoding test (2)"); + + byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCB3aWxsIHByaW50IG91dA=="); + is(byteArray.asString(), "what will print out", "base64 encoding test (3)"); + + byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQgICAgICA="); + is(byteArray.asString(), "what will print out ", "base64 encoding test (4)"); + + byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQ="); + is(byteArray.asString(), "what will print out", "base64 deconding test (5)"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'base64_encoding_decoding_longText_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("base64_encoding_decoding_longText_tests", someTestArgs); + deferredResult.addCallback(function() { + var longText; + var byteArray; + var base64encoding; + + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur interdum vulputate ligula. Aliquam erat volutpat. Fusce malesuada felis et purus. Vivamus convallis, metus id lacinia venenatis, est eros sagittis neque, at porttitor erat lorem a risus. Phasellus ultricies nunc et turpis. Ut nec sem ut quam ornare feugiat. Donec nibh. Quisque ullamcorper, neque eu convallis dictum, orci nisl dictum quam, ac elementum arcu sem varius sem. Suspendisse vitae dolor non magna suscipit semper. Suspendisse ac magna. Praesent et purus. Aenean ut justo. Curabitur dictum, nisl a consectetuer viverra, libero est auctor metus, et rhoncus risus diam in orci. Nam magna felis, lobortis eu, eleifend quis, tristique quis, mi. Praesent aliquet. Aenean mollis turpis sed dolor. Donec ac nunc. Nulla eu lacus in ipsum molestie rutrum. Nunc dignissim purus non nibh. Maecenas congue risus at neque sollicitudin eleifend.\n\nNunc purus orci, sagittis ut, vehicula non, auctor eu, orci. Fusce non nisl vel risus rutrum venenatis. Donec dapibus sodales eros. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ultrices fringilla dui. Phasellus sit amet enim in tellus rutrum dapibus. Sed blandit malesuada turpis. Ut vel orci. Curabitur id eros. Sed sodales tempus urna. Praesent et neque. Sed ultricies. Praesent risus quam, elementum eget, tincidunt ac, condimentum sit amet, urna.\n\nLorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin vel diam imperdiet felis luctus luctus. Nunc tincidunt nisl ac arcu. Sed id urna id magna nonummy varius. Mauris ligula. Vivamus purus eros, dignissim non, bibendum eget, dapibus sit amet, urna. Donec scelerisque dapibus odio. Aenean gravida ante at eros. Aenean volutpat vehicula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed elementum nisi ac dui. Fusce consectetuer venenatis nisi. Etiam diam. Nunc urna tortor, feugiat sed, facilisis eu, lacinia ut, felis. Vivamus vel lacus in massa accumsan faucibus. Cras iaculis eros. Donec non risus eu mi aliquam facilisis. Quisque vitae erat. Vivamus sed felis at metus ullamcorper ornare. Aliquam orci.\n\nPellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras ultrices, tortor in tempus laoreet, orci magna auctor quam, ultricies consequat sem eros eu magna. Mauris tempus egestas libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Curabitur auctor molestie ante. Quisque laoreet urna a quam. Sed sagittis, nulla vitae bibendum tempus, metus ante bibendum urna, ut ullamcorper mi urna vitae neque. Praesent dolor. Maecenas sit amet tortor. Proin erat. Suspendisse ipsum. Nulla facilisi. Vestibulum nonummy nulla ac libero. Aliquam in mauris ut libero cursus ullamcorper. Nam ullamcorper auctor tortor.\n\nNulla et odio. Duis nec velit. Sed posuere neque vitae dolor. Phasellus diam massa, sollicitudin vel, pellentesque in, fringilla pretium, libero. In lacinia massa ut libero pharetra sodales. Aliquam erat volutpat. Suspendisse egestas, turpis at pretium placerat, sem dolor tristique felis, nec egestas lectus risus eu quam. Curabitur leo dolor, varius sed, tristique non, fermentum eget, elit. Vivamus a leo eu diam faucibus congue. Nam quam. Curabitur est velit, luctus quis, tempor et, mattis consectetuer, dolor. Ut accumsan dui nec mi. Donec enim. Mauris accumsan nisl. Praesent sit amet diam ut velit suscipit vehicula. Vestibulum augue diam, placerat sit amet, gravida volutpat, egestas nec, metus. Curabitur risus felis, tempus nec, blandit a, condimentum at, risus."; + + byteArray = new Clipperz.ByteArray(longText); + base64encoding = byteArray.toBase64String(); + byteArray = new Clipperz.ByteArray().appendBase64String(base64encoding); + is(byteArray.asString(), longText, "the base64 encoding/decoding works also with long texts"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'base32_encoding_decoding_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("base32_encoding_decoding_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray("\n"); + is(byteArray.toBase32String(), "18======", "base32 encoding test (1)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("18======"); + is(byteArray.toBase32String(), "18======", "base32 encoding test (2)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("lLiIo0O1"); + is(byteArray.toBase32String(), "11110001", "base32 encoding test (3)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("lLiI o0O1"); + is(byteArray.toBase32String(), "11110001", "base32 encoding test (3.1)"); + + byteArray = new Clipperz.ByteArray("0xffffffffff"); + is(byteArray.toBase32String(), "zzzzzzzz", "base32 encoding test (4)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("cccccccc"); + is(byteArray.toBase32String(), "cccccccc", "base32 encoding test (5)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("bbbbbbbb"); + is(byteArray.toBase32String(), "bbbbbbbb", "base32 encoding test (6)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("aAbBcCdD"); + is(byteArray.toHexString(), "0x5296b631ad", "base32 encoding test (7 hex)"); + is(byteArray.toBase32String(), "aabbccdd", "base32 encoding test (7)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("lLiIo0O1-aAbBcCdD-abcdefge-ll11ooOO"); + is(byteArray.toBase32String(), "11110001aabbccddabcdefge11110000", "base32 encoding test (8)"); + + byteArray = new Clipperz.ByteArray().appendBase32String("lLiI o0O1 - aAbB cCdD - abcd efge - ll11 ooOO"); + is(byteArray.toBase32String(), "11110001aabbccddabcdefge11110000", "base32 encoding test (8.1)"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'base32_encoding_decoding_longText_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("base32_encoding_decoding_longText_tests", someTestArgs); + deferredResult.addCallback(function() { + var longText; + var base32String; + var byteArray; + + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur interdum vulputate ligula. Aliquam erat volutpat. Fusce malesuada felis et purus. Vivamus convallis, metus id lacinia venenatis, est eros sagittis neque, at porttitor erat lorem a risus. Phasellus ultricies nunc et turpis. Ut nec sem ut quam ornare feugiat. Donec nibh. Quisque ullamcorper, neque eu convallis dictum, orci nisl dictum quam, ac elementum arcu sem varius sem. Suspendisse vitae dolor non magna suscipit semper. Suspendisse ac magna. Praesent et purus. Aenean ut justo. Curabitur dictum, nisl a consectetuer viverra, libero est auctor metus, et rhoncus risus diam in orci. Nam magna felis, lobortis eu, eleifend quis, tristique quis, mi. Praesent aliquet. Aenean mollis turpis sed dolor. Donec ac nunc. Nulla eu lacus in ipsum molestie rutrum. Nunc dignissim purus non nibh. Maecenas congue risus at neque sollicitudin eleifend.\n\nNunc purus orci, sagittis ut, vehicula non, auctor eu, orci. Fusce non nisl vel risus rutrum venenatis. Donec dapibus sodales eros. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ultrices fringilla dui. Phasellus sit amet enim in tellus rutrum dapibus. Sed blandit malesuada turpis. Ut vel orci. Curabitur id eros. Sed sodales tempus urna. Praesent et neque. Sed ultricies. Praesent risus quam, elementum eget, tincidunt ac, condimentum sit amet, urna.\n\nLorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin vel diam imperdiet felis luctus luctus. Nunc tincidunt nisl ac arcu. Sed id urna id magna nonummy varius. Mauris ligula. Vivamus purus eros, dignissim non, bibendum eget, dapibus sit amet, urna. Donec scelerisque dapibus odio. Aenean gravida ante at eros. Aenean volutpat vehicula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed elementum nisi ac dui. Fusce consectetuer venenatis nisi. Etiam diam. Nunc urna tortor, feugiat sed, facilisis eu, lacinia ut, felis. Vivamus vel lacus in massa accumsan faucibus. Cras iaculis eros. Donec non risus eu mi aliquam facilisis. Quisque vitae erat. Vivamus sed felis at metus ullamcorper ornare. Aliquam orci.\n\nPellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras ultrices, tortor in tempus laoreet, orci magna auctor quam, ultricies consequat sem eros eu magna. Mauris tempus egestas libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Curabitur auctor molestie ante. Quisque laoreet urna a quam. Sed sagittis, nulla vitae bibendum tempus, metus ante bibendum urna, ut ullamcorper mi urna vitae neque. Praesent dolor. Maecenas sit amet tortor. Proin erat. Suspendisse ipsum. Nulla facilisi. Vestibulum nonummy nulla ac libero. Aliquam in mauris ut libero cursus ullamcorper. Nam ullamcorper auctor tortor.\n\nNulla et odio. Duis nec velit. Sed posuere neque vitae dolor. Phasellus diam massa, sollicitudin vel, pellentesque in, fringilla pretium, libero. In lacinia massa ut libero pharetra sodales. Aliquam erat volutpat. Suspendisse egestas, turpis at pretium placerat, sem dolor tristique felis, nec egestas lectus risus eu quam. Curabitur leo dolor, varius sed, tristique non, fermentum eget, elit. Vivamus a leo eu diam faucibus congue. Nam quam. Curabitur est velit, luctus quis, tempor et, mattis consectetuer, dolor. Ut accumsan dui nec mi. Donec enim. Mauris accumsan nisl. Praesent sit amet diam ut velit suscipit vehicula. Vestibulum augue diam, placerat sit amet, gravida volutpat, egestas nec, metus. Curabitur risus felis, tempus nec, blandit a, condimentum at, risus."; + byteArray = new Clipperz.ByteArray(longText); + base32String = byteArray.toBase32String(); + byteArray = new Clipperz.ByteArray().appendBase32String(base32String); + is(byteArray.asString(), longText, "base32 encoding test (9)"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'error_correction_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("error_correction_tests", someTestArgs); + deferredResult.addCallback(function() { + var oddInput; + var byteArray; + + oddInput = "0x1aa22bb33cc"; + byteArray = new Clipperz.ByteArray(oddInput); + is(byteArray.toHexString(), "0x01aa22bb33cc", "fix an input hex string with on odd string length"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'zero_values_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("zero_values_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray(0, 0, 0, 0); + is(byteArray.length(), 4, "An array with 4 '0' values has length = 4"); + is(byteArray.byteAtIndex(0), 0, "The first element of a '0' filled array is '0'"); + + byteArray = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + is(byteArray.length(), 16, "An array with 16 '0' values has length = 16"); + is(byteArray.byteAtIndex(0), 0, "The first element of a '0' filled array is '0'"); + is(byteArray.byteAtIndex(15), 0, "The last element of a '0' filled array is '0'"); + is(byteArray.toHexString(), "0x00000000000000000000000000000000", "HEX representation of an array full of '0'"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'array_values_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("array_values_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var arrayValues; + + byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6"); + arrayValues = byteArray.arrayValues(); + is(arrayValues[0], parseInt("0xa1"), "the first value of arrayValues is 'a1'"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'string_contructor_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("string_contructor_tests", someTestArgs); + deferredResult.addCallback(function() { +// var longAsciiText; +// var longIsoLatin1Text; +// var longUtf8Text; + var stringConstructorTestFunction; + +// longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a."; + is(longAsciiText.length, 6000, "tThe ascii string should be 6000 char long"); + +// longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; + is(longIsoLatin1Text.length, 3000, "The Iso-Latin1 string should be 3000 char long"); + +// longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; + is(longUtf8Text.length, 2000, "tThe UTF8 string should be 2000 char long"); + + stringConstructorTestFunction = function(aTestString, aLabel) { + var byteArray; + var base64String; + var stringConstructorStartTime, stringConstructorEndTime; + var maxExpectedTime; + +stringConstructorStartTime = new Date(); + byteArray = new Clipperz.ByteArray(aTestString); +stringConstructorEndTime = new Date(); + maxExpectedTime = 30; + is(byteArray.length(), 6000, "[" + aLabel + "] The reference text should be 6000 bytes long"); + is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The construction of the byte array took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")"); +//MochiKit.Logging.logDebug("[" + aLabel + "] The construction of the byte array took " + (stringConstructorEndTime - stringConstructorStartTime)); + +stringConstructorStartTime = new Date(); + base64String = byteArray.toBase64String(); +stringConstructorEndTime = new Date(); + maxExpectedTime = 30; + is(base64String.length, 8000, "[" + aLabel + "] the base64 representation of 6000 bytes is 8000 chars long"); + is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The generation of the base64 string took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")"); +//MochiKit.Logging.logDebug("[" + aLabel + "] The generation of the base64 string took " + (stringConstructorEndTime - stringConstructorStartTime)); + +stringConstructorStartTime = new Date(); + byteArray = new Clipperz.ByteArray(); + byteArray.appendBase64String(base64String); +stringConstructorEndTime = new Date(); + maxExpectedTime = 200; + is(byteArray.length(), 6000, "[" + aLabel + "] a byte array build from a 8000 chars base64 string should contain 6000 bytes"); + is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The construction of the byte array from a base64 string took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")"); +//MochiKit.Logging.logDebug("[" + aLabel + "] The construction of the byte array from a base64 string took " + (stringConstructorEndTime - stringConstructorStartTime)); + } + + stringConstructorTestFunction(longAsciiText, "ASCII"); + stringConstructorTestFunction(longIsoLatin1Text, "ISO-Latin1"); + stringConstructorTestFunction(longUtf8Text, "UTF-8"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'bit_operations_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("bit_operations_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray(0, 255, 0, 255); + is(byteArray.bitAtIndex(0), 1, "bitAtIndex - test 1"); + is(byteArray.bitAtIndex(7), 1, "bitAtIndex - test 2"); + is(byteArray.bitAtIndex(8), 0, "bitAtIndex - test 3"); + + is(byteArray.bitBlockAtIndexWithSize(0, 4), 15, "bitBlockAtIndexWithSize - test 1"); + is(byteArray.bitBlockAtIndexWithSize(4, 4), 15, "bitBlockAtIndexWithSize - test 2"); + is(byteArray.bitBlockAtIndexWithSize(4, 6), 15, "bitBlockAtIndexWithSize - test 3"); + is(byteArray.bitBlockAtIndexWithSize(8, 4), 0, "bitBlockAtIndexWithSize - test 4"); + is(byteArray.bitBlockAtIndexWithSize(12, 4), 0, "bitBlockAtIndexWithSize - test 5"); + is(byteArray.bitBlockAtIndexWithSize(12, 5), 16, "bitBlockAtIndexWithSize - test 6"); + is(byteArray.bitBlockAtIndexWithSize(12, 6), 48, "bitBlockAtIndexWithSize - test 7"); + + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'prefixMatchingBits_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs); + deferredResult.addCallback(function() { + var value1; + var value2; + var toll; + +// toll = new Clipperz.PM.Toll(); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 256); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000008"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 252); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000080000000000000000000000000000000"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 128); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x8000000000000000000000000000000080000000000000000000000000000000"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 0); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x0100000000000000000000000000000000000000000000000000000000000000"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 7); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000001"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 255); + + value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + value2 = new Clipperz.ByteArray("0x4000000000000000000000000000000000000000000000000000000000000000"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 1); + + value1 = new Clipperz.ByteArray("0x0853120d776e04325d070c082e06390315505166740b07007f060f003e0c576f"); + value2 = new Clipperz.ByteArray("0x0853120d776e04325d070c082e06390315505166740b07007f060f003e0c576f"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 256); + + value1 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307000046"); + value2 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307004d46"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 241); + + value1 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307000046"); + value2 = new Clipperz.ByteArray("0x0a83580756011d000a620e3b60670508092f020a0a0c2500282d480307004d46"); + is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 8); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'binaryString_test': function (someTestArgs) { + var hexString; + var binaryString; + + var testBinaryString = function (anHexString, aBinaryString) { + var byteArray; + var byteArrayFromBinaryString; + + byteArray = new Clipperz.ByteArray(anHexString); + byteArrayFromBinaryString = (new Clipperz.ByteArray()).appendBinaryString(aBinaryString); + ok(byteArray.equals(byteArrayFromBinaryString), "the two byteArray have the same values"); + is(byteArray.toBinaryString(), aBinaryString, "the binaryString matches"); + }; + + hexString = "0x888990"; + binaryString = "\x88\x89\x90"; + testBinaryString(hexString, binaryString); + + hexString = "0x000102030405060708090a0b0c0d0e0f"; + binaryString = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; + testBinaryString(hexString, binaryString); + + hexString = "0x101112131415161718191a1b1c1d1e1f"; + binaryString = "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"; + testBinaryString(hexString, binaryString); + + hexString = "0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf"; + binaryString = "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"; + testBinaryString(hexString, binaryString); + + hexString = "0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef"; + binaryString = "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"; + testBinaryString(hexString, binaryString); + + hexString = "0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + binaryString = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; + testBinaryString(hexString, binaryString); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.ByteArray", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html new file mode 100644 index 0000000..93089b7 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html @@ -0,0 +1,292 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.AES_v3 - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> + +try { + var block; + var keyValue; + var key; + var encryptedBlock; + var startTime, endTime; + + startTime = new Date(); + + keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1"); + + keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2"); + + keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3"); + + keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4"); + + keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5"); + + keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6"); + + keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7"); + + keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8"); + + keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9"); + + keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f"); + encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); + is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10"); + + //------------------------------------------------------------------------- + // + // Key expansion + // + //------------------------------------------------------------------------- + // test vector: http://en.wikipedia.org/wiki/Rijndael_key_schedule#Test_vectors + + keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000012345678"); + try { + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + is(true, false, "Unsupported key size"); + } catch (exception) { + is(true, true, "Unsupported key size"); + } + + keyValue = new Clipperz.ByteArray("0x00000000000000000000000000000000"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + is( key.stretchedKey().toHexString(), + "0x" + "00000000000000000000000000000000" + + "62636363626363636263636362636363" + + "9b9898c9f9fbfbaa9b9898c9f9fbfbaa" + + "90973450696ccffaf2f457330b0fac99" + + "ee06da7b876a1581759e42b27e91ee2b" + + "7f2e2b88f8443e098dda7cbbf34b9290" + + "ec614b851425758c99ff09376ab49ba7" + + "217517873550620bacaf6b3cc61bf09b" + + "0ef903333ba9613897060a04511dfa9f" + + "b1d4d8e28a7db9da1d7bb3de4c664941" + + "b4ef5bcb3e92e21123e951cf6f8f188e", + "Stretched empty key"); + + + keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); + key = new Clipperz.Crypto.AES.Key({key:keyValue}); + is( key.stretchedKey().toHexString(), + "0x" + "00000000000000000000000000000000" + + "00000000000000000000000000000000" + + "62636363626363636263636362636363" + + "aafbfbfbaafbfbfbaafbfbfbaafbfbfb" + + "6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac" + + "7d8d8d6ad77676917d8d8d6ad7767691" + + "5354edc15e5be26d31378ea23c38810e" + + "968a81c141fcf7503c717a3aeb070cab" + + "9eaa8f28c0f16d45f1c6e3e7cdfe62e9" + + "2b312bdf6acddc8f56bca6b5bdbbaa1e" + + "6406fd52a4f79017553173f098cf1119" + + "6dbba90b0776758451cad331ec71792f" + + "e7b0e89c4347788b16760b7b8eb91a62" + + "74ed0ba1739b7e252251ad14ce20d43b" + + "10f80a1753bf729c45c979e7cb706385", + "Stretched empty key"); + + var roundIndex; + + roundIndex = 0; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(0)"); + roundIndex = 1; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(1)"); + roundIndex = 2; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x62636363626363636263636362636363", "empty key, subKeyAtRound(2)"); + roundIndex = 3; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xaafbfbfbaafbfbfbaafbfbfbaafbfbfb", "empty key, subKeyAtRound(3)"); + roundIndex = 4; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac", "empty key, subKeyAtRound(4)"); + roundIndex = 5; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x7d8d8d6ad77676917d8d8d6ad7767691", "empty key, subKeyAtRound(5)"); + roundIndex = 6; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x5354edc15e5be26d31378ea23c38810e", "empty key, subKeyAtRound(6)"); + roundIndex = 7; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x968a81c141fcf7503c717a3aeb070cab", "empty key, subKeyAtRound(7)"); + roundIndex = 8; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x9eaa8f28c0f16d45f1c6e3e7cdfe62e9", "empty key, subKeyAtRound(8)"); + roundIndex = 9; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x2b312bdf6acddc8f56bca6b5bdbbaa1e", "empty key, subKeyAtRound(9)"); + roundIndex = 10; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6406fd52a4f79017553173f098cf1119", "empty key, subKeyAtRound(10)"); + roundIndex = 11; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6dbba90b0776758451cad331ec71792f", "empty key, subKeyAtRound(11)"); + roundIndex = 12; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xe7b0e89c4347788b16760b7b8eb91a62", "empty key, subKeyAtRound(12)"); + roundIndex = 13; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x74ed0ba1739b7e252251ad14ce20d43b", "empty key, subKeyAtRound(13)"); + roundIndex = 14; + is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x10f80a1753bf729c45c979e7cb706385", "empty key, subKeyAtRound(14)"); + + + //------------------------------------------------------------------------- + // + // Encrypt / decrypt + // + //------------------------------------------------------------------------- + // Test vectors: http://www.zvon.org/tmRFC/RFC3686/Output/chapter6.html + // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html + // http://www.ietf.org/rfc/rfc3686.txt + + { + // + // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html + // + var key; + var plainText; + var cipherText; + var result; + + // + // 256-bit key size + // + + // Gladman's Test Data, 256-bit key - encrypt + key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe", 16); + plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16); + cipherText = new Clipperz.ByteArray("0x1a6e6c2c662e7da6501ffb62bc9e93f3", 16); + + result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); + is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 256-bit key - encrypt"); + + // AES Specification Test Data, 256-bit key - encrypt + key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16); + plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16); + cipherText = new Clipperz.ByteArray("0x8ea2b7ca516745bfeafc49904b496089", 16); + + result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); + is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 256-bit key - encrypt"); + + // + // 128-bit key size + // + + // Gladman's Test Data, 128-bit key - encrypt + key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c", 16); + plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16); + cipherText = new Clipperz.ByteArray("0x3925841d02dc09fbdc118597196a0b32", 16); + + result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); + is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 128-bit key - encrypt"); + + // AES Specification Test Data, 128-bit key - encrypt + key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f", 16); + plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16); + cipherText = new Clipperz.ByteArray("0x69c4e0d86a7b0430d8cdb78070b4c55a", 16); + + result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); + is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 128-bit key - encrypt"); + + } + + + endTime = new Date(); + MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime)); + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html new file mode 100644 index 0000000..0d1cf07 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html @@ -0,0 +1,344 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.AES_performance - TEST</title> + + <script> + jslog_config_enabled = true; + </script> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +try { + + var password; + var plainText; + var encryptedText; + var decryptedText; +/* + password = "trustno1"; + plainText = "The quick brown fox jumps over the lazy dog"; +//console.profile("encrypt"); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); +//console.profileEnd(); +//console.profile("decrypt"); + decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); +//console.profileEnd(); + is(decryptedText, plainText, "simple string encrypted/decrypted"); +*/ + + password = "L7bd9fQMhborMbYcHtlr"; + plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}}; +/* */ + plainText = { + "records": { + "1": { + "label":"imap4all [no]", + "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", + "notes":"" + }, + "2": { + "label":"Il manifesto", + "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", + "notes":"" + }, + "3": { + "label": "OmniGroup applications", + "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", + "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:" + }, + "4": { + "label": "R@cine", + "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", + "notes": "" + }, + "5": { + "label": "NewsGator", + "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", + "notes": "" + }, + "6": { + "label": "GMail - giulio.cesare", + "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", + "notes": "" + }, + "7": { + "label": "GMail - clipperz.com", + "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", + "notes": "" + }, + "8": { + "label": "Aruba - hosting", + "key": "5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", + "notes": "" + }, + "9": { + "label": "Aruba - sql hosting", + "key": "f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", + "notes": "" + }, + "10": { + "label": "Amazon", + "key": "1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", + "notes": "" + }, + "11": { + "label": "YouTube [no]", + "key": "4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", + "notes": "" + }, + "12": { + "label": "DynDns - gcsolaroli", + "key": "f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", + "notes": "" + }, + "13": { + "label": "DynDns - clipperz", + "key": "d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", + "notes": "" + }, + "14": { + "label": "Bol.it", + "key": "cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", + "notes": "" + }, + "15": { + "label": "Freenigma - clipperz.com", + "key": "f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", + "notes": "" + }, + "16": { + "label": "Freenigma", + "key": "4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", + "notes": "" + }, + "17": { + "label": "clipperz.com - blog", + "key": "9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", + "notes": "" + }, + "18": { + "label": "Apple", + "key": "75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", + "notes": "" + }, + "19": { + "label": ".mac", + "key": "5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", + "notes": "" + }, + "20": { + "label": "3nity", + "key": "33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", + "notes": "" + }, + "21": { + "label": "ACM", + "key": "b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", + "notes": "" + }, + "22": { + "label": "Adobe", + "key": "d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", + "notes": "" + }, + "23": { + "label": "Adobe Photoshop Elements 3", + "key": "18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", + "notes": "Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837" + }, + "24": { + "label": "Agatra", + "key": "c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", + "notes": "" + }, + "25": { + "label": "AIM", + "key": "8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", + "notes": "" + }, + "26": { + "label": "Anna Vespignani", + "key": "79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", + "notes": "" + }, + "27": { + "label": "Bloglines", + "key": "fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", + "notes": "" + }, + "28": { + "label": "Bow.it", + "key": "64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", + "notes": "" + }, + "29": { + "label": "GMail - feedback", + "key": "fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", + "notes": "" + }, + "30": { + "label": "Fineco", + "key": "8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", + "notes": "" + }, + "31": { + "label": "mon.itor.us", + "key": "d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", + "notes": "" + }, + "32": { + "label": "Lamba Probe - forum", + "key": "f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", + "notes": "" + }, + "33": { + "label": "MeasureMap", + "key": "2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", + "notes": "" + }, + "34": { + "label": "NGI - Squillo", + "key": "96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", + "notes": "" + }, + "35": { + "label": "NGI - F5", + "key": "00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", + "notes": "" + }, + "36": { + "label": "CVSdude", + "key": "ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", + "notes": "" + }, + "37": { + "label": "Yahoo", + "key": "6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", + "notes": "note" + } + }, + "directLogins": { + "1": { "record": "1", "label": "R@cine - WebMail", "favicon": "http://www.racine.ra.it/favicon.ico" }, + "2": { "record": "2", "label": "Amazon sign in", "favicon": "http://www.amazon.com/favicon.ico" }, + "3": { "record": "3", "label": "Aruba - hosting", "favicon": "http://hosting.aruba.it/favicon.ico" }, + "4": { "record": "4", "label": "Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico" }, + "5": { "record": "5", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico" }, + "6": { "record":"6", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico" }, + "7": { "record":"7", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico" }, + "8":{"record":"8", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico" }, + "9":{"record":"9", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico" }, + "10":{"record":"10", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico" }, + "11":{"record":"12", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico" }, + "13":{"record":"13", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico" }, + "14":{"record":"14", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico" }, + "15":{"record":"15", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico" }, + "16":{"record":"16", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico" }, + "17":{"record":"17", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico" }, + "18":{"record":"18", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico" }, + "19":{"record":"19", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico" }, + "20":{"record":"20", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico" }, + "21":{"record":"21", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico" }, + "22":{"record":"22", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico" }, + "23":{"record":"23", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico" }, + "24":{"record":"24", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico" }, + "25":{"record":"25", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico" }, + "26":{"record":"26", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico" }, + "27":{"record":"27", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico" }, + "28":{"record":"28", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico" }, + "29":{"record":"29", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico" }, + "30":{"record":"30", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"} + }, + "preferences":{"preferredLanguage":"en-US"} + } +/* */ + +//console.profile("encrypt 0.2"); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); +//console.profileEnd(); +//console.profile("decrypt"); +// decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); +//console.profileEnd(); +// is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted"); + +//console.profile("encrypt 0.3"); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(password, plainText); +//console.profileEnd(); + decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(password, encryptedText); + is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted"); + + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html new file mode 100644 index 0000000..86fc49a --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html @@ -0,0 +1,428 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + var secretKey; + var publicKey; + var plainString; + var encryptedString; + + + secretKey = "s3cr37k39"; + plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; + encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); + + //------------------------------------------------------------------------- + // + // Secret key encryption / decryption + // + is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty"); + is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); + + try { + var decryptedText; + + decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString); + ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" ); + } catch (e) { + ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" ); + } + + is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values"); + + secretKey = "trustno1"; + plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1"; + encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); + is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); + + secretKey = "trustno1"; + plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."; + encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); + is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); + + secretKey = "trustno1"; + plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est"; + encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); + is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); + +// secretKey = "trustno1"; +// plainString = "{}"; +// plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}} "; +// plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}"; +// encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); +// is(encryptedString, "{}", "encrypted value"); + + +// secretKey = "trustno1"; +// encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca"; +// plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString); +// is(plainString, "{}", "decrypted value"); + + //------------------------------------------------------------------------- + // + // Java secret key encryption / JavaScript decryption + // + secretKey = "s3cr37k39"; + plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; + encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8"; + is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); + + //------------------------------------------------------------------------- + // + // Public key encryption -> Private key decryption + // + { + var cleanKey; + var t1, t2; +/* + // + // 128 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039"; // a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "202700adbd85e2d7182720c3a0ee19c1", + "30db31542ace0f7d37a629ee5eba28cb" + ); + encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 128"); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 128"); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 128"); +*/ +/* + // + // 256 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9", + "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3" + ); + encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 256"); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 256"); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 256"); +*/ +/* + // + // 512 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1", + "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); +t2 = new Date().getTime(); +//is("Encrypting with public key (512)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 512"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 512"); +t2 = new Date().getTime(); +//is("Decrypting with private key (512)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 512"); +*/ +/* + // + // 1024 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751", + "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); +t2 = new Date().getTime(); +is("Encrypting with public key (1024)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 1024"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 1024"); +t2 = new Date().getTime(); +is("Decrypting with private key (1024)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 1024"); +*/ +/* + // + // 2048 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1", + "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); +t2 = new Date().getTime(); +is("Encrypting with public key (2048)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 2048"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 2048"); +t2 = new Date().getTime(); +is("Decrypting with private key (2048)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 2048"); +*/ + } + + //------------------------------------------------------------------------- + // + // Private key encryption -> Public key decryption + // + { + var cleanKey; + var t1, t2; +/* + // + // 128 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039"; // a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "202700adbd85e2d7182720c3a0ee19c1", + "30db31542ace0f7d37a629ee5eba28cb" + ); + encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 128"); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 128"); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 128"); +*/ +/* + // + // 256 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9", + "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3" + ); + encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 256"); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 256"); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 256"); +*/ +/* + // + // 512 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1", + "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); +t2 = new Date().getTime(); +//is("Encrypting with private key (512)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 512"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 512"); +t2 = new Date().getTime(); +//is("Decrypting with public key (512)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 512"); +*/ +/* + // + // 1024 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751", + "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); +t2 = new Date().getTime(); +is("Encrypting with private key (1024)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 1024"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 1024"); +t2 = new Date().getTime(); +is("Decrypting with public key (1024)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 1024"); +*/ +/* + // + // 2048 + // + cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + publicKey = Clipperz.Crypto.Base.publicKeyWithValues( + "10001", + "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1", + "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623" + ); +t1 = new Date().getTime(); + encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); +t2 = new Date().getTime(); +is("Encrypting with private key (2048)", (t2 - t1)); + + is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 2048"); +t1 = new Date().getTime(); + is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 2048"); +t2 = new Date().getTime(); +is("Decrypting with public key (2048)", (t2 - t1)); + isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 2048"); +*/ + } + + var originalMessage; + var processedMessage; + var expectedResult; + + //------------------------------------------------------------------------- + // + // Hash SHA-256 + // + + originalMessage = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + expectedResult = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = ""; + expectedResult = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "abc"; + expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "message digest"; + expectedResult = "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "secure hash algorithm"; + expectedResult = "f30ceb2bb2829e79e4ca9753d35a8ecc00262d164cc077080295381cbd643f0d"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "SHA256 is considered to be safe"; + expectedResult = "6819d915c73f4d1e77e4e1b52d1fa0f9cf9beaead3939f15874bd988e2a23630"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "For this sample, this 63-byte string will be used as input data"; + expectedResult = "f08a78cbbaee082b052ae0708f32fa1e50c5c421aa772ba5dbb406a2ea6be342"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "This is exactly 64 bytes long, not counting the terminating byte"; + expectedResult = "ab64eff7e88e2e46165e29f2bce41826bd4c7b3552f6b382a9e7d3af47c245f8"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + originalMessage = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut urna diam, vulputate quis, tempus vel, pretium in, mauris. Mauris aliquet sem a elit. Nunc molestie rutrum sem."; + expectedResult = "528059709af4087fb8cd4427e291d89f24d8c0429b2a3b6fd152c32ce5b4680f"; + processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + //------------------------------------------------------------------------- + // + // Hash MD5 + // + originalMessage = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da9"; + expectedResult = "fde790d7da7d0d54a8db4ac500f1bbdb"; + processedMessage = Clipperz.Crypto.Base.computeMD5HashValue(originalMessage); + is(processedMessage, expectedResult, ""); + + + + + //------------------------------------------------------------------------- + // + // Random seed + // + var randomSeed; + + randomSeed = Clipperz.Crypto.Base.generateRandomSeed(); + is(randomSeed.length, 64, ""); + + ok(randomSeed != Clipperz.Crypto.Base.generateRandomSeed(), ""); + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html new file mode 100644 index 0000000..bdb0cbc --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html @@ -0,0 +1,478 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + var bigInt_1; + var bigInt_2; + var result; + var expectedResult; + + // + // Constructur and equality test + // + bigInt_1 = new Clipperz.Crypto.BigInt("110"); + is (bigInt_1.equals(bigInt_1), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("110"); + bigInt_2 = new Clipperz.Crypto.BigInt("110", 10); + is (bigInt_1.equals(bigInt_2), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("110"); + bigInt_2 = new Clipperz.Crypto.BigInt(110); + is (bigInt_1.equals(bigInt_2), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt(6); + bigInt_2 = new Clipperz.Crypto.BigInt("110", 2); + is (bigInt_1.equals(bigInt_2), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt(6); + bigInt_2 = new Clipperz.Crypto.BigInt("110", 3); + is (bigInt_1.equals(bigInt_2), false, ""); + + + // + // Addition test + // + bigInt_1 = new Clipperz.Crypto.BigInt(6); + bigInt_2 = new Clipperz.Crypto.BigInt(110); + result = bigInt_1.add(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt(116); + is (result.equals(expectedResult), true, ""); + is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function"); + + bigInt_1 = new Clipperz.Crypto.BigInt(6); + result = bigInt_1.add(6); + expectedResult = new Clipperz.Crypto.BigInt(12); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); + bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); + result = bigInt_1.add(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585"); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); + bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); + result = bigInt_1.add(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585"); + is (result.equals(expectedResult), false, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161"); + bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); + result = bigInt_1.add(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585"); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt( "6541652165410321654063516540621063540654" + + "0654065106540654165416521654103216540635" + + "1654062106354065406540651065406541"); + bigInt_2 = new Clipperz.Crypto.BigInt( "3046540351035403510354035103510351351351" + + "0351350435103213540634132135401351035403" + + "5403540354103540"); + result = bigInt_1.add(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt( "6541652165410321657110056891656467051008" + + "1005100210054167675767872089206430081269" + + "2975416119864419441944191419510081"); + is (result.equals(expectedResult), true, ""); + + + // + // Moltiplication test + // + bigInt_1 = new Clipperz.Crypto.BigInt(6); + bigInt_2 = new Clipperz.Crypto.BigInt(110); + result = bigInt_1.multiply(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt(660); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt(6); + result = bigInt_1.multiply(5); + expectedResult = new Clipperz.Crypto.BigInt(30); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt( "5465465165465465132743540354354032135463" + + "5435135403513516843052413543054035"); + bigInt_2 = new Clipperz.Crypto.BigInt( "3543513543543213543032135435413054365430" + + "5130513540351354354305435403"); + result = bigInt_1.multiply(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt( "1936694983559052629352223965314822970014" + + "6364423657014976098029153153101751605574" + + "5077086464435601381095664357540911830059" + + "9503335163757031001105"); + is (result.equals(expectedResult), true, ""); + + // + // Module test + // + bigInt_1 = new Clipperz.Crypto.BigInt(106); + bigInt_2 = new Clipperz.Crypto.BigInt(10); + result = bigInt_1.module(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt(6); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt(106); + result = bigInt_1.module(10); + expectedResult = new Clipperz.Crypto.BigInt(6); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt( "5465465465468468465468463541358438543513" + + "8543135435135423545624354235123512531235" + + "1356463543840351351305135435121354305413" + + "543"); + + + bigInt_2 = new Clipperz.Crypto.BigInt( "3543543213543213540543545463542354385768" + + "512584354354215"); + result = bigInt_1.module(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt("52689987206612998786765715819079250963638640081836513"); + is (result.equals(expectedResult), true, ""); + + // + // Power (Module) test + // + bigInt_1 = new Clipperz.Crypto.BigInt(6); + bigInt_2 = new Clipperz.Crypto.BigInt(3); + result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt(1000)); + expectedResult = new Clipperz.Crypto.BigInt(216); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt(6); + result = bigInt_1.powerModule(3, 1000); + expectedResult = new Clipperz.Crypto.BigInt(216); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("354354354354687638546846846846846576876468746846846846"); + bigInt_2 = new Clipperz.Crypto.BigInt("354"); + result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt("3543541354354354354354351354354351354354354354354354")); + expectedResult = new Clipperz.Crypto.BigInt("1957028940698171231089373321334263118681605242465644"); + is (result.equals(expectedResult), true, ""); + + bigInt_1 = new Clipperz.Crypto.BigInt("e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", 16); +// is(bigInt_1.toString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "IE bug"); + is(bigInt_1.asString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "fix for IE bug"); + + + bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + is(bigInt_1.asString(16, 64), "000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "fix to ensure the string representation has a minimum fixed length"); + +/* + // + // Comparison + // + bigInt_1 = new Clipperz.Crypto.BigInt("0", 10); + bigInt_2 = new Clipperz.Crypto.BigInt("0", 10); + is (bigInt_1.equals(bigInt_2), true, "bigInt(0) = bigInt(0)"); + is (bigInt_1.equals(0), true, "bigInt(0) = 0"); + + bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + is (bigInt_1.equals(bigInt_2), false, "bigInt(xxxxxx) != bigInt(0)"); + is (bigInt_1.equals(0), false, "bigInt(xxxxx) != 0"); + + bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("0", 16); + is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(0)"); + is(bigInt_2.compare(bigInt_1), -1, "bigInt(0) < bigInt(xxxx)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("05", 16); + is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(05)"); + is(bigInt_2.compare(bigInt_1), -1, "bigInt(05) < bigInt(xxxx)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("-10", 10); + bigInt_2 = new Clipperz.Crypto.BigInt("10", 10); + is(bigInt_1.equals(bigInt_2), true, "bigInt(-10) - bigInt(10). No negative number are managed"); + + // + // XOR + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = bigInt_1.xor(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt(0); + is(result.asString(16), expectedResult.asString(16), "a xor a = 0"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16); + result = bigInt_1.xor(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt('295147905179352825856'); + is(result.asString(16), expectedResult.asString(16), "single bit difference"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("01", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16); + result = bigInt_1.xor(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt('102987336249554097029535212322581322789799900648198034993674544906295017912404'); + is(result.asString(16), expectedResult.asString(16), "01 xor value"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = bigInt_1.xor(bigInt_2); + expectedResult = new Clipperz.Crypto.BigInt('7237005577332262213973186563042994240829374041602535252466099000494570602496'); + is(result.asString(16), expectedResult.asString(16), "first bit difference xor"); + + + // + // isBitSet + // + bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); + result = bigInt_1.isBitSet(1); + expectedResult = true; + is(result, expectedResult, "'ff'.isBitSet(1)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); + result = bigInt_1.isBitSet(1); + expectedResult = false; + is(result, expectedResult, "'f0'.isBitSet(1)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); + result = bigInt_1.isBitSet(3); + expectedResult = false; + is(result, expectedResult, "'f0'.isBitSet(3)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); + result = bigInt_1.isBitSet(4); + expectedResult = true; + is(result, expectedResult, "'f0'.isBitSet(4)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16); + result = bigInt_1.isBitSet(7); + expectedResult = false; + is(result, expectedResult, "'ff00'.isBitSet(7)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16); + result = bigInt_1.isBitSet(8); + expectedResult = true; + is(result, expectedResult, "'ff00'.isBitSet(8)"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("05000000000000", 16); + result = bigInt_1.isBitSet(47); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(47)"); + + result = bigInt_1.isBitSet(48); + expectedResult = true; + is(result, expectedResult, "'05000000000000'.isBitSet(48)"); + + result = bigInt_1.isBitSet(49); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(49)"); + + result = bigInt_1.isBitSet(50); + expectedResult = true; + is(result, expectedResult, "'05000000000000'.isBitSet(50)"); + + result = bigInt_1.isBitSet(51); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(51)"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + + result = bigInt_1.isBitSet(52); + expectedResult = true; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)"); + + result = bigInt_1.isBitSet(53); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)"); + + result = bigInt_1.isBitSet(54); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)"); + + result = bigInt_1.isBitSet(55); + expectedResult = true; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)"); + + result = bigInt_1.isBitSet(56); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)"); + + result = bigInt_1.isBitSet(57); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)"); + + result = bigInt_1.isBitSet(58); + expectedResult = true; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)"); + + result = bigInt_1.isBitSet(59); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)"); + + result = bigInt_1.isBitSet(60); + expectedResult = false; + is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)"); + + // + // shiftLeft + // + bigInt_1 = new Clipperz.Crypto.BigInt("7f", 16); + result = bigInt_1.shiftLeft(1); + expectedResult = new Clipperz.Crypto.BigInt('fe', 16); + is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); + result = bigInt_1.shiftLeft(1); + expectedResult = new Clipperz.Crypto.BigInt('01fe', 16); + is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = bigInt_1.shiftLeft(2); + expectedResult = new Clipperz.Crypto.BigInt('411949344998216388118140849290325291159199602592792139973517588004462660346196', 10); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = bigInt_1.shiftLeft(8); + expectedResult = new Clipperz.Crypto.BigInt('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(8)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = bigInt_1.shiftLeft(10); + expectedResult = new Clipperz.Crypto.BigInt('105459032319543395358244057418323274536755098263754787833220502529142441048626176', 10); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); + result = bigInt_1.shiftLeft(4096); + expectedResult = new Clipperz.Crypto.BigInt('266319164760353889206396941232739217557890883507082863997979538237408246532747151496450837043424377376926977212182012023686831226737377369852125202402098145876219029018646049576792205484267848170179157853023266287725961304046416750146445344507869587461686016719979944538177432428730245324189334334817497396705169439104855885416460935698516539852892760625369984672271807592980051379072961966267124963131928067770749329011150668180796667192392027523071601150548205543997146350727148885425131890513407882508735446345822174200042918879518190588482963417582471561436215675823872015307629566605147920139961896995509627341070659007877630760561618021922340198636222738900413041589858099507891702174848695380017286939422770656819923801325579542295611580916900945707539132241939193098989585491346846486694653352501301851631933610655701026861715541355665900384634131852357081890301147104554877895768806174478161952060916705243614916310627428392386264214492834954273769685672081818149530274447979003153864646452529328518204716201193108795473912970645455457215455929896570875795325190705652768977680951535622436287312272907838194995042100153360373621439300266297151905265332115434133380301670205335338558744799343198526203012170200626802804318535680', 10); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); + + bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); + result = bigInt_1.shiftLeft(5000); + expectedResult = new Clipperz.Crypto.BigInt('36017909319555363939297846508911757008556852467205798478749046189356513330989041570231272721076143922520578818149998351104871978707844731275672652360293180474918203352225676748028889909508585302690242044220987556901043359920075229167479636668489487021705618421769517884399224788393498408327257966673365451264730932480701037648195190724361287852846952667257156204462064385766889505990099642052739974651257588866645027017486311782036674195285521311468922365736517586569614071211079825802088151607502649165228246449902253708785396560087430392277977851200155957347440614508171640900912431375050142178348130480158080696562512167652410483775588091117019722112093545783277082149415339867358805673644654236371762589715111732737686904860620316822561292797144756685380676343141118415434643259498221414744450502163805872581378284735047416230112208369784803081434462030568662742790926051825877463257023387907801068796855629691810029349692983890802136654401365294584656484852908751516361546884362396124203127393434938355516740711953765305060269622960662047729516459906444429108776596594293559927265789943280929098971285454533928986078946124455350540187565506016643147748500262510780357259199808936108629893209819473029835119866186316144675107047007737043503194737001430981972314376700993832503282107582239603281145093446879837002884732470988727066207277180181469885503549870618810897831820650576980763622189213611885522245978572420535750015505830146119605502167931087454823309031494727688701857532561113118183883936890880', 10); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); + + + // + // BigInt compare vs ByteArray compare + // + var bigInt_byteArray_1; + var bigInt_byteArray_2; + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "equal compare"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "second term with one more bit at the leftmost - compare"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "first term with one more bit at the leftmost - compare"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "first term with one more bit in the middle - compare"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "first term with one more bit in the middle - compare"); + + // + bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + bigInt_2 = new Clipperz.Crypto.BigInt("05", 16); + bitInt_byteArray_1 = bigInt_1.asByteArray(); + bitInt_byteArray_2 = bigInt_2.asByteArray(); + + result = bigInt_1.compare(bigInt_2); + expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); + is(result, expectedResult, "equal compare"); +*/ + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html new file mode 100644 index 0000000..ba98167 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html @@ -0,0 +1,155 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> +<!-- - -> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> +<!- - --> +<!-- --> + <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> +<!-- --> + +<!-- - -> + <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> +<!- - --> + + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + +<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + + var deferredResult; + + + deferredResult = new MochiKit.Async.Deferred(); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); + + // + // ECC.Curve.multiplication + // + var curve; + var f2m; + var f2m_improved; + var value; + var moduledValue; + var result; + var result_improved; + var expectedResul; + + f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) + f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); + + curve = Clipperz.Crypto.ECC.StandardCurves.B283(); + +/** / + value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16); + result = curve.multiply(value, curve.G()); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) + }); + is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); + is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); +/ **/ + + value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); + +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); +// deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value'); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); + deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); +// deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); + deferredResult.addCallback(function(res) { + var expectedResult; + + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16) + }); + + is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); + is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); + }) +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;}); + deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;}); + deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(res); return res;}); + deferredResult.callback(); + + SimpleTest.waitForExplicitFinish(); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html new file mode 100644 index 0000000..3d7efaa --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html @@ -0,0 +1,209 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + // + // ECC.BinaryFiniteField + // + var f2m; + var f2m_improved; + var a, a1, b; + var result; + var result_improved; + var expectedResul; + + f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) + f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); + a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16); + b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16); + + // + // addition + // + result = f2m.add(a, b); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); + + + // + // negation + // + result = f2m.negate(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); + + + // + // multiplication + // + result = f2m.multiply(a, b); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); + + + // + // fast multiplication + // + result = f2m.fastMultiply(a, b); + expectedResult = f2m.multiply(a, b); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); + b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); + result = f2m.fastMultiply(a, b); + expectedResult = f2m.multiply(a, b); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply"); + + // + // square + // + a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + + // + // inverse + // + a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); + result = f2m.inverse(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("3812fc574f3728c60384e141c0e2a808e21adec22dcd407b9e25dd13c6d1bf22defd84a", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse"); + + + // + // module + // + + a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved)"); + is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods"); + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("15e2097d116e745ac47480807cb5eb99dad902728aaf5692241063bc70a5b372dbce798", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (2)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (2)"); + is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (2)"); + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("40f04cec8fe9caedf82adeff7e1aa06dcb9d08e097db8be2ad54b2ddc2e752152395623", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (3)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (3)"); + is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (3)"); + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); + is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value as expected (4)") + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (4)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (4)"); + is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (4)"); + is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (4)"); + + is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by standard method (4)") + is(a1.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by improved method (4)") + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("2f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); + result_improved = f2m_improved.module(a); + result = f2m.module(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (5)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (5)"); + is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (5)"); + is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (5)"); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html new file mode 100644 index 0000000..6bddb26 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html @@ -0,0 +1,183 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + // + // ECC.BinaryFiniteField + // + var f2m; + var f2m_improved; + var a, b; + var result; + var result_improved; + var expectedResul; + + f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)}) + f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField(); + a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16); + b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16); + + // + // addition + // + result = f2m.add(a, b); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); + + + // + // negation + // + result = f2m.negate(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); + + + // + // multiplication + // + result = f2m.multiply(a, b); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); + + + // + // fast multiplication + // + result = f2m.fastMultiply(a, b); + expectedResult = f2m.multiply(a, b); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); + b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + result = f2m.fastMultiply(a, b); + expectedResult = f2m.multiply(a, b); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); + + // + // square + // + a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + result = f2m.square(a); + expectedResult = f2m.multiply(a, a); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); + + + // + // inverse + // + a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + result = f2m.inverse(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1f898c60983c4e807e619b9cbe528585fc33aaae419d5e5cb2107269ccdcf21d5ad5b5d78d37fa435a0d0a8a75f2506240c325c6a2eee1a03008f9e1b9c6c0a511b730cdaf9b97e", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse"); + + + // + // module + // + + a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved)"); +// is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods"); + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); + a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1704018ce75dc462a5ccd1eb18b8002ecb8536c616ec625f440f6888f8c32387e53a5cb3b6050688e9b64a32215a385ee98c518d6a484d5ac0ceeafa825743c84b075bdfabc341b", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)"); + is(a.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)"); + is(a1.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)"); + + + a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + result = f2m.module(a); + result_improved = f2m_improved.module(a); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("e160dd4a436e63877e1343d06576beaa66e06863ffe4335be38d6a37460a62d11133584a5bc6ac0590e18942e1fa88bb64a4d9fc6c1fd7b55d7e57b50b70a9e7cb2ed904ad77f4", 16); + is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)"); + is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)"); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html new file mode 100644 index 0000000..885bcc4 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html @@ -0,0 +1,496 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + var value_1; + var value_2; + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16); + is(value_1.asString(16), "0a"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16); + is(value_1.asString(16), "ffff"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16); + is(value_1.asString(16), "7fff"); + + is(parseInt("ffff", 16), 65535); + is(parseInt("ffffff", 16), 16777215); + is(parseInt("ffffffff", 16), 4294967295); + is(parseInt("ffffffffff", 16), 1099511627775); + is(parseInt("ffffffffffff", 16), 281474976710655); + is(parseInt("ffffffffffffff", 16), 72057594037927940); + is(parseInt("ffffffffffffffff", 16), 18446744073709552000); + is(parseInt("10000000000000000", 16), 18446744073709552001); + is(parseInt("10000000000000001", 16), 18446744073709552002); + is(parseInt("10000000000000009", 16), 18446744073709552010); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method"); + +// 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1 + is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]"); + is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]"); + is(value_1.value()[2], parseInt("150936df", 16), "word[2]"); + is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]"); + is(value_1.value()[4], parseInt("01045434", 16), "word[4]"); + is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]"); + is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]"); + is(value_1.value()[7], parseInt("000108cb", 16), "word[7]"); + + is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); + is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17"); + is(value_1.value()[0], parseInt("00000000", 16), "word[0]"); + is(value_1.value()[1], parseInt("00000000", 16), "word[1]"); + is(value_1.value()[2], parseInt("10", 16), "word[2]"); + is(value_1.asString(16), "100000000000000000", "2^17 asString(16)"); + + // + // XOR + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); + is(result.asString(16), expectedResult.asString(16), "a xor a = 0"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); + is(result.asString(16), expectedResult.asString(16), "single bit difference"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16); + is(result.asString(16), expectedResult.asString(16), "01 xor value"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('1000000000000000000000000000000000000000000000000000000000000000', 16); + is(result.asString(16), expectedResult.asString(16), "first bit difference xor"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('84a2c58a', 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('38925faf', 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('bc309a25', 16); + is(result.asString(16), expectedResult.asString(16), "84a2c58a XOR 38925faf = bc309a25"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); + result = value_1.xor(value_2); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0052e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d', 16); + is(result.asString(16), expectedResult.asString(16), "xor"); + + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("01ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f816429a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize())); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + is(result.asString(16), expectedResult.asString(16), "xor"); + is(result.bitSize(), 1120, "xor.bitSize"); + is(result.wordSize(), 35, "result wordSize"); + is(expectedResult.bitSize(), 1120, "xor.bitSize"); + is(expectedResult.wordSize(), 35, "expectedResult wordSize"); + is(result.compare(expectedResult), 0, "compare"); + + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize())); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + is(result.asString(16), expectedResult.asString(16), "xor"); + is(result.bitSize(), 1119, "xor.bitSize"); + is(expectedResult.bitSize(), 1119, "xor.bitSize"); + is(result.compare(expectedResult), 0, "compare"); +// value_1 = +// value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 16); + + + value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 01010101 00000000", 16)).value(); + value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010", 16)).value(); + result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2)); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("01010101 00000000", 16); + is(result.asString(16), expectedResult.asString(16), "xor with offset 2"); + + value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value(" 10101010 01010101 00000000", 16)).value(); + value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 10101010", 16)).value(); + result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2)); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("10101010 00000000 01010101 00000000", 16); + is(result.asString(16), expectedResult.asString(16), "xor with offset 2 (2)"); + + // + // isZero + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); + is(value_1.isZero(), true, "0.isZero() == true"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); + is(value_1.isZero(), false, "1.isZero() == false"); + + // + // Comparison + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); + is (value_1.compare(value_2), 0, "BinaryField.value(0) = BinaryField.value(0)"); +// is (value_1.compare(0), 0, "BinaryField.value(0) = 0"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + is (value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) != BinaryField.value(0)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); + is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(0)"); + is(value_2.compare(value_1), -1, "BinaryField.value(0) < BinaryField.value(xxxx)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16); + is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(05)"); + is(value_2.compare(value_1), -1, "BinaryField.value(05) < BinaryField.value(xxxx)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("-10", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16); + is(value_1.compare(value_2), -1, "BinaryField.value(-10) - BinaryField.value(10). No negative number are managed"); + + // + // more comparison + // + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = value_1.compare(value_2); + is(result, 0, "equal compare"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16); + result = value_1.compare(value_2); + is(result, -1, "second term with one more bit at the leftmost - compare (1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16); + result = value_1.compare(value_2); + is(result, -1, "second term with one more bit at the leftmost - compare (2)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8", 16); + result = value_1.compare(value_2); + is(result, -1, "second term with one more bit at the leftmost - compare (3)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); + result = value_1.compare(value_2); + is(result, -1, "second term with one more bit at the leftmost - compare (n)"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16); + result = value_1.compare(value_2); + is(result, 1, "first term with one more bit at the leftmost - compare (1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16); + result = value_1.compare(value_2); + is(result, 1, "first term with one more bit at the leftmost - compare (2)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); + result = value_1.compare(value_2); + is(result, 1, "first term with one more bit at the leftmost - compare (n)"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = value_1.compare(value_2); + is(result, 1, "first term with one more bit in the middle - compare"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16); + result = value_1.compare(value_2); + is(result, 1, "first term with one more bit in the middle - compare"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16); + result = value_1.compare(value_2); + is(result, 1, "equal compare"); + + + + // + // isBitSet + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + result = value_1.isBitSet(1); + expectedResult = true; + is(result, expectedResult, "'ff'.isBitSet(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); + result =value_1.isBitSet(1); + expectedResult = false; + is(result, expectedResult, "'f0'.isBitSet(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); + result = value_1.isBitSet(3); + expectedResult = false; + is(result, expectedResult, "'f0'.isBitSet(3)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); + result = value_1.isBitSet(4); + expectedResult = true; + is(result, expectedResult, "'f0'.isBitSet(4)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16); + result = value_1.isBitSet(7); + expectedResult = false; + is(result, expectedResult, "'ff00'.isBitSet(7)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16); + result = value_1.isBitSet(8); + expectedResult = true; + is(result, expectedResult, "'ff00'.isBitSet(8)"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("05000000000000", 16); + result = value_1.isBitSet(47); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(47)"); + + result = value_1.isBitSet(48); + expectedResult = true; + is(result, expectedResult, "'05000000000000'.isBitSet(48)"); + + result = value_1.isBitSet(49); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(49)"); + + result = value_1.isBitSet(50); + expectedResult = true; + is(result, expectedResult, "'05000000000000'.isBitSet(50)"); + + result = value_1.isBitSet(51); + expectedResult = false; + is(result, expectedResult, "'05000000000000'.isBitSet(51)"); + + // + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + + result = value_1.isBitSet(52); + is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)"); + + result = value_1.isBitSet(53); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)"); + + result = value_1.isBitSet(54); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)"); + + result = value_1.isBitSet(55); + is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)"); + + result = value_1.isBitSet(56); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)"); + + result = value_1.isBitSet(57); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)"); + + result = value_1.isBitSet(58); + is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)"); + + result = value_1.isBitSet(59); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)"); + + result = value_1.isBitSet(60); + is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)"); + + + // + // shiftLeft + // + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7f", 16); + result = value_1.shiftLeft(1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('fe', 16); + is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + result = value_1.shiftLeft(1); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('01fe', 16); + is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffff', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ffff00', 16); + result = value_1.shiftLeft(8); + is(result.asString(16), expectedResult.asString(16), "ffff.shiftLeft(8)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( '80000000', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('1 00000000', 16); + result = value_1.shiftLeft(1); + is(result.compare(expectedResult) == 0, true, '8000000.shiftLeft(1).compare'); + is(result.asString(16), expectedResult.asString(16), "80000000.shiftLeft(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('20000000', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16); + result = value_1.shiftLeft(1); + is(result.compare(expectedResult) == 0, true, '2000000.shiftLeft(1).compare'); + is(result.asString(16), expectedResult.asString(16), "20000000.shiftLeft(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('80000000', 16); + result = value_1.shiftLeft(1); + is(result.compare(expectedResult) == 0, true, '4000000.shiftLeft(1).compare'); + is(result.asString(16), expectedResult.asString(16), "40000000.shiftLeft(1)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ff7fffff', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff 7fffff00', 16); + result = value_1.shiftLeft(8); + is(result.asString(16), expectedResult.asString(16), "ff7fffff.shiftLeft(8)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffffffff', 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff ffffff00', 16); + result = value_1.shiftLeft(8); + is(result.asString(16), expectedResult.asString(16), "ffffffff.shiftLeft(8)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( "e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('3 8ec3110a 63f07052 6befd322 65bee490 9eb90791 926e4d32 9256646d e14ae154', 16); + result = value_1.shiftLeft(2); + is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(10)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = value_1.shiftLeft(8); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16); + is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(8)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = value_1.shiftLeft(10); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('38e c3110a63 f070526b efd32265 bee4909e b9079192 6e4d3292 56646de1 4ae15400', 16); + is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(10)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + result = value_1.shiftLeft(32); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff00000000', 16); + is(result.asString(16), expectedResult.asString(16), "ff.shiftLeft(32)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + result = value_1.shiftLeft(4096); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + result = value_1.shiftLeft(5000); + expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16); + is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); + is(value_1.bitSize(), 0, "0.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16); + is(value_1.bitSize(), 5, "10.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("80", 16); + is(value_1.bitSize(), 8, "80.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); + is(value_1.bitSize(), 8, "ff.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("100", 16); + is(value_1.bitSize(), 9, "100.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("80000000", 16); + is(value_1.bitSize(), 32, "80000000.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffffffff", 16); + is(value_1.bitSize(), 32, "ffffffff.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("1 00000000", 16); + is(value_1.bitSize(), 33, "100000000.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("8000 00000000", 16); + is(value_1.bitSize(), 48, "8000 00000000.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff ffffffff", 16); + is(value_1.bitSize(), 48, "ffff ffffffff.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("10000 00000000", 16); + is(value_1.bitSize(), 49, "10000 00000000.bitSize()"); + + value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); + is(value_1.bitSize(), 1119, "6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16.bitSize()"); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html new file mode 100644 index 0000000..b53a9a1 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html @@ -0,0 +1,160 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> +<!-- - -> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> +<!- - --> +<!-- --> + <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> +<!-- --> + +<!-- - -> + <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> + <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> +<!- - --> + + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + +<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> + +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>--> +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>--> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + + var deferredResult; + + + deferredResult = new MochiKit.Async.Deferred(); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); + + // + // ECC.Curve.multiplication + // + var curve; + var f2m; + var f2m_improved; + var value; + var moduledValue; + var result; + var result_improved; + var expectedResul; + + f2m = new Clipperz.Crypto.ECC.Koblitz.FiniteField({modulus:new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) + f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField(); + + curve = Clipperz.Crypto.ECC.StandardCurves.K283(); + +/** / + value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16); + result = curve.multiply(value, curve.G()); + expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({ + x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), + y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) + }); + is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); + is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); +/ **/ + + value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); + +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); +// deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value'); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); + deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); +// deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); + deferredResult.addCallback(function(res) { + var expectedResult; + + expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({ + x: new Clipperz.Crypto.ECC.Koblitz.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16), + y: new Clipperz.Crypto.ECC.Koblitz.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16) + }); + + is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); + is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); + }) +//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;}); + deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;}); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 11: " + res); return res;}); + deferredResult.callback(); + + SimpleTest.waitForExplicitFinish(); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html new file mode 100644 index 0000000..1342349 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html @@ -0,0 +1,70 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title> + + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='./jscrypto.js'></script> + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> + +<pre id="test"> + <script type="text/javascript"> + var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a."; + var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; + var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; + </script> + <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js new file mode 100644 index 0000000..7dc688c --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js @@ -0,0 +1,418 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +//function logElapsedTime(aDescription, aStartTime, anEndTime) { +// MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms"); +// SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms"); +//} + +var asciiTestString = longAsciiText; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString; + +var isoLatin1TestString = longIsoLatin1Text; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; + +var utf8TestString = longUtf8Text; +//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString; + +var times = { + 'Clipperz': {}, + 'JSCrypto': {} +}; + +function appendResults (aDescription, aTimer) { + MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'), + MochiKit.DOM.TR(null, + MochiKit.DOM.TH({align:'left'}, aDescription), + MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//, +// MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt'] + ' - ' + aTimer['isoLatin1']['decrypt']), +// MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt']) + ) + ); + +} + +//============================================================================= + +function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) { + var start; + var end; + var encryptTime; + var decryptTime; + var ciphertext; + var plaintext; + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', aString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(aString, plaintext, aDescription); +} +/* +function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) { + var start; + var end; + var encryptTime; + var decryptTime; + var ciphertext; + var plaintext; + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', asciiTestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text"); + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', isoLatin1TestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['isoLatin1'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(isoLatin1TestString, plaintext, "Encrypt/decrypt the ISO-Latin 1 text"); + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', utf8TestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['utf8'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(utf8TestString, plaintext, "Encrypt/decrypt the UTF-8 text"); +} +*/ +function timeDeferredFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey, someTestArgs) { + var start; + var end; + + var deferredResult; + + aTimer[aKey] = {}; + + deferredResult = new Clipperz.Async.Deferred("timeDeferredFunction", someTestArgs); + deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); + deferredResult.addCallback(anEncryptFunction, 'trustno1', aString); + deferredResult.addCallback(function (aValue) { + end = new Date(); + aTimer[aKey]['encrypt'] = end-start; + return aValue; + }); + deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); + deferredResult.addCallback(aDecryptFunction, 'trustno1'); + deferredResult.addCallback(function (aValue) { + end = new Date(); + aTimer[aKey]['decrypt'] = end-start; + return aValue; + }); + deferredResult.addCallback(function (aValue) { + SimpleTest.is(aString, aValue, aDescription); + }); + + deferredResult.callback(); + + return deferredResult; +} + +//============================================================================= + +function encryptUsingJSCrypto (aKey, aValue) { + var salt; + var key; + var cipher; + var iv; + var plaintext; + var ciphertext; + var tag; + var adata; + + salt = [1,2,3,4,5,6,7,8]; + key = generateKey(aKey, salt); + + cipher = new aes(key, CCM); + iv = Random.random_words(4); + + plaintext = aValue; + ciphertext = []; + tag = []; + adata = ""; + + cipher.encrypt(iv, plaintext, ciphertext, adata, tag); + + return ciphertext; +} + +//----------------------------------------------------------------------------- + +function decryptUsingJSCrypto (aKey, aValue) { + var salt; + var key; + var cipher; + var ciphertext; + var plaintext; + var tag; + var adata; + + salt = [1,2,3,4,5,6,7,8]; + key = generateKey(aKey, salt); + tag = []; + adata = ""; + + cipher = new aes(key, CCM); + ciphertext = aValue; + plaintext = cipher.decrypt(ciphertext, adata, tag); + + return plaintext; +} + +//============================================================================= + +function encryptUsingClipperz (aKey, aValue) { + var key; + var value; + var data; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = aValue; + data = new Clipperz.ByteArray(value); + encryptedData = Clipperz.Crypto.AES.encrypt(key, data); + return encryptedData.toBase64String(); +} + +//----------------------------------------------------------------------------- + +function decryptUsingClipperz (aKey, aValue) { + var key; + var value; + var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString(); + + return decryptedData; +} + +//============================================================================= + +function encryptUsingClipperzAndJSON (aKey, aValue) { + var key; + var value; + var data; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + encryptedData = Clipperz.Crypto.AES.encrypt(key, data); + return encryptedData.toBase64String(); +} + +//----------------------------------------------------------------------------- + +function decryptUsingClipperzAndJSON (aKey, aValue) { + var key; + var value; + var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString(); + + return Clipperz.Base.evalJSON(decryptedData); +} + +//============================================================================= + +function deferredEncryptUsingClipperz (aKey, aValue) { + var deferredResult; + var key; + var data; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + data = new Clipperz.ByteArray(aValue); + + deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredEncrypt", {trace:false}); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; +} + +//----------------------------------------------------------------------------- + +function deferredDecryptUsingClipperz (aKey, aValue) { + var key, value; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredDecrypt", {trace:false}); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); + deferredResult.addCallback(function(aResult) { + return aResult.asString(); + }); + deferredResult.callback(); + + return deferredResult; +} + +//============================================================================= + +var tests = { + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzFunctions': function (someTestArgs) { +// timeRegularFunction(encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['Regular']); + times['Clipperz']['NO JSON'] = {}; + + timeRegularFunction("Clipperz - NO JSON - Ascii", asciiTestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'ascii'); + timeRegularFunction("Clipperz - NO JSON - ISO Latin 1", isoLatin1TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'isoLatin1'); + timeRegularFunction("Clipperz - NO JSON - UTF-8", utf8TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'utf8'); + + appendResults("Clipperz - NO JSON", times['Clipperz']['NO JSON']); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzAndJSONFunctions': function (someTestArgs) { +// timeRegularFunction(encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON']); + times['Clipperz']['JSON'] = {}; + + timeRegularFunction("Clipperz - JSON - Ascii", asciiTestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'ascii'); + timeRegularFunction("Clipperz - JSON - ISO Latin 1", isoLatin1TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'isoLatin1'); + timeRegularFunction("Clipperz - JSON - UTF-8", utf8TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'utf8'); + + appendResults("Clipperz - JSON", times['Clipperz']['JSON']); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzDeferredFunctions': function (someTestArgs) { + times['Clipperz']['Deferred'] = {}; + times['Clipperz']['Deferred [NO JSON]'] = {}; + + return Clipperz.Async.callbacks("encryptMultipleStringsUsingClipperzDeferredFunctions", [ + MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'ascii', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'isoLatin1', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'utf8', someTestArgs), + + MochiKit.Base.partial(appendResults, "Clipperz - deferred [NO JSON]", times['Clipperz']['Deferred [NO JSON]']), + + MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'ascii', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'isoLatin1', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'utf8', someTestArgs), + + MochiKit.Base.partial(appendResults, "Clipperz - PM", times['Clipperz']['Deferred']) + ], someTestArgs); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingJSCryptoFunctions': function (someTestArgs) { + timeRegularFunction("JSCrypto - Ascii", asciiTestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'ascii'); + timeRegularFunction("JSCrypto - ISO Latin 1", isoLatin1TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'isoLatin1'); + timeRegularFunction("JSCrypto - UTF-8", utf8TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'utf8'); + + appendResults("JSCrypto", times['JSCrypto']); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.waitForExplicitFinish(); +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Random.set_default_paranoia(0); + +//Random.addEventListener("seeded", MochiKit.Base.partial(SimpleTest.runDeferredTests, "Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false})); +//Random.addEventListener("seeded", function () { console.log("SEEDED!")}); + + +MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, + MochiKit.DOM.TABLE({border:'1', cellpadding:'4', cellspacing:'0'}, + MochiKit.DOM.THEAD(), + MochiKit.DOM.TBODY({id:'timerTBODY'}, + MochiKit.DOM.TR(null, + MochiKit.DOM.TH(null, "algorithm"), + MochiKit.DOM.TH(null, "ascii [" + asciiTestString.length + "]"), + MochiKit.DOM.TH(null, "ISO Latin 1 [" + isoLatin1TestString.length * 2 + "]"), + MochiKit.DOM.TH(null, "UTF 8 [" + utf8TestString.length * 3 + "]") + ) + ), + MochiKit.DOM.TFOOT() + )//, +// MochiKit.DOM.H4(null, "AES chunkSize: " + Clipperz.Crypto.AES.DeferredExecution.chunkSize), +// MochiKit.DOM.H4(null, "AES pauseTime: " + Clipperz.Crypto.AES.DeferredExecution.pauseTime) +); + + +SimpleTest.runDeferredTests("Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false});
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html new file mode 100644 index 0000000..7ffd691 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html @@ -0,0 +1,117 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script> jslog_config_enabled = true; </script> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> + +<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>--> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +test_PRNG = function() { + var rand1, rand2; + var i,c; + + c = 10; + for (i=0; i<c; i++) { +// jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString()); + } + + rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); + is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte"); + + rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); + is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); + + + rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); + is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test"); +// is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test"); +//jslog.debug(rand1.toHexString()); +//jslog.debug(rand2.toHexString()); + + SimpleTest.finish(); +} + +try { + MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG); + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + SimpleTest.waitForExplicitFinish(); +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html new file mode 100644 index 0000000..468a987 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html @@ -0,0 +1,90 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + var rsaPublicKey; + var randomValue; + var publicEncryptedValue; + var privateEncryptedValue; + + var startTime; + var endTime; + + +startTime=new Date(); + rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512); + +endTime=new Date(); +is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0); + + randomValue = Clipperz.Crypto.Base.generateRandomSeed(); + publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue); + privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue); + + is(publicEncryptedValue == privateEncryptedValue, false); + is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue); + is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue); + + //------------------------------------------------------------------------- +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html new file mode 100644 index 0000000..1c88213 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html @@ -0,0 +1,175 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.SHA - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript" src="SHA.test.js"></script> +</pre> +</body> +</html> + + + +<!-- html> +<head> + <script> + jslog_config_enabled = true; + clipperz_profiling_enabled = true; + </script> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> + +try { + var byteArray; + var hash; + var longText; + var startTime, endTime; + + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; + + //------------------------------------------------------------------------- + // + // Test of SHA-256 algorithm + // + //------------------------------------------------------------------------- + + byteArray = new Clipperz.ByteArray(); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')"); + + byteArray = new Clipperz.ByteArray("0xbd"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')"); + + byteArray = new Clipperz.ByteArray("0x5fd4"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')"); + + byteArray = new Clipperz.ByteArray("0xc98c8e55"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')"); + + byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')"); + + byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is( hash.toHexString(), + "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c", + "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')"); + + byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is( hash.toHexString(), + "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d", + "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')"); + + byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is( hash.toHexString(), + "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3", + "sha256('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a')"); + + byteArray = new Clipperz.ByteArray("0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); + is( hash.toHexString(), + "0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454", + "sha256('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad')"); + + + byteArray = new Clipperz.ByteArray(longText); +startTime = new Date(); +//console.profile("SHA256"); + hash = Clipperz.Crypto.SHA.sha256(byteArray); +//console.profileEnd("SHA256"); +endTime = new Date(); + is( hash.toHexString(), + "0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949", + "sha256(longText)"); + is((endTime - startTime) < 500, true, "Long text hash performance (" + (endTime - startTime) + ")"); + MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime)); + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html --> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js new file mode 100644 index 0000000..c9f1f3b --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js @@ -0,0 +1,84 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var testSHA = function (aValue, anExpectedResult) { + var byteArrayValue; + + byteArrayValue = new Clipperz.ByteArray(aValue); + hash = Clipperz.Crypto.SHA.sha256(byteArrayValue); + is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')"); + +} + + +var tests = { + + 'basic_tests': function (someTestArgs) { + testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); + testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b'); + testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788'); + testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504'); + testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c'); + testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c'); + testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d'); + testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3'); + testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454'); + + }, + + //------------------------------------------------------------------------- + + 'aldo_cortesi_tests': function (someTestArgs) { + testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47'); + testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a'); + testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa'); + testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71'); + }, + + //------------------------------------------------------------------------- + + 'longTextPerformance_test': function (someTestArgs) { + var longText; + var startTime; + var endTime; + + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; + startTime = new Date(); + testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949'); + endTime = new Date(); + + is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//============================================================================= + +SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html new file mode 100644 index 0000000..63278c4 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html @@ -0,0 +1,161 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +hashString = function(aValue) { + return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2) +} +try { + var username; + var passphrase; + + var C; + var P; + var encryptedText_1; + var encryptedText_2; + var salt; + var x; + var v; + var v1; + + username = "giulio.cesare"; + passphrase = "trustno1"; + + C = hashString(username); + is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C"); + + P = hashString(passphrase + username); + is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P"); + + salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; + + x = hashString(salt + P); + is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x"); + + v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); + is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v"); + is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)"); + +// encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); +// encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); +// is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); + + //------------------------------------------------------------------------- + + username = "giulio.cesare.debug"; + passphrase = "trustno1"; + + C = hashString(username); + is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C"); + + P = hashString(passphrase + username); + is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P"); + + salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; + + x = hashString(salt + P); + is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x"); + + v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); + is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v"); + +// encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); +// encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); +// is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); + + //------------------------------------------------------------------------- + + var srpConnection; + var C, P, salt; + + C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e"; + P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba"; + salt = "000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1"; + + srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256}); + srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); + srpConnection.set_s(new Clipperz.Crypto.BigInt(salt, 16)); + is (srpConnection.s().asString(16, 64), salt, "salt read/write is coherent"); + srpConnection.set_B(new Clipperz.Crypto.BigInt("123541032067854367017620977654446651448957899464139861291542193929199957895435", 10)); + + is( srpConnection.serverSideCredentialsWithSalt(salt).v, + "c73169c8236d37bf9ef11a2349e3064b7dc6e883a58d64443ea9235677520030", + "server side credentials - v" + ) + is(srpConnection.S(), "84134227508133659832466942692590826994401065200828529664948840490489960952050", "Server side 'S'"); +//MochiKit.Logging.logDebug("=== serverSideCredentials: " + MochiKit.Base.serializeJSON(srpConnection.serverSideCredentialsWithSalt(salt))); + + srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256}); + try { + srpConnection.set_B(new Clipperz.Crypto.BigInt("0", 10)); + ok(false, "Setting B to 0 should raise an exception"); + } catch(e) { + ok(true, "Setting B to 0 should raise an exception"); + } + //------------------------------------------------------------------------- + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html new file mode 100644 index 0000000..63f7610 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html @@ -0,0 +1,122 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.Usage - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +MochiKit.Base.update(Clipperz, { + 'PM': { + 'Crypto': { + 'passwordEntropy': function(aValue) { + var result; + var bitPerChar; + + bitPerChar = 4; + if (/[a-z]/.test(aValue)) { + bitPerChar ++; + } + if (/[A-Z]/.test(aValue)) { + bitPerChar ++; + } + if (/[^a-zA-Z0-9]/.test(aValue)) { + bitPerChar ++; + } + //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar); + + result = aValue.length * bitPerChar; + + return result; + } + } + } +}) + +try { + var keyValue; + var keyEntropy; + var key; + var plainText; + var cypherText; + var randomBytes; + var hashedValue; + + key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase")); + keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key); + + cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt")); + plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString(); + is(plainText, "some text to encrypt"); + + randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8); + hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash")); + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html new file mode 100644 index 0000000..67487ac --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html @@ -0,0 +1,58 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Crypto.* - tests</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( + 'AES.html', + 'AES.performance.html', + 'Base.html', + 'BigInt.html', + +// 'ECC.B283.deferred.html', +// 'ECC.BinaryField.FiniteField.html', +// 'ECC.BinaryField.FiniteField.B283.html', +// 'ECC.BinaryField.Value.html', +//# 'ECC.K283.deferred.html', + + 'PRNG.html', +// 'RSA.html', + 'SHA.html', + 'SRP.html', + 'Usage.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js new file mode 100644 index 0000000..e9db091 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js @@ -0,0 +1,1577 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +/* jsCrypto +Core AES + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements +and code size reduction. Provides authenticated encryption in OCB and CCM modes. +Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org + +Public domain, 2009. + +*/ + + +// CCM mode is the default +var CCM = 1, OCB = 2; + +/* aes object constructor. Takes as arguments: +- 16-byte key, or an array of 4 32-bit words +- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM +- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes +*/ +function aes(key, mode, Tlen) { + // initialize objects for CCM and OCB modes + this._CCM = new cipherCCM(this); + this._OCB = new cipherOCB(this); + + this._decryptScheduled = false; + + if (mode) this._mode = mode; + else this._mode = OCB; + + // AES round constants + this._RCON = [ + [0x00, 0x00, 0x00, 0x00], + [0x01, 0x00, 0x00, 0x00], + [0x02, 0x00, 0x00, 0x00], + [0x04, 0x00, 0x00, 0x00], + [0x08, 0x00, 0x00, 0x00], + [0x10, 0x00, 0x00, 0x00], + [0x20, 0x00, 0x00, 0x00], + [0x40, 0x00, 0x00, 0x00], + [0x80, 0x00, 0x00, 0x00], + [0x1b, 0x00, 0x00, 0x00], + [0x36, 0x00, 0x00, 0x00] + ]; + + this._key_len = 16; + if (key.length == 4) { + this._key = []; + aes.wordsToBytes(key, this._key); + } + else + this._key = key; + + if (Tlen) this._Tlen = Tlen; + else this._Tlen = 16; // tag length in bytes + + this._nr = 10; + + // initialize tables that will be precomputed + this._SBOX = []; + this._INV_SBOX = []; + this._T = new Array(4); + this._Tin = new Array(4); + for (var i=0; i < 4; i++) { + this._T[i] = []; + this._Tin[i] = []; + } + + this._precompute(); + this.scheduleEncrypt(); + + // initialize encryption and decryption buffers + this._ctBuffer = []; + this._ptBuffer = []; +} + + +////////////////// +// KEY SCHEDULING +////////////////// + +aes.prototype.scheduleEncrypt = function () { + this._decryptScheduled = false; + + this._w = new Array(this._nr+1); + this._w[0] = new Array(4); + for (var i=0; i < 4; i++) + this._w[0][i] = this._key[i]; + var temp = new Array(4); + for (var i=1; i < this._nr+1; i++) { + temp[0] = this._w[i-1][3]; + this._w[i] = new Array(4); + temp[0] = (this._T[2][(temp[0]>>>16)&0xff] & 0xff000000) ^ (this._T[3][(temp[0]>>>8)&0xff]&0x00ff0000) ^ (this._T[0][(temp[0]&0xff)]&0x0000ff00) ^ (this._T[1][(temp[0]>>>24)]&0x000000ff) ^ (this._RCON[i][0]<<24); + this._w[i][0] = this._w[i-1][0] ^ temp[0]; + for (var j=1; j < 4; j++) { + temp[j] = this._w[i][j-1]; + this._w[i][j] = this._w[i-1][j] ^ temp[j]; + } + } +}; + +aes.prototype.scheduleDecrypt = function() { + + if (!this._w) this.scheduleEncrypt(); + this._decryptScheduled = true; + var temp = []; + var j = this._w.length-1; + for (var i=0; i<j; i++) { + temp[0] = this._w[i][0]; + temp[1] = this._w[i][1]; + temp[2] = this._w[i][2]; + temp[3] = this._w[i][3]; + this._w[i][0] = this._w[j][0]; + this._w[i][1] = this._w[j][1]; + this._w[i][2] = this._w[j][2]; + this._w[i][3] = this._w[j][3]; + this._w[j][0] = temp[0]; + this._w[j][1] = temp[1]; + this._w[j][2] = temp[2]; + this._w[j][3] = temp[3]; + j--; + } + + var td0 = this._Tin[0], td1 = this._Tin[1], td2 = this._Tin[2], td3 = this._Tin[3], te1 = this._T[1]; + for (var i=1; i < this._w.length-1; i++) { + this._w[i][0] = td0[te1[(this._w[i][0] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][0] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][0] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][0] ) & 0xff] & 0xff]; + this._w[i][1] = td0[te1[(this._w[i][1] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][1] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][1] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][1] ) & 0xff] & 0xff]; + this._w[i][2] = td0[te1[(this._w[i][2] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][2] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][2] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][2] ) & 0xff] & 0xff]; + this._w[i][3] = td0[te1[(this._w[i][3] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][3] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][3] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][3] ) & 0xff] & 0xff]; + } +}; + + +///////////////////////// +// ENCRYPTION/DECRYPTION +///////////////////////// + + +/* Authenticated encryption on a multi-block message in OCB or CCM mode. +iv should be an array of 32-bit words - either 4 words for OCB mode or 1, 2, or 3 words for CCM. +Use a unique IV for every message encrypted. +The plaintext argument will be encrypted and MACed; adata will be sent in plaintext but MACed. +Plaintext and adata are strings. +ciphertext is an array of bytes. tag is an array of 32-bit words. +*/ +aes.prototype.encrypt = function(iv, plaintext, ciphertext, adata, tag) { + var plaintextBytes = [], adataBytes = []; + aes.asciiToBytes(plaintext, plaintextBytes); + aes.asciiToBytes(adata, adataBytes); + + this._iv = iv; + if (this._mode == CCM) + this._CCM.encrypt(plaintextBytes, ciphertext, adataBytes, tag); + else if (this._mode == OCB) { + this._OCB.encrypt(plaintextBytes, ciphertext, adataBytes, tag); + } + + // prepend to the ciphertext the length of the iv (in bytes) and the iv + var ivbytes=[]; + aes.wordsToBytes(iv, ivbytes); + var ct = [iv.length*4].concat(ivbytes, ciphertext); + for (var i=0; i < ct.length; i++) ciphertext[i] = ct[i]; + + for (var i=0; i < ciphertext.length; i++) + this._ctBuffer[this._ctBuffer.length] = ciphertext[i]; + +}; + +/* Authenticated decryption on a multi-block ciphertext in OCB or CCM mode. +ciphertext is an array of bytes. tag is an array of 32-bit words. +plaintext and adata are strings. +*/ +aes.prototype.decrypt = function(ciphertext, adata, tag) { + var ivlen = ciphertext[0]; + var ivbytes = ciphertext.slice(1, ivlen+1); + var iv = []; + aes.bytesToWords(ivbytes, iv); + this._iv = iv; + var ct = ciphertext.slice(ivlen+1); + + var valid = false; + var plaintextBytes = [], adataBytes = []; + aes.asciiToBytes(adata, adataBytes); + if (this._mode == CCM) + valid = this._CCM.decrypt(ct, plaintextBytes, adataBytes); + else if (this._mode == OCB) + valid = this._OCB.decrypt(ct, plaintextBytes, adataBytes, tag); + if (valid) { + var plaintext = aes.bytesToAscii(plaintextBytes); + for (var i=0; i < plaintext.length; i++) + this._ptBuffer[this._ptBuffer.length] = plaintext.charAt(i); + return plaintext; + } + return ""; +}; + +// MACs (but doesn't encrypt) data using CMAC (in CCM mode) or PMAC (in OCB mode) +aes.prototype.sign = function(data, tag) { + if (this._mode == CCM) + this._CCM.CMAC(data, "", tag, this._Tlen, false); + else if (this._mode == OCB) { + this._OCB.PMAC(data, tag); + } +}; + +// Verifies a CMAC or PMAC tag +aes.prototype.verify = function(data, tag) { + var validTag = []; + if (this._mode == CCM) + this._CCM.CMAC(data, "", validTag, this._Tlen, false); + else if (this._mode == OCB) { + this._OCB.PMAC(data, validTag); + } + if (validTag.length != tag.length) return false; + for (var i=0; i < tag.length; i++) { + if (tag[i] != validTag[i]) return false; + } + return true; +}; + +/* Encrypts a single block message in AES. Takes the plaintext, an array in which to dump +the ciphertext, and a boolean decrypt argument. If set to true, this function acts as +a decryption function. +block and ciphertext are both arrays of 4 32-bit words. +*/ +aes.prototype.encryptBlock = function(block, ciphertext, decrypt) { + if (!decrypt && this._decryptScheduled) this.scheduleEncrypt(); + + // get key schedule + var w = this._w; + // load round transformation tables + var te0, te1, te2, te3; + if (decrypt) { + te0 = this._Tin[0]; + te1 = this._Tin[1]; + te2 = this._Tin[2]; + te3 = this._Tin[3]; + } else { + te0 = this._T[0]; + te1 = this._T[1]; + te2 = this._T[2]; + te3 = this._T[3]; + } + + // perform rounds + var rk = w[0]; + var s0 = block[0] ^ rk[0]; + var s1 = block[1] ^ rk[1]; + var s2 = block[2] ^ rk[2]; + var s3 = block[3] ^ rk[3]; + var t0,t1,t2,t3; + rk = w[1]; + var order = []; + for (var round = 1; round < w.length-1; round++) { + order = [s1, s2, s3, s0]; + if (decrypt) order = [s3, s0, s1, s2]; + t0 = te0[(s0>>>24)] ^ te1[(order[0]>>>16) & 0xff]^ te2[(s2>>>8)&0xff] ^ te3[order[2]&0xff] ^ rk[0]; + t1 = te0[(s1>>>24)] ^ te1[(order[1]>>>16) & 0xff]^ te2[(s3>>>8)&0xff] ^ te3[order[3]&0xff] ^ rk[1]; + t2 = te0[(s2>>>24)] ^ te1[(order[2]>>>16) & 0xff]^ te2[(s0>>>8)&0xff] ^ te3[order[0]&0xff] ^ rk[2]; + t3 = te0[(s3>>>24)] ^ te1[(order[3]>>>16) & 0xff]^ te2[(s1>>>8)&0xff] ^ te3[order[1]&0xff] ^ rk[3]; + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk = w[round+1]; + } + if (decrypt) { + s0 = ((this._INV_SBOX[(t0>>>24)])<<24) ^ ((this._INV_SBOX[(t3>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t2>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t1)&0xff]) ^ rk[0]; + s1 = ((this._INV_SBOX[(t1>>>24)])<<24) ^ ((this._INV_SBOX[(t0>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t3>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t2)&0xff]) ^ rk[1] + s2 = ((this._INV_SBOX[(t2>>>24)])<<24) ^ ((this._INV_SBOX[(t1>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t0>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t3)&0xff]) ^ rk[2]; + s3 = (this._INV_SBOX[(t3>>>24)]<<24) ^ (this._INV_SBOX[(t2>>>16)&0xff]<<16) ^ (this._INV_SBOX[(t1>>>8)&0xff]<<8) ^ (this._INV_SBOX[(t0)&0xff]) ^ rk[3]; + } else { + s0 = (te2[t0>>>24]&0xff000000) ^ (te3[(t1>>>16)&0xff]&0x00ff0000) ^ (te0[(t2>>>8)&0xff]&0x0000ff00) ^ (te1[(t3)&0xff]&0x000000ff) ^ rk[0]; + s1 = (te2[t1>>>24]&0xff000000) ^ (te3[(t2>>>16)&0xff]&0x00ff0000) ^ (te0[(t3>>>8)&0xff]&0x0000ff00) ^ (te1[(t0)&0xff]&0x000000ff) ^ rk[1]; + s2 = (te2[t2>>>24]&0xff000000) ^ (te3[(t3>>>16)&0xff]&0x00ff0000) ^ (te0[(t0>>>8)&0xff]&0x0000ff00) ^ (te1[(t1)&0xff]&0x000000ff) ^ rk[2]; + s3 = (te2[t3>>>24]&0xff000000) ^ (te3[(t0>>>16)&0xff]&0x00ff0000) ^ (te0[(t1>>>8)&0xff]&0x0000ff00) ^ (te1[(t2)&0xff]&0x000000ff) ^ rk[3]; + } + ciphertext[0] = s0; + ciphertext[1] = s1; + ciphertext[2] = s2; + ciphertext[3] = s3; +}; + +// As above, block and plaintext are arrays of 4 32-bit words. +aes.prototype.decryptBlock = function(block, plaintext) { + if (!this._decryptScheduled) this.scheduleDecrypt(); + + this.encryptBlock(block, plaintext, true); +}; + + +//////////////////// +// HELPER FUNCTIONS +//////////////////// + +aes._hex = function(n) { + var out = "",i,digits="0123456789ABCDEF"; + for (i=0; i<8; i++) { + var digit = n&0xF; + out = digits.substring(digit,digit+1) + out; + n = n >>> 4; + } + return out; +} + +aes._hexall = function(nn) { + var out = "",i; + for (i=0;i<nn.length;i++) { + if (i%4 == 0) out+= "<br/>\n"; + else if (i) out += " "; + out += aes._hex(nn[i]); + } + return out; +} + +aes.bytesToAscii = function(bytes) { + var ascii = ""; + var len = bytes.length; + for (var i=0; i < len; i++) { + ascii = ascii + String.fromCharCode(bytes[i]); + } + return ascii; +}; + +aes.asciiToBytes = function(ascii, bytes) { + var len = ascii.length; + for (var i=0; i < len; i++) + bytes[i] = ascii.charCodeAt(i); +}; + +aes.wordsToBytes = function(words, bytes) { + var bitmask = 1; + for (var i=0; i < 7; i++) bitmask = (bitmask << 1) | 1; + for (var i=0; i < words.length; i++) { + var bstart = i*4; + for (var j=0; j < 4; j++) { + bytes[bstart+j] = (words[i] & (bitmask << (8*(3-j)))) >>> (8*(3-j)); + } + } +}; + +aes.bytesToWords = function(bytes, words) { + var paddedBytes = bytes.slice(); + while (paddedBytes.length % 4 != 0) paddedBytes.push(0); + var num_words = Math.floor(paddedBytes.length/4); + for (var j=0; j < num_words; j++) + words[j] = ((paddedBytes[(j<<2)+3]) | (paddedBytes[(j<<2)+2] << 8) | (paddedBytes[(j<<2)+1] << 16) | (paddedBytes[j<<2] << 24)); +}; + + +/////////////////////////////////////// +// KEY DERIVATION +////////////////////////////////////// + +// password is a string, presumably a password entered by the user. +// salt is eight random bytes associated with each user +// This function returns an array of bytes of length 16 +function generateKey(password, salt) { + var pwBytes = []; + aes.asciiToBytes(password, pwBytes); + var pwWords = [], saltWords = []; + aes.bytesToWords(pwBytes, pwWords); + aes.bytesToWords(salt, saltWords); + + var iterations = 1000; + + var derivedKey = []; + var blockIndex = 1; + + var xorHashes = function(h1, h2) { + var xor = []; + var i; + for (i=0; i < h1.length; i++) xor.push(h1[i] ^ h2[i]); + return xor; + }; + + while (derivedKey.length < 16) { + var hashBytes = pwWords.concat(saltWords); + hashBytes.push(blockIndex); + var T = SHA256.hash_words_big_endian(hashBytes); + var u = T; + for (var i=2; i < iterations; i++) { + var hash = SHA256.hash_words_big_endian(pwWords.concat(u)); + u = xorHashes(T, hash); + } + var block = []; + aes.wordsToBytes(T, block); + for (var i=0; i < block.length; i++) derivedKey.push(block[i]); + } + + if (derivedKey.length > 16) derivedKey.length = 16; + return derivedKey; +} + +/////////////////////////////////////// +// ROUND TRANSFORMATION PRECOMPUTATION +/////////////////////////////////////// + + +// Precomputation code by Mike Hamburg + +aes.prototype._precompute = function() { + var x,xi,sx,tx,tisx,i; + var d=[]; + + /* compute double table */ + for (x=0;x<256;x++) { + d[x]= x&128 ? x<<1 ^ 0x11b : x<<1; + //d[x] = x<<1 ^ (x>>7)*0x11b; //but I think that's less clear. + } + + /* Compute the round tables. + * + * We'll need access to x and x^-1, which we'll get by walking + * GF(2^8) as generated by (82,5). + */ + for(x=xi=0;;) { + // compute sx := sbox(x) + sx = xi^ xi<<1 ^ xi<<2 ^ xi<<3 ^ xi<<4; + sx = sx>>8 ^ sx&0xFF ^ 0x63; + + var dsx = d[sx], x2=d[x],x4=d[x2],x8=d[x4]; + + // te(x) = rotations of (2,1,1,3) * sx + tx = dsx<<24 ^ sx<<16 ^ sx<<8 ^ sx^dsx; + + // similarly, td(sx) = (E,9,D,B) * x + tisx = (x8^x4^x2) <<24 ^ + (x8^x ) <<16 ^ + (x8^x4^x ) << 8 ^ + (x8^x2^x ); + + // This can be done by multiplication instead but I think that's less clear + // tisx = x8*0x1010101 ^ x4*0x1000100 ^ x2*0x1000001 ^ x*0x10101; + // tx = dsx*0x1000001^sx*0x10101; + + // rotate and load + for (i=0;i<4;i++) { + this._T[i][x] = tx; + this._Tin[i][sx] = tisx; + tx = tx<<24 | tx>>>8; + tisx = tisx<<24 | tisx>>>8; + } + + // te[4] is the sbox; td[4] is its inverse + this._SBOX[ x] = sx; + this._INV_SBOX[sx] = x; + + + // wonky iteration goes through 0 + if (x==5) { + break; + } else if (x) { + x = x2^d[d[d[x8^x2]]]; // x *= 82 = 0b1010010 + xi ^= d[d[xi]]; // xi *= 5 = 0b101 + } else { + x=xi=1; + } + } + + // We computed the arrays out of order. On Firefox, this matters. + // Compact them. + for (i=0; i<4; i++) { + this._T[i] = this._T[i].slice(0); + this._Tin[i] = this._Tin[i].slice(0); + } + this._SBOX = this._SBOX.slice(0); + this._INV_SBOX = this._INV_SBOX.slice(0); + + +}; + + + + + +/* jsCrypto +CCM mode + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +CCM mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher. + +Public domain, 2009. + +*/ + +// Constructor takes an aes object as its core cipher +function cipherCCM(cipher) { + this._cipher = cipher; +} + +/* Formats plaintext and adata for MACing and encryption. +adata and plaintext are arrays of bytes, B will be an array of arrays of 16 bytes +Tlen specifies the number of bytes in the tag. +Formatted according to the CCM specification. + */ +cipherCCM.prototype._formatInput = function(adata, plaintext, Tlen, B) { + // compute B[0] + var flags, nbytes=[]; + aes.wordsToBytes(this._cipher._iv, nbytes); + if (adata) flags = 0x01<<6; + else flags = 0x00<<6; + flags = flags | (((Tlen-2)/2)<<3); // (t-2)/2 + var q = 15-this._cipher._iv.length*4; + flags = flags | (q-1); + B[0] = new Array(16); + B[0][0] = flags; + for (var i=1; i <= 15-q; i++) B[0][i] = nbytes[i-1]; + var Q = plaintext.length; + + // make some bitmasks + var bitmask = 1; + for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1; + for (var i=15; i > 15-q; i--) { + B[0][i] = Q & bitmask; + Q = Q>>>8; + } + + // compute the blocks which identify adata + if (adata) { + var a = adata.length, Bind=1, BIind = 0, aind=0; + B[1] = new Array(16); + if (a < (2<<16 - 2<<8)) { + B[1][0] = a>>>8; + B[1][1] = a & bitmask; + BIind = 2; + } else if (a < (2<<32)) { + B[1][0] = 0xff; + B[1][1] = 0xfe; + for (var i=5; i >= 0; i--) { + B[1][2+i] = a & bitmask; + a = a>>>8; + } + BIind=8; + } else { + B[1][0] = 0xff; + B[1][0] = 0xff; + for (i=9; i >= 0; i--) { + B[1][2+i] = a & bitmask; + a = a >>> 8; + } + BIind = 12; + } + } + + while (aind < adata.length) { + B[Bind][BIind] = adata[aind]; + aind++; + if (BIind == 15) { + Bind++; + BIind = 0; + if (aind != adata.length) B[Bind] = new Array(16); + } else BIind++; + } + if (BIind != 0) { + while (BIind <= 15) { + B[Bind][BIind] = 0x00; + BIind++; + } + } + + Bind++; + BIind=0; + B[Bind] = new Array(16); + + // compute the payload blocks + var pind = 0; + while (pind < plaintext.length) { + B[Bind][BIind] = plaintext[pind]; + pind++; + if (BIind == 15) { + Bind++; + BIind = 0; + if (pind != plaintext.length) B[Bind] = new Array(16); + } else BIind++; + } + if (BIind != 0) { + while (BIind <= 15) { + B[Bind][BIind] = 0x00; + BIind++; + } + } + +}; + +/* Generate the blocks that will be used as counters. +ctr will be an array of m+1 arrays of 16 bytes. */ +cipherCCM.prototype._generateCtrBlocks = function(m, ctr) { + var nbytes = []; + aes.wordsToBytes(this._cipher._iv, nbytes); + var flags = 15 - (this._cipher._iv.length*4) - 1; + var bitmask = 1; + for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1; + for (var i=0; i <= m; i++) { + ctr[i] = new Array(16); + ctr[i][0] = flags; + for (var j=0; j < nbytes.length; j++) { + ctr[i][j+1] = nbytes[j]; + } + for (var j=15; j > nbytes.length; j--) { + ctr[i][j] = (i>>>(8*(15-j))) & bitmask; + } + } + +}; + + +/* CBC-MAC adata and plaintext, and store the tag in tag. +adata and plaintext are arrays of bytes +tag will be an array of Tlen/4 32-bit words +Tlen is an integer divisible by 4 that specifies the number of bytes in the tag. +*/ +cipherCCM.prototype.CBCMAC = function(adata, plaintext, tag, Tlen, formatInput) { + var B = []; + if (formatInput) + this._formatInput(adata,plaintext,Tlen,B); + else { + var Sind = 0, SIind = 0, aind = 0, alen = adata.length; + B[0] = []; + while (aind < alen) { + B[Sind][SIind] = adata[aind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + if (aind != alen-1) B[Sind] = []; + } + aind++; + } + } + var words = []; + var Yprev = [], Y = []; + aes.bytesToWords(B[0],words); + this._cipher.encryptBlock(words, Y); + var r = B.length, t = new Array(4); + + for (var i=1; i < r; i++) { + for (var j=0; j < 4; j++) { + var bstart = j*4; + t[j] = Y[j] ^ ((B[i][bstart++]<<24) | (B[i][bstart++]<<16) | (B[i][bstart++]<<8) | (B[i][bstart++])); + Yprev[j] = Y[j]; + } + this._cipher.encryptBlock(t, Y); + } + for (var i=0; i < Tlen/4; i++) + tag[i] = Y[i]; +}; + + +/* Provides authenticated encryption using CBCMAC and CTR-mode encryption on plaintext. +adata is MACed but not encrypted. +plaintext, adata, and tag are arrays of bytes +Tlen is the number of bytes in the tag +ciphertext will be an array of bytes. */ +cipherCCM.prototype.encrypt = function(plaintext, ciphertext, adata, tag) { + var Tlen = this._cipher._Tlen; + this.CBCMAC(adata, plaintext, tag, Tlen, true); + var ctr = [], m = Math.ceil(plaintext.length/16); + this._generateCtrBlocks(m, ctr); + var cblocks = [], S=[], t = new Array(4); + for (var i=0; i <= m; i++) { + S[i] = new Array(16); + aes.bytesToWords(ctr[i], cblocks); + this._cipher.encryptBlock(cblocks, t); + aes.wordsToBytes(t, S[i]); + } + var Sind = 1, SIind = 0; + for (var i=0; i < plaintext.length; i++) { + ciphertext[i] = plaintext[i] ^ S[Sind][SIind]; + SIind++; + if (SIind == 16) { + Sind++; + SIind = 0; + } + } + var tbytes = []; + aes.wordsToBytes(tag, tbytes); + var cstart = plaintext.length; + for (var i=0; i < Tlen; i++) + ciphertext[cstart+i] = tbytes[i] ^ S[0][i]; +}; + + +/* Decrypt and verify the MAC on ciphertext and adata. The integrity of adata is verified, but isn't decrypted. +ciphertext, adata are arrays of bytes +plaintext will be an array of bytes +Returns true if tag is valid, false otherwise. +*/ +cipherCCM.prototype.decrypt = function(ciphertext, plaintext, adata) { + var Tlen = this._cipher._Tlen; + if (ciphertext.length <= Tlen) return false; + var ctr = [], tag = new Array(Tlen), m = Math.ceil(ciphertext.length/16); + this._generateCtrBlocks(m, ctr); + var S = [], t = new Array(4), cblocks=[]; + + for (var i=0; i <= m; i++) { + S[i] = new Array(16); + aes.bytesToWords(ctr[i], cblocks); + this._cipher.encryptBlock(cblocks, t); + aes.wordsToBytes(t, S[i]); + } + + var Sind = 1, SIind = 0; + for (var i=0; i < (ciphertext.length-Tlen); i++) { + plaintext[i] = ciphertext[i] ^ S[Sind][SIind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + } + } + + for (var i=0; i < Tlen; i++) + tag[i] = ciphertext[ciphertext.length-Tlen+i] ^ S[0][i]; + + // verify integrity + var validTag = [], vtbytes = []; + this.CBCMAC(adata, plaintext, validTag, Tlen, true); + aes.wordsToBytes(validTag, vtbytes); + for (var i=0; i < Tlen; i++) { + if (vtbytes[i] != tag[i]) + return false; + } + return true; + +}; + +// Generate subkeys according to the CCM specification. */ +cipherCCM.prototype._generateSubkeys = function(k1,k2) { + var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4); + this._cipher.encryptBlock(t, t2); + for (var i=0; i < 3; i++) + k1[i] = t2[i]<<1 | t2[i+1]>>>31; + k1[3] = t2[3]<<1; + if (t2[0]>>>31 != 0) + k1[3] = k1[3] ^ 135; + for (var i=0; i < 3; i++) + k2[i] = k1[i]<<1 | k1[i+1]>>>31; + k2[3] = k1[3]<<1; + if (k1[0]>>>31 != 0) + k2[3] = k2[3] ^ 135; +}; + + +/* CMAC used for integrity only (no encryption). */ +cipherCCM.prototype.CMAC = function(adata, plaintext, tag, Tlen, formatInput) { + var B = [], t = new Array(4); // will be an array of arrays of 16 bytes + if (formatInput) + this._formatInput(adata,plaintext,Tlen,B); + else { + var Sind = 0, SIind = 0, aind = 0, alen = adata.length; + B[0] = []; + while (aind < alen) { + B[Sind][SIind] = adata[aind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + if (aind != alen-1) B[Sind] = []; + } + aind++; + } + } + var k1 = new Array(4), k2 = new Array(4); + this._generateSubkeys(k1,k2); + var last = B.length-1, kbytes = []; + if (alen % 16 == 0) { + aes.wordsToBytes(k1, kbytes); + } else { + aes.wordsToBytes(k2, kbytes); + B[last][B[last].length] = 1<<7; + while (B[last].length % 16 != 0) + B[last][B[last].length] = 0x00; + } + for (var i=0; i < 16; i++) B[last][i] = B[last][i] ^ kbytes[i]; + var C = [0x00000000,0x00000000,0x00000000,0x00000000], Cprev = new Array(4), words = new Array(4); + for (var i=0; i < B.length; i++) { + aes.bytesToWords(B[i], words); + for (var j=0; j < 4; j++) { + Cprev[j] = C[j]; + t[j] = C[j] ^ words[j]; + } + this._cipher.encryptBlock(t, C); + } + var cbytes=[]; + aes.wordsToBytes(C, cbytes); + for (var i=0; i < Tlen; i++) + tag[i] = cbytes[i]; + +}; + + + +/* jsCrypto +OCB mode + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +OCB mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher. + +Public domain, 2009. +*/ + +/* Constructor takes an aes object as the core cipher. */ +function cipherOCB(cipher) { + this._cipher = cipher; +} + + +/* Provides integrity only, no encryption. +header is an array of bytes, tag will be an array of 4 32-bit words */ +cipherOCB.prototype.PMAC = function(header, tag) { + var carry, t = new Array(4), t2 = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + var Offset = new Array(4); + this._cipher.encryptBlock(Checksum, Offset); + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i]; + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i]; + + // accumulate all but the last block + var num_blocks = Math.floor((header.length-1)/16); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + var bstart = i*16; // start-of-block index + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24)); + this._cipher.encryptBlock(t, t2); + for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ t2[j]; + } + + // accumulate the last block + this._times2(Offset,Offset); + + if (header.length%16 == 0) { + var bstart = header.length-16; + for (var j=0; j < 4; j++) + Checksum[j] = Checksum[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24)); + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + } else { + var block_bytes = [], block = new Array(4), len = header.length, ind=0; + for (var i=(header.length-(header.length%16)); i < len; i++) { + block_bytes[ind] = header[i]; + ind++; + } + block_bytes[ind] = 0x80; + ind++; + while (block_bytes.length%16 != 0) { + block_bytes[ind] = 0x00; + ind++; + } + aes.bytesToWords(block_bytes,block); + for (var j=0; j < 4; j++) { + var bstart = 4*j; + Checksum[j] = Checksum[j] ^ ((block_bytes[bstart++]<<24) | (block_bytes[bstart++]<<16) | (block_bytes[bstart++]<<8) | (block_bytes[bstart++])); + } + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + } + + // compute result + for (var i=0; i < 4; i++) t[i] = Offset[i] ^ Checksum[i]; + this._cipher.encryptBlock(t, tag); +}; + + +/* Encrypts and MACs plaintext, only MACS header. +plaintext, ciphertext and header are arrays of bytes. tag will be an array of 4 32-bit words. */ +cipherOCB.prototype.encrypt = function(plaintext, ciphertext, header, tag) { + var Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4); + var Offset = new Array(4); + this._cipher.encryptBlock(this._cipher._iv, Offset); + var cbytes = []; + + // encrypt and accumulate all but last block + var num_blocks = Math.floor((plaintext.length-1)/16), bstart=0, block = new Array(4); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + bstart = 16*i; + for (var j=0; j < 4; j++) + block[j] = ((plaintext[bstart+(j<<2)+3]) | (plaintext[bstart+(j<<2)+2] << 8) | (plaintext[bstart+(j<<2)+1] << 16) | (plaintext[bstart+(j<<2)] << 24)); + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ block[j]; + this._cipher.encryptBlock(t,t2); + for (var j=0; j < 4; j++) t[j] = Offset[j] ^ t2[j]; + aes.wordsToBytes(t, cbytes); + for (var j=0; j < 16; j++) ciphertext[bstart+j] = cbytes[j]; + for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ block[j]; + } + + // encrypt and accumulate last block + var num_bytes = plaintext.length%16; + if ((num_bytes == 0) && (plaintext.length > 0)) num_bytes=16; + this._times2(Offset,Offset); + t = [0x00000000,0x00000000,0x00000000,0x00000000]; + t[3] = num_bytes*8; + for (var i=0; i < 4; i++) t[i] = Offset[i] ^ t[i]; + var Pad = new Array(4); + this._cipher.encryptBlock(t, Pad); + var pad_bytes = new Array(16); + aes.wordsToBytes(Pad, pad_bytes); + var tempbytes = []; + bstart = plaintext.length-num_bytes; + for (var i=0; i < num_bytes; i++) { + ciphertext[bstart+i] = plaintext[bstart+i] ^ pad_bytes[i]; + tempbytes[tempbytes.length] = plaintext[bstart+i]; + } + for (var i=num_bytes; i < 16; i++) + tempbytes[tempbytes.length] = pad_bytes[i]; + aes.bytesToWords(tempbytes, t); + for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t[i]; + + // compute authentication tag + this._times2(t,Offset); + for (var i=0; i < 4; i++) { + Offset[i] = t[i] ^ Offset[i]; + t[i] = Checksum[i] ^ Offset[i]; + } + this._cipher.encryptBlock(t,t2); + if (header.length > 0) { + this.PMAC(header, t); + for (var i=0; i < 4; i++) tag[i] = t[i] ^ t2[i]; + } else { + for (var i=0; i < 4; i++) tag[i] = t2[i]; + } +}; + + +/* Decrypts and verifies integrity of ciphertext, only verifies integrity of header. +ciphertext, plaintext, and header are arrays of bytes. tag is an array of 4 32-bit words. +Returns true if tag is valid, false otherwise. */ +cipherOCB.prototype.decrypt = function(ciphertext, plaintext, header, tag) { + var Offset = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + this._cipher.encryptBlock(this._cipher._iv, Offset); + + var t = new Array(4), t2 = new Array(4), block = new Array(4); + + // decrypt and accumulate first m-1 blocks + var num_blocks = Math.floor((ciphertext.length-1)/16); + var bstart = 0, pbytes = new Array(16); + this._cipher.scheduleDecrypt(); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + bstart = i*16; + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ ((ciphertext[bstart+(j<<2)+3]) | (ciphertext[bstart+(j<<2)+2] << 8) | (ciphertext[bstart+(j<<2)+1] << 16) | (ciphertext[bstart+(j<<2)] << 24)); + this._cipher.decryptBlock(t,t2); + for (var j=0; j < 4; j++) { + block[j] = Offset[j] ^ t2[j]; + Checksum[j] = block[j] ^ Checksum[j]; + } + aes.wordsToBytes(block,pbytes); + for (var j=0; j < 16; j++) + plaintext[bstart+j] = pbytes[j]; + } + + // decrypt and accumulate final block + var Pad = new Array(4), padbytes=[]; + this._cipher.scheduleEncrypt() + this._times2(Offset,Offset); + var num_bytes = ciphertext.length%16; + if ((num_bytes == 0) && (ciphertext.length > 0)) num_bytes=16; + t = [0x00000000,0x00000000,0x00000000,0x00000000]; + t[3] = num_bytes*8; + for (var i=0; i < 4; i++) t[i] = t[i] ^ Offset[i] + this._cipher.encryptBlock(t,Pad); + aes.wordsToBytes(Pad, padbytes); + bstart = ciphertext.length - num_bytes; + for (var i=0; i < num_bytes; i++) { + plaintext[bstart+i] = ciphertext[bstart+i] ^ padbytes[i]; + t[i] = plaintext[bstart+i]; + } + for (var i = num_bytes; i < 16; i++) + t[i] = padbytes[i]; + aes.bytesToWords(t,t2); + for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t2[i]; + + // compute valid authentication tag + this._times2(t, Offset); + for (var i=0; i < 4; i++) { + Offset[i] = Offset[i] ^ t[i]; + t[i] = Offset[i] ^ Checksum[i]; + } + var validTag = new Array(4); + this._cipher.encryptBlock(t,validTag); + t = new Array(4); + if (header.length > 0) { + this.PMAC(header, t); + for (var i=0; i < 4; i++) validTag[i] = validTag[i] ^ t[i]; + } + // compute results + for (var i=0; i < 4; i++) { + if (aes._hex(tag[i]) != aes._hex(validTag[i])) { + return false; + } + } + return true; +}; + + + +cipherOCB.prototype._times2 = function(dst, src) { + var carry = src[0]>>>31; + for (var i=0; i < 3; i++) + dst[i] = (src[i]<<1) | (src[i+1]>>>31); + dst[3] = (src[3]<<1) ^ (carry * 0x87); +}; + + + + + + + + +/* +jsCrypto + +sha256.js +Mike Hamburg, 2008. Public domain. + */ + + +function SHA256() { + if (!this.k[0]) + this.precompute(); + this.initialize(); +} + +SHA256.prototype = { + /* + init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19], + + k:[0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2], + */ + + init:[], k:[], + + precompute: function() { + var p=2,i=0,j; + + function frac(x) { return (x-Math.floor(x)) * 4294967296 | 0 } + + outer: for (;i<64;p++) { + for (j=2;j*j<=p;j++) + if (p % j == 0) + continue outer; + + if (i<8) this.init[i] = frac(Math.pow(p,1/2)); + this.k[i] = frac(Math.pow(p,1/3)); + i++; + } + }, + + initialize:function() { + this.h = this.init.slice(0); + this.word_buffer = []; + this.bit_buffer = 0; + this.bits_buffered = 0; + this.length = 0; + this.length_upper = 0; + }, + + // one cycle of SHA256 + block:function(words) { + var w=words.slice(0),i,h=this.h,tmp,k=this.k; + + var h0=h[0],h1=h[1],h2=h[2],h3=h[3],h4=h[4],h5=h[5],h6=h[6],h7=h[7]; + + for (i=0;i<64;i++) { + if (i<16) { + tmp=w[i]; + } else { + var a=w[(i+1)&15], b=w[(i+14)&15]; + tmp=w[i&15]=((a>>>7^a>>>18^a>>>3^a<<25^a<<14) + (b>>>17^b>>>19^b>>>10^b<<15^b<<13) + w[i&15] + w[(i+9)&15]) | 0; + } + + tmp += h7 + (h4>>>6^h4>>>11^h4>>>25^h4<<26^h4<<21^h4<<7) + (h6 ^ h4&(h5^h6)) + k[i]; + + h7=h6; h6=h5; h5=h4; + h4 = h3 + tmp | 0; + + h3=h2; h2=h1; h1=h0; + + h0 = (tmp + ((h1&h2)^(h3&(h1^h2))) + (h1>>>2^h1>>>13^h1>>>22^h1<<30^h1<<19^h1<<10)) | 0; + } + + h[0]+=h0; h[1]+=h1; h[2]+=h2; h[3]+=h3; + h[4]+=h4; h[5]+=h5; h[6]+=h6; h[7]+=h7; + }, + + update_word_big_endian:function(word) { + var bb; + if ((bb = this.bits_buffered)) { + this.word_buffer.push(word>>>(32-bb) ^ this.bit_buffer); + this.bit_buffer = word << bb; + } else { + this.word_buffer.push(word); + } + this.length += 32; + if (this.length == 0) this.length_upper ++; // mmhm.. + if (this.word_buffer.length == 16) { + this.block(this.word_buffer); + this.word_buffer = []; + } + }, + + update_word_little_endian:function(word) { + word = word >>> 16 ^ word << 16; + word = ((word>>>8) & 0xFF00FF) ^ ((word<<8) & 0xFF00FF00); + this.update_word_big_endian(word); + }, + + update_words_big_endian: function(words) { + for (var i=0; i<words.length; i++) this.update_word_big_endian(words[i]); + }, + + update_words_little_endian: function(words) { + for (var i=0; i<words.length; i++) this.update_word_little_endian(words[i]); + }, + + update_byte:function(byte) { + this.bit_buffer ^= (byte & 0xff) << (24 - (this.bits_buffered)); + this.bits_buffered += 8; + if (this.bits_buffered == 32) { + this.bits_buffered = 0; + this.update_word_big_endian(this.bit_buffer); + this.bit_buffer = 0; + } + }, + + update_string:function(string) { + throw "not yet implemented"; + }, + + finalize:function() { + var i, wb = this.word_buffer; + + wb.push(this.bit_buffer ^ (0x1 << (31 - this.bits_buffered))); + for (i = (wb.length + 2) & 15; i<16; i++) { + wb.push(0); + } + + wb.push(this.length_upper); + wb.push(this.length + this.bits_buffered); + + this.block(wb.slice(0,16)); + if (wb.length > 16) { + this.block(wb.slice(0,16)); + } + + var h = this.h; + this.initialize(); + return h; + } +} + +SHA256.hash_words_big_endian = function(words) { + var s = new SHA256(); + for (var i=0; i<=words.length-16; i+=16) { + s.block(words.slice(i,i+16)); + } + s.length = i << 5; // so don't pass this function more than 128M words + if (i<words.length) + s.update_words_little_endian(words.slice(i)); + return s.finalize(); +} + +SHA256.hash_words_little_endian = function(words) { + var w = words.slice(0); + for (var i=0; i<w.length; i++) { + w[i] = w[i] >>> 16 ^ w[i] << 16; + w[i] = ((w[i]>>>8) & 0xFF00FF) ^ ((w[i]<<8) & 0xFF00FF00); + } + return SHA256.hash_words_big_endian(w); +} + + + + + + + +/* + + jsCrypto + + * Random.js -- cryptographic random number generator + * Mike Hamburg, 2008. Public domain. + * + * This generator uses a modified version of Fortuna. Fortuna has + * excellent resilience to compromise, relies on a state file, and is + * intended to run for a long time. As such, it does not need an + * entropy estimator. Unfortunately, Fortuna's startup in low-entropy + * conditions leaves much to be desired. + * + * This generator features the following modifications. First, the + * generator does not create the n-th entropy pool until it exhausts + * the n-1-st. This means that entropy doesn't get "stuck" in pools + * 10-31, which will never be used on a typical webpage. It also + * means that the entropy will all go into a single pool until the + * generator is seeded. + * + * Second, there is a very crude entropy estimator. The primary goal + * of this estimator is to prevent the generator from being used in + * low-entropy situations. Corresponding to this entropy estimator, + * there is a "paranoia control". This controls how many bits of + * estimated entropy must be present before the generator is used. + * The generator cannot have more than 256 bits of actual entropy in + * the main pool; rather, the paranoia control is designed to deal + * with the fact that the entropy estimator is probably horrible. + * + * Third, the "statefile" is optional and stored in a cookie. As + * such, it is not protected from multiple simultaneous usage, and so + * is treated conservatively. + */ + +Random = { + /* public */ +NOT_READY: 0, +READY: 1, +REQUIRES_RESEED: 2, + + /* generate one random word */ +random_word: function(paranoia) { + return this.random_words(1, paranoia)[0]; +}, + + /* generate nwords random words, and return them in an array */ +random_words: function(nwords, paranoia) { + var out = [], i, readiness = this.is_ready(paranoia); + + if (readiness == this.NOT_READY) + throw("Random: generator isn't seeded!"); + + else if (readiness && this.REQUIRES_RESEED) + this._reseed_from_pools(!(readiness & this.READY)); + + for (i=0; i<nwords; i+= 4) { + if ((i+1) % this._max_words_per_burst == 0) + this._gate(); + + var g = this._gen_4_words(); + out.push(g[0],g[1],g[2],g[3]); + } + this._gate(); + + return out.slice(0,nwords); +}, + +set_default_paranoia: function(paranoia) { + this._default_paranoia = paranoia; +}, + + /* Add entropy to the pools. Pass data as an array, number or + * string. Pass estimated_entropy in bits. Pass the source as a + * number or string. + */ +add_entropy: function(data, estimated_entropy, source) { + source = source || "user"; + + var id = this._collector_ids[source] || + (this._collector_ids[source] = this._collector_id_next ++); + + var i, ty = 0; + + var t = new Date().valueOf(); + + var robin = this._robins[source]; + if (robin == undefined) robin = this._robins[source] = 0; + this._robins[source] = ( this._robins[source] + 1 ) % this._pools.length; + + switch(typeof(data)) { + + case "number": + data=[data]; + ty=1; + break; + + case "object": + if (!estimated_entropy) { + /* horrible entropy estimator */ + estimated_entropy = 0; + for (i=0; i<data.length; i++) { + var x = data[i]; + while (x>0) { + estimated_entropy++; + x = x >>> 1; + } + } + } + this._pools[robin].update_words_big_endian([id,this._event_id++,ty||2,estimated_entropy,t,data.length].concat(data)); + break; + + case "string": + if (!estimated_entropy) { + /* English text has just over 1 bit per character of entropy. + * But this might be HTML or something, and have far less + * entropy than English... Oh well, let's just say one bit. + */ + estimated_entropy = data.length; + } + this._pools[robin].update_words_big_endian([id,this._event_id++,3,estimated_entropy,t,data.length]) + this._pools[robin].update_string(data); + break; + + default: + throw "add_entropy: must give an array, number or string" + } + + var old_ready = this.is_ready(); + + /* record the new strength */ + this._pool_entropy[robin] += estimated_entropy; + this._pool_strength += estimated_entropy; + + /* fire off events */ + if (!old_ready && this.is_ready()) + this._fire_event("seeded", Math.max(this._strength, this._pool_strength)); + + if (!old_ready) + this._fire_event("progress", this.get_progress()); +}, + + /* is the generator ready? */ +is_ready: function(paranoia) { + var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ]; + + if (this._strength >= entropy_required) { + return (this._pool_entropy[0] > this._BITS_PER_RESEED && new Date.valueOf() > this._next_reseed) ? + this.REQUIRES_RESEED | this.READY : + this.READY; + } else { + return (this._pool_strength > entropy_required) ? + this.REQUIRES_RESEED | this.NOT_READY : + this.NOT_READY; + } +}, + + /* how close to ready is it? */ +get_progress: function(paranoia) { + var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ]; + + if (this._strength >= entropy_required) { + return 1.0; + } else { + return (this._pool_strength > entropy_required) ? + 1.0 : + this._pool_strength / entropy_required; + } +}, + + /* start the built-in entropy collectors */ +start_collectors: function() { + if (this._collectors_started) return; + + if (window.addEventListener) { + window.addEventListener("load", this._load_time_collector, false); + window.addEventListener("mousemove", this._mouse_collector, false); + } else if (document.attachEvent) { + document.attachEvent("onload", this._load_time_collector); + document.attachEvent("onmousemove", this._mouse_collector); + } + else throw("can't attach event"); + + this._collectors_started = true; +}, + + /* stop the built-in entropy collectors */ +stop_collectors: function() { + if (!this._collectors_started) return; + + if (window.removeEventListener) { + window.removeEventListener("load", this._load_time_collector); + window.removeEventListener("mousemove", this._mouse_collector); + } else if (window.detachEvent) { + window.detachEvent("onload", this._load_time_collector); + window.detachEvent("onmousemove", this._mouse_collector) + } + this._collectors_started = false; +}, + +use_cookie: function(all_cookies) { + throw "TODO: implement use_cookie"; +}, + + /* add an event listener for progress or seeded-ness */ +addEventListener: function(name, callback) { + this._callbacks[name][this._callback_i++] = callback; +}, + + /* remove an event listener for progress or seeded-ness */ +removeEventListener: function(name, cb) { + var i, j, cbs=this._callbacks[name], js_temp=[]; + + /* I'm not sure if this is necessary; in C++, iterating over a + * collection and modifying it at the same time is a no-no. + */ + + for (j in cbs) + if (cbs.hasOwnProperty[j] && cbs[j] === cb) + js_temp.push(j); + + for (i=0; i<js_temp.length; i++) { + j = js[i]; + delete cbs[j]; + } +}, + + /* private */ + _pools : [new SHA256()], + _pool_entropy : [0], + _reseed_count : 0, + _robins : {}, + _event_id : 0, + + _collector_ids : {}, + _collector_id_next : 0, + + _strength : 0, + _pool_strength : 0, + _next_reseed : 0, + _key : [0,0,0,0,0,0,0,0], + _counter : [0,0,0,0], + _cipher : undefined, + _default_paranoia : 6, + + /* event listener stuff */ + _collectors_started : false, + _callbacks : {progress: {}, seeded: {}}, + _callback_i : 0, + + /* constants */ + _MAX_WORDS_PER_BURST : 65536, + _PARANOIA_LEVELS : [0,48,64,96,128,192,256,384,512,768,1024], + _MILLISECONDS_PER_RESEED : 100, + _BITS_PER_RESEED : 80, + + /* generate 4 random words, no reseed, no gate */ +_gen_4_words: function() { + var words = []; + for (var i=0; i<3; i++) if (++this._counter[i]) break; + this._cipher.encryptBlock(this._counter, words); + return words; +}, + + /* rekey the AES instance with itself after a request, or every _MAX_WORDS_PER_BURST words */ +_gate: function() { + this._key = this._gen_4_words().concat(this._gen_4_words()); + this._cipher = new aes(this._key); +}, + + /* reseed the generator with the given words */ +_reseed: function(seedWords) { + this._key = SHA256.hash_words_big_endian(this._key.concat(seedWords)); + this._cipher = new aes(this._key); + for (var i=0; i<3; i++) if (++this._counter[i]) break; +}, + + /* reseed the data from the entropy pools */ +_reseed_from_pools: function(full) { + var reseed_data = [], strength = 0; + + this._next_reseed = new Date().valueOf() + this._MILLISECONDS_PER_RESEED; + + for (i=0; i<this._pools.length; i++) { + reseed_data = reseed_data.concat(this._pools[i].finalize()); + strength += this._pool_entropy[i]; + this._pool_entropy[i] = 0; + + if (!full && (this._reseed_count & (1<<i))) break; + } + + /* if we used the last pool, push a new one onto the stack */ + if (this._reseed_count >= 1 << this._pools.length) { + this._pools.push(new SHA256()); + this._pool_entropy.push(0); + } + + /* how strong was this reseed? */ + this._pool_strength -= strength; + if (strength > this._strength) this._strength = strength; + + this._reseed_count ++; + this._reseed(reseed_data); +}, + +_mouse_collector: function(ev) { + var x = ev.x || ev.clientX || ev.offsetX; + var y = ev.y || ev.clientY || ev.offsetY; + Random.add_entropy([x,y], 2, "mouse"); +}, + +_load_time_collector: function(ev) { + var d = new Date(); + Random.add_entropy(d, 2, "loadtime"); +}, + +_fire_event: function(name, arg) { + var j, cbs=Random._callbacks[name], cbs_temp=[]; + + /* I'm not sure if this is necessary; in C++, iterating over a + * collection and modifying it at the same time is a no-no. + */ + + for (j in cbs) { + if (cbs.hasOwnProperty(j)) { + cbs_temp.push(cbs[j]); + } + } + + for (j=0; j<cbs_temp.length; j++) { + cbs_temp[j](arg); + } +} +}; + diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.html b/frontend/gamma/tests/tests/Clipperz/DOM.html new file mode 100644 index 0000000..2060215 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/DOM.html @@ -0,0 +1,58 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> +</head> +<body> + +<pre id="test"> +<script> + Clipperz_IEisBroken = false; +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +</script><![endif]--> +<script type="text/javascript" src="DOM.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.test.js b/frontend/gamma/tests/tests/Clipperz/DOM.test.js new file mode 100644 index 0000000..a2aafc5 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/DOM.test.js @@ -0,0 +1,82 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +try { + var template; + var templateArgs; + var element; + var rowElement; + var tdElement; + + template = Clipperz.DOM.Helper.createTemplate( + [ + {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]}, + {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]}, + {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]}, + {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]}, + {tag:'td'} + ] + ); + + templateArgs = { + cardTitle: "Amazon.com", + directLoginsID: "Clipperz_PM_Components_directLogins_58", + faviconUrl: "http://www.amazon.com/favicon.ico", + latestUpdate: "", + reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551" + } + + element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[ + {tag:'theader'}, + {tag:'tbody', children:[ + {tag:'tr', id:'testRow'} + ]}, + {tag:'tfooter'} + ]}); + ok(element != null, "created the TABLE"); + + rowElement = Clipperz.DOM.get('testRow'); + ok(testRow != null, "created the ROW"); + + template.append(rowElement, templateArgs); + tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']); + ok(tdElement != null, "created the TD"); + +} catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} diff --git a/frontend/gamma/tests/tests/Clipperz/Date.html b/frontend/gamma/tests/tests/Clipperz/Date.html new file mode 100644 index 0000000..5712a52 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Date.html @@ -0,0 +1,54 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Date - TEST</title> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> +<script type="text/javascript" src="Date.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Date.test.js b/frontend/gamma/tests/tests/Clipperz/Date.test.js new file mode 100644 index 0000000..06f7dc8 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Date.test.js @@ -0,0 +1,66 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var tests = { + + '001_test': function () { + var date; + var locale; + +// date = new Date(0); +// date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); + + date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); + + locale = { + 'amDesignation': "am", + 'pmDesignation': "pm", +// 'shortDateFormat': "d/m/y", +// 'longDateFormat': "", + 'months': ["January", "February", "March", "April", + "May", "June", "July", "August", + "September", "October", "November", "December" ], + 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ] + } + + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4"); +// is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//============================================================================= + +SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js new file mode 100644 index 0000000..5bfb8c7 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js @@ -0,0 +1,910 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var testData = {} + +testData['Barb_Newman_data'] = ""; +testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + + "[Domain Administration Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: _ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Enquiro Domain]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" + + "" + "\n" + + "[Enquiro Domain Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Obsolete" + "\n" + + "" + "\n" + + "[Enquiro Domain Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" + + "" + "\n" + + "[Enquiro Domain Previous Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[Local Administrator Account for most Machines]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Local Administrator Account for some Machines]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Bugzilla]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[Client Services Linux Box]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 192.168.1.141" + "\n" + + "" + "\n" + + "[ENSQL2 BIOS]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Eye Tracking PC]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[IT Linux Box (Brainiac)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Maizal - Contract Developer Machine]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: 199.185.139.69:3399" + "\n" + + "Password: 123456" + "\n" + + "Notes: Software Development Contractors use remote access to access this machine.\r\n\r\nTested August 08.\r\n\r\nBe sure to send the info via two different delivery methods." + "\n" + + "" + "\n" + + "[NETGEAR WGR614v3]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: (192.168.1.11)" + "\n" + + "" + "\n" + + "[SEP Firewall (192.168.1.1)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed to this on 2007/01/31" + "\n" + + "" + "\n" + + "[SEP Firewall (192.168.1.1)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 192.168.1.1" + "\n" + + "" + "\n" + + "[UPS]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Wireless WPA-PSK]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: synergize" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Gord's Laptop Adminstrator 123456" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Wireless Access Point]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: SSID: ENWRLSS" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: WPA (TKIP) key is in password 123456" + "\n" + + "" + "\n" + + "[Adobe Account]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[APC UPS Website]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Web site for UPS Drivers/Manuals" + "\n" + + "" + "\n" + + "[ask.enquiro.com admin]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: ask.enquiro.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Jody is the admin\r\nChris is the editor" + "\n" + + "" + "\n" + + "[ask.enquiro.com ftp]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: ask.enquiro.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: ftp.ask.enquiro.com\r\nchanged 02 Jun 08" + "\n" + + "" + "\n" + + "[BulkRegister]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC " + "\n" + + "URL: https://www.bulkregister.com/Login.asp?" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for domain registrations" + "\n" + + "" + "\n" + + "[controlpanel.provisiondata.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: SEIReports.com Email address management" + "\n" + + "" + "\n" + + "[controlpanel.provisiondata.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: " + "\n" + + "Notes: Searchengineposition.com Email address management" + "\n" + + "" + "\n" + + "[Dell Canada]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to order equirpment from Dell\r\nCredit Card information is Tracy Kalancha AmEx" + "\n" + + "" + "\n" + + "[Feedback Server]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.nsurvey.org/members/login.aspx" + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ftp.enquiro.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.157)\r\nchanged 25 Jun 08" + "\n" + + "" + "\n" + + "[ftp.enquirolabs.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: enquirolabs.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed 04 Jun 08" + "\n" + + "" + "\n" + + "[ftp://ftp.b2bexpertseries.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: b2bexpertseries.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed 02 Jun 08" + "\n" + + "" + "\n" + + "[HSBC Bank Account]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: hsbc.ca" + "\n" + + "Password: " + "\n" + + "Notes: What is my Mother's Name: BARBARA\r\nSecurity Code is generated by the Security Device - you have 10 seconds to enter it." + "\n" + + "" + "\n" + + "[HSBC Fx Trading]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://fxtrading.hsbc.ca/fx-canada/login.html" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[Industry Canada - Canadian Company Capabilities (CCC)]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.ic.gc.ca" + "\n" + + "Password: 123456" + "\n" + + "Notes: Our listing: http://www.ic.gc.ca/app/ccc/srch/nvgt.do;jsessionid=0000RKFbMEOs2xvyRNoCF4pH3Ym:1247nks53?lang=eng&prtl=1&profile=cmpltPrfl&V_TOKEN=1203707557897&V_SEARCH.command=navigate&V_SEARCH.docsStart=1&V_SEARCH.resultsJSP=/prfl.do&V_DOCUMENT.docRank=1&V_SEARCH.docsCount=3&estblmntNo=234567061957&profileId=\r\n\r\nAndrew is responsible to update" + "\n" + + "" + "\n" + + "[Internet Secure CAD 1086]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.internetsecure.com/merchants/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[Internet Secure USD 1087]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.internetsecure.com/merchants/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[louisville.net-radar.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: FTP/FrontPage" + "\n" + + "" + "\n" + + "[Microsoft Licensing Program eOpen]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://eOpen.microsoft.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to record all Microsoft licensing information" + "\n" + + "" + "\n" + + "[OSTEC Job Site]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[OutOfMyGord.com Blog Login]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[OutOfMyGord.com Web Site]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[Paypal@enquiro.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[PRWeb]" + "\n" + + "Group: Websites" + "\n" + + "User Name: shermantracy" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ScanMail Logon]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Scanmail Logon (Anti-Spam)" + "\n" + + "" + "\n" + + "[secure.searchengineposition.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.237)" + "\n" + + "" + "\n" + + "[seireports.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.seireports.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[sepreports.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.sepreports.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for monthly client reporting" + "\n" + + "" + "\n" + + "[septraffic.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Spiceworks]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://endc3:9675/dashboard" + "\n" + + "Password: 123456" + "\n" + + "Notes: Is installed on endc3. \r\nIt's used to inventory the hardware attached to the network. \r\nIt's scheduled to run daily at 10:00am. \r\nMachine's must be on to be detected.\r\n\r\nNote: first character of password is a zero\r\n\r\n\r\nhttp://www.spiceworks.com" + "\n" + + "" + "\n" + + "[SurveyMonkey Enquiro]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.surveymonkey.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for small Enquiro surveys that aren't research related" + "\n" + + "" + "\n" + + "[SwishZone]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Tobii.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: " + "\n" + + "Notes: Tobii Website Logon" + "\n" + + "" + "\n" + + "[Trend Micro]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://olr.trendmicro.com/registration/" + "\n" + + "Password: 123456" + "\n" + + "Notes: 23 Jan 08 - I logged a bug with Trend to merge the DougWilson account with this account. /bn\r\n\r\n31 Jan 07 - Done!" + "\n" + + "" + "\n" + + "[Watchguard VPN Administrator]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://10.99.50.254" + "\n" + + "Password: 123456" + "\n" + + "Notes: Log on here to adminster the VPN, create wgx files and user passphrase\r\n\r\n\r\n\r\n" + "\n" + + "" + "\n" + + "[Watchguard VPN hardware support website]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.watchguard.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Enquiro's VPN hardware support website\r\n\r\n\r\n\r\n\r\n" + "\n" + + "" + "\n" + + "[Webtrain]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.webtrain.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to set up webinars. \r\nOwner username can give permisions to share with other users, and those users can create login's.\r\n\r\nHours are associated with the gord@searchengineposition.com account" + "\n" + + "" + "\n" + + "[Whitelist & Spam Trainer (Jeremy's)]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://my.email-as.net" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to:\r\n- add email addresses for clients, prospects or other contacts to the email whitelist\r\n- train Jeremy's system as spam or not spam.\r\n\r\nJeremy uses SpamAssassin " + "\n" + + "" + "\n" + + "[www.amazon.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[www.digitalriver.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[www.kelownarockets.com/store/ssl/admin/menu.asp]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: GEONOSIS" + "\n" + + "" + "\n"; + +testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + + "[www.webnames.ca]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 27 Mar 08 - Logged on but site has no domains listed. We no longer use this service, as I have been managing all domains on bulkregister for over a year. /bn" + "\n" + + "" + "\n" + + "[Yahooligans]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Webtrends Server" + "\n" + + "" + "\n" + + "[Anti-Virus]" + "\n" + + "Group: Services" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENDEV1 SQL Server Service Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[ENDEV2]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV2" + "\n" + + "" + "\n" + + "[Enquiro Domain - BackUpExec]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[Enquiro Domain - SEIService Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENAPP1" + "\n" + + "" + "\n" + + "[Enquiro Domain - SQLServer]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1/ENSQL2" + "\n" + + "" + "\n" + + "[Enquiro Domain - SQLServer]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENQUIRO/SEIService User Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSPS1 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Exchange Email Archive]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Cory changed this on 2007/01/31 to 123456" + "\n" + + "" + "\n" + + "[MySQL]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[Sharepoint Single Sign On Acct]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[SourceSafe on ENDEV1]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[Bugzilla Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[Bugzilla Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[ENDOC1 Goldmine SQL2005]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: added 19 Oct 2007 with the Goldmine upgrade." + "\n" + + "" + "\n" + + "[Enquiro Survey Database Account]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Enquiro Survey Development Account]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSQL2]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[OutOfMyGord.com Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[Sharepoint Services Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Anti-Virus (Trend)]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: http://ensql1.enquiro.net/officescan/console/cgi/cgiChkMasterPwd.exe" + "\n" + + "" + "\n" + + "[Anti-Virus Uninstall]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Anti-Virus Unload]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENEXC1 Security Certificate]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Required for using Outlook over HTTP" + "\n" + + "" + "\n" + + "[Eye Tracking Study PDF]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: PDF Password" + "\n" + + "" + "\n" + + "[Google Account - Research Department]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to track web history for personalization" + "\n" + + "" + "\n" + + "[Google Account - Research Department]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to track web history for personalization" + "\n" + + "" + "\n" + + "[Goldmine Administrator]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Adding users to Goldmine" + "\n" + + "" + "\n" + + "[AIG Insurance]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Allstate Insurance Company]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Babyzone]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Babyzone Google Sitemaps Login" + "\n" + + "" + "\n" + + "[Habeas]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Hanley Wood]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Kaboose Inc.]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Lesley University]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Plastic Products Mfg]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Project Server Extranet User]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Rent Chalets]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Siemens Communications]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Sterling Commerce]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Enquiro]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[clientlogs.enquiro.net]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[HrHero]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[Kaboose]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[Royal Roads University]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[ftp.enquiro.com]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.157)" + "\n" + + "" + "\n" + + "[Gene6 FTP Admistrator]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: ensql2" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to create FTP folders for client use" + "\n" + + "" + "\n"; + + +//------------------------------------------------------------------------- +// +// This data is probably in the KeePassX export format that is not supported right now +// +testData['Jordan_Curzon_data'] = "" + + "*** Group: Financial ***" + "\n" + + "" + "\n" + + " Title: Allstate" + "\n" + + " Username: jones" + "\n" + + " Url: allstate.com" + "\n" + + " Password: bobfred" + "\n" + + " Comment:" + "\n" + + "" + "\n" + + " Title: NW Natural" + "\n" + + " Username: jones@gmail.com" + "\n" + + " Url: nwnatural.com" + "\n" + + " Password: bobfred" + "\n" + + " Comment: Account number: 097oe9u0098098" + "\n" + + "" + "\n"; + diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html new file mode 100644 index 0000000..a8a1317 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html @@ -0,0 +1,59 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.KeePassExportProcessor - test</title> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> + + <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> + <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script --> + +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> +<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js new file mode 100644 index 0000000..0ce4c91 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js @@ -0,0 +1,141 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'test1_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + 'test2_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + 'test3_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'Barb_Newman_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs); +// deferredResult.addCallback(function () { return testData['Barb_Newman_data']; }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records"); + return aResult; + }); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Domain Administration Account\", \"Group\":\"Windows\", \"User Name\":\"_ABC\", \"URL\":\"\", \"Password\":\"123456\", \"Notes\":\"\"}", "Barb's first record data matches"); + return aResult; + }); +// deferredResult.callback(); + deferredResult.callback(testData['Barb_Newman_data']); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'Jordan_Curzon_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs); + deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records"); + return aResult; + }); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Allstate\", \"Username\":\"jones\", \"Url\":\"allstate.com\", \"Password\":\"bobfred\", \"Comment\":\"\"}", "Barb's first record data matches"); + return aResult; + }); + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.KeyPassExportProcessor", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html new file mode 100644 index 0000000..f856f98 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html @@ -0,0 +1,52 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="KeyValueObjectStore.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js new file mode 100644 index 0000000..53cf5d3 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js @@ -0,0 +1,255 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var objectStore; + + objectStore = new Clipperz.KeyValueObjectStore(); + + ok(objectStore != null, "created an object store"); + + objectStore.setValue('key', "value"); + is(objectStore.getValue('key'), "value", "can store and read a value to a simple key"); + + objectStore.setValue('key', "overwritten value"); + is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value"); + + objectStore.setValue('record.keys', [1, 2, 3]); + is( + MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}), + 0, + "getting a partial key returns the whole content associate with that key" + ); + is( + MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]), + 0, + "accessing data using a key.path return the matching content" + ); + is( + MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2), + 0, + "accessing data using a key.path return the matching content, even inside an array" + ); + + is( + objectStore.setValue('key', "value"), + "value", + "setting a value return the value itself, as a convenience to chain deferred methods" + ); + + is( + objectStore.getValue('not_set_key'), + null, + "accessing a previously undefined key will return null" + ); + is( + objectStore.getValue('record.not_set_key'), + null, + "accessing a previously undefined key will return null, even if part of the path is defined" + ); + is( + objectStore.getValue('not_set_path.not_set_key'), + null, + "accessing a previously undefined key will return null, even if using a completely undefined path" + ); + + objectStore.removeAllData(); + is( + objectStore.getValue('key'), + null, + "getting a value after a 'removeAllData' return no value" + ); + + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simple_deferredGetOrSet_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false}); + deferredResult.addMethod(objectStore, 'setValue', 'key', testValue); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deferredGetOrSet_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_test", {trace:false}); + deferredResult.addMethod(objectStore, 'setValue', 'key.path', testValue); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'simple_deferredGetOrSet_withMissingValue_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_withMissingValue_test", {trace:false}); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deferredGetOrSet_withMissingValue_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_withMissingValue_test", {trace:false}); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deleteObjectKey': function () { + var someValues; + var objectStore; + + someValues = { + 'key1': { + 'key1_1': "value 1.1", + 'key1_2': "value 1.2" + }, + 'key2': { + 'key2_1': { + 'key2.1.1': "value 2.1.1", + 'key2.1.2': "value 2.1.2" + }, + 'key2_2': "value 2.2" + } + } + + objectStore = new Clipperz.KeyValueObjectStore(); + objectStore.initWithValues(someValues); + objectStore.removeValue('key2.key2_1'); + + SimpleTest.is(objectStore.getValue('key1.key1_1'), "value 1.1", "The first element is still there"); + SimpleTest.is(objectStore.getValue('key1.key1_2'), "value 1.2", "The second element is still there"); + SimpleTest.is(objectStore.getValue('key2.key2_1'), null, "The deleted element is actually gone"); + SimpleTest.is(MochiKit.Base.keys(objectStore.getValue('key2')).length, 1, "Even the key is not stored anylonger"); + SimpleTest.is(objectStore.getValue('key2.key2_2'), "value 2.2", "The sibling of the deleted element is still there"); + }, + + //------------------------------------------------------------------------- + + 'accessDataUsingANumericKey': function () { + var someValues; + var objectStore; + + someValues = { + '1': "value 1", + '2': "value 2" + } + + objectStore = new Clipperz.KeyValueObjectStore(); + objectStore.initWithValues(someValues); + + SimpleTest.is(objectStore.getValue(1), "value 1", "The first element is accessed even using a numeric key"); + + objectStore.setValue(3, "value 3"); + SimpleTest.is(objectStore.getValue('3'), "value 3", "I can set the value using a numeric key and get it with a string key"); + }, + + //------------------------------------------------------------------------- + + 'isEmpty_test': function () { + var someValues; + var objectStore; + + someValues = { + '1': "value 1", + '2': "value 2" + } + + objectStore = new Clipperz.KeyValueObjectStore(); + SimpleTest.is(objectStore.isEmpty(), true, "A newly initialized KeyValueStore is empty"); + + objectStore.initWithValues(someValues); + SimpleTest.is(objectStore.isEmpty(), false, "Once the KeyValueStore is initialized with some values, it is no logner empty"); + + objectStore.removeAllData(); + SimpleTest.is(objectStore.isEmpty(), true, "A KeyValueStore is empty after invoking the 'removeAllData' method"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.KeyValueObjectStore", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html new file mode 100644 index 0000000..9bd344e --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html @@ -0,0 +1,59 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.BookmarkletProcessor - test</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="BookmarkletProcessor.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js new file mode 100644 index 0000000..21776a3 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js @@ -0,0 +1,132 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) { +// var configuration; + +//try { +// configuration = Clipperz.Base.evalJSON(aConfiguration); +//} catch (exception) { +// console.log("EXCEPTION", exception); +// throw exception; +//} + +//console.log("configuration", configuration); + + if (shouldFail == true) { + try { + Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); + SimpleTest.ok(false, "vulnerability not caught - " + aMessage); + } catch(exception) { + SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage); + } + } else { + try { + Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); + SimpleTest.ok(true, "configuration correctly checked - " + aMessage); + } catch(exception) { + SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage); +// console.log(exception); + } + } +} + +//############################################################################# + +var tests = { + + //------------------------------------------------------------------------- + + 'simpleAmazonConfiguration_test': function () { + var bookmarkletConfigurationString; + + bookmarkletConfigurationString = "{"+ + "\"page\": {\"title\": \"Sign In\"},\n" + + "\"form\": {" + + "\"attributes\": {" + + "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" + + "\"method\": \"post\"" + + "},\n" + + "\"inputs\": [" + + "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" + + "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" + + "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata2\",\n\"value\": \"Default Plug-in Java Embedding Plugin 0.9.6.4 Shockwave Flash 90124RealPlayer Plugin QuickTime Plug-in 7.5.5 Flip4Mac Windows Media Plugin 2.2 4||1440-900-878-24-*-*-*\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" + + "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" + + "{\"value\": \"new-user\",\n\"checked\": false},\n" + + "{\"value\": \"sign-in\",\n\"checked\": true}" + + "]}" + + "]" + + "},\n" + + "\"version\": \"0.2.3\"" + + "}"; + testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration"); + }, + + //------------------------------------------------------------------------- + + 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () { + var bookmarkletConfigurationString; + + bookmarkletConfigurationString = "{" + + "\"page\": {\"title\": \"Example Attack\"}," + + "\"form\": { " + + "\"attributes\": { " + + "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " + + "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " + + "\"method\": null " + + "}, " + + "\"inputs\": [" + + "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " + + "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" + + "]" + + "}," + + "\"version\": \"0.2.3\" " + + "}"; + testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "hacked configuration that is trying to inject a XSS attack vector. It should not fail, as it is responsability of the direct login to avoid triggering such attack vector"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.BookmarkletProcessor", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js new file mode 100644 index 0000000..9dec232 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js @@ -0,0 +1,841 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +testData = { + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_data': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', + v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', + statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', + userDetailsVersion: '0.3', + records: { + '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { + data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + }, + '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { + data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009', + currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', + versions: { + '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { + header: '####', + data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:31 CEST 2008', + updateDate: 'Fri Oct 17 17:00:31 CEST 2008', + accessDate: 'Fri Oct 17 17:00:31 CEST 2008' + }, + '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { + header: '####', + data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Fri Oct 17 16:49:20 CEST 2008', + accessDate: 'Fri Oct 17 16:54:23 CEST 2008' + }, + '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { + header: '####', + data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:13 CEST 2008', + updateDate: 'Fri Oct 17 17:00:13 CEST 2008', + accessDate: 'Fri Oct 17 17:00:13 CEST 2008' + }, + '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { + header: '####', + data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:59:31 CEST 2008', + updateDate: 'Fri Oct 17 16:59:31 CEST 2008', + accessDate: 'Fri Oct 17 16:59:31 CEST 2008' + }, + '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { + header: '####', + data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==', + version: '0.3', + creationDate: 'Mon Oct 27 08:58:49 CET 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009' + }, + 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { + header: '####', + data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:57:17 CEST 2008', + updateDate: 'Fri Oct 17 16:57:17 CEST 2008', + accessDate: 'Fri Oct 17 16:57:17 CEST 2008' + }, + 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { + header: '####', + data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', + version: '0.3', + creationDate: 'Fri Oct 17 16:58:00 CEST 2008', + updateDate: 'Fri Oct 17 16:58:00 CEST 2008', + accessDate: 'Fri Oct 17 16:58:00 CEST 2008' + }, + 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { + header: '####', + data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', + version: '0.3', + creationDate: 'Fri Oct 17 17:01:59 CEST 2008', + updateDate: 'Fri Oct 17 17:01:59 CEST 2008', + accessDate: 'Mon Oct 27 08:57:58 CET 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009', + currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + versions: { + '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { + header: '####', + data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', + version: '0.2', + creationDate: 'Tue Apr 17 19:13:41 CEST 2007', + updateDate: 'Tue Apr 17 19:13:41 CEST 2007', + accessDate: 'Tue Apr 17 19:13:41 CEST 2007' + }, + '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { + header: '####', + data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Wed Mar 14 14:53:11 CET 2007', + accessDate: 'Wed Mar 14 15:24:35 CET 2007' + }, + '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { + header: '####', + data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', + version: '0.2', + creationDate: 'Wed Mar 14 15:33:00 CET 2007', + updateDate: 'Wed Mar 14 15:33:00 CET 2007', + accessDate: 'Tue Apr 17 19:12:56 CEST 2007' + }, + '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { + header: '####', + data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:26:35 CET 2007', + updateDate: 'Wed Mar 14 15:26:35 CET 2007', + accessDate: 'Wed Mar 14 15:26:35 CET 2007' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:30:09 CET 2007', + updateDate: 'Wed Mar 14 15:30:09 CET 2007', + accessDate: 'Wed Mar 14 15:30:09 CET 2007' + }, + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', + version: '0.2', + creationDate: 'Tue Apr 17 19:17:52 CEST 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009' + }, + '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { + header: '####', + data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:27:35 CET 2007', + updateDate: 'Wed Mar 14 15:27:35 CET 2007', + accessDate: 'Wed Mar 14 15:27:35 CET 2007' + }, + 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { + header: '####', + data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', + version: '0.2', + creationDate: 'Tue Apr 17 19:15:09 CEST 2007', + updateDate: 'Tue Apr 17 19:15:09 CEST 2007', + accessDate: 'Tue Apr 17 19:17:01 CEST 2007' + } + } + }, + '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { + data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', + version: '0.3', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { + header: '####', + data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:55 CET 2007', + updateDate: 'Wed Mar 14 18:39:55 CET 2007', + accessDate: 'Mon Oct 27 09:07:56 CET 2008' + }, + '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { + header: '####', + data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', + version: '0.3', + creationDate: 'Mon Oct 27 09:09:11 CET 2008', + updateDate: 'Mon Oct 27 09:09:11 CET 2008', + accessDate: 'Mon Oct 27 09:15:58 CET 2008' + }, + '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { + header: '####', + data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Wed Mar 14 18:39:35 CET 2007', + accessDate: 'Wed Mar 14 18:39:35 CET 2007' + }, + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', + version: '0.3', + creationDate: 'Mon Oct 27 09:16:14 CET 2008', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009' + } + } + }, + '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { + data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009' + } + } + }, + '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { + data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009', + currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', + versions: { + '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { + header: '####', + data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009' + } + } + }, + '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { + data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009' + } + } + }, + '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { + data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009', + currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', + versions: { + '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { + header: '####', + data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009' + } + } + }, + '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { + data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { + header: '####', + data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:10:17 CEST 2007', + accessDate: 'Tue May 01 01:10:17 CEST 2007' + }, + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', + version: '0.2', + creationDate: 'Tue May 01 01:13:27 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: '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', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==', + version: '0.3', + creationDate: 'Thu Feb 12 12:54:37 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009' + }, + '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': { + header: '####', + data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:45:43 CET 2009', + accessDate: 'Thu Feb 12 12:45:43 CET 2009' + }, + '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': { + header: '####', + data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==', + version: '0.3', + creationDate: 'Thu Feb 12 12:47:39 CET 2009', + updateDate: 'Thu Feb 12 12:47:39 CET 2009', + accessDate: 'Thu Feb 12 12:47:39 CET 2009' + } + } + }, + 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { + data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': { + header: '####', + data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Mar 14 15:51:17 CET 2007', + accessDate: 'Wed Apr 25 10:37:27 CEST 2007' + }, + '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': { + header: '####', + data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO', + version: '0.2', + creationDate: 'Wed Apr 25 10:39:26 CEST 2007', + updateDate: 'Wed Apr 25 10:39:26 CEST 2007', + accessDate: 'Wed Apr 25 10:39:26 CEST 2007' + }, + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg', + version: '0.2', + creationDate: 'Wed Apr 25 11:14:05 CEST 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009' + }, + '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': { + header: '####', + data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=', + version: '0.2', + creationDate: 'Wed Apr 25 10:51:49 CEST 2007', + updateDate: 'Wed Apr 25 10:51:49 CEST 2007', + accessDate: 'Wed Apr 25 10:51:49 CEST 2007' + }, + 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': { + header: '####', + data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==', + version: '0.2', + creationDate: 'Wed Apr 25 11:01:21 CEST 2007', + updateDate: 'Wed Apr 25 11:01:21 CEST 2007', + accessDate: 'Wed Apr 25 11:01:21 CEST 2007' + }, + 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': { + header: '####', + data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=', + version: '0.2', + creationDate: 'Wed Apr 25 10:59:57 CEST 2007', + updateDate: 'Wed Apr 25 10:59:57 CEST 2007', + accessDate: 'Wed Apr 25 10:59:57 CEST 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 10:38:17 CEST 2007', + updateDate: 'Wed Apr 25 10:38:17 CEST 2007', + accessDate: 'Wed Apr 25 10:38:17 CEST 2007' + }, + 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': { + header: '####', + data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=', + version: '0.2', + creationDate: 'Wed Apr 25 10:56:58 CEST 2007', + updateDate: 'Wed Apr 25 10:56:58 CEST 2007', + accessDate: 'Wed Apr 25 10:56:58 CEST 2007' + }, + 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': { + header: '####', + data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==', + version: '0.2', + creationDate: 'Wed Apr 25 10:58:33 CEST 2007', + updateDate: 'Wed Apr 25 10:58:33 CEST 2007', + accessDate: 'Wed Apr 25 10:58:33 CEST 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009', + currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + versions: { + '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': { + header: '####', + data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==', + version: '0.2', + creationDate: 'Wed Mar 14 17:27:40 CET 2007', + updateDate: 'Wed Mar 14 17:27:40 CET 2007', + accessDate: 'Wed Mar 14 19:00:21 CET 2007' + }, + '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': { + header: '####', + data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl', + version: '0.2', + creationDate: 'Wed Mar 14 16:09:07 CET 2007', + updateDate: 'Wed Mar 14 16:09:07 CET 2007', + accessDate: 'Wed Mar 14 16:39:40 CET 2007' + }, + '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': { + header: '####', + data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST', + version: '0.2', + creationDate: 'Wed Mar 14 19:01:05 CET 2007', + updateDate: 'Wed Mar 14 19:01:05 CET 2007', + accessDate: 'Tue Apr 17 19:20:33 CEST 2007' + }, + '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': { + header: '####', + data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb', + version: '0.2', + creationDate: 'Wed Mar 14 17:17:20 CET 2007', + updateDate: 'Wed Mar 14 17:17:20 CET 2007', + accessDate: 'Wed Mar 14 17:22:06 CET 2007' + }, + 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': { + header: '####', + data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Wed Mar 14 16:06:54 CET 2007', + accessDate: 'Wed Mar 14 16:06:54 CET 2007' + }, + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v', + version: '0.2', + creationDate: 'Tue Apr 17 19:23:41 CEST 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009' + }, + 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': { + header: '####', + data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC', + version: '0.2', + creationDate: 'Tue Apr 17 19:22:08 CEST 2007', + updateDate: 'Tue Apr 17 19:22:08 CEST 2007', + accessDate: 'Tue Apr 17 19:22:08 CEST 2007' + } + } + }, + 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { + data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009', + currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + versions: { + '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': { + header: '####', + data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD', + version: '0.2', + creationDate: 'Wed Mar 14 16:51:02 CET 2007', + updateDate: 'Wed Mar 14 16:51:02 CET 2007', + accessDate: 'Wed Mar 14 16:51:02 CET 2007' + }, + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=', + version: '0.2', + creationDate: 'Mon Jul 09 15:10:15 CEST 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009' + }, + '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': { + header: '####', + data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw', + version: '0.2', + creationDate: 'Wed Mar 21 12:56:43 CET 2007', + updateDate: 'Wed Mar 21 12:56:43 CET 2007', + accessDate: 'Wed Apr 25 09:59:58 CEST 2007' + }, + '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': { + header: '####', + data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm', + version: '0.2', + creationDate: 'Sat May 19 11:26:44 CEST 2007', + updateDate: 'Sat May 19 11:26:44 CEST 2007', + accessDate: 'Mon Jul 09 15:08:39 CEST 2007' + }, + '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': { + header: '####', + data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC', + version: '0.2', + creationDate: 'Wed Mar 14 16:38:54 CET 2007', + updateDate: 'Wed Mar 14 16:38:54 CET 2007', + accessDate: 'Wed Mar 14 16:38:54 CET 2007' + }, + 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': { + header: '####', + data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Wed Mar 14 16:36:20 CET 2007', + accessDate: 'Wed Mar 14 16:38:12 CET 2007' + }, + 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': { + header: '####', + data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q', + version: '0.2', + creationDate: 'Wed Apr 25 10:04:29 CEST 2007', + updateDate: 'Wed Apr 25 10:04:29 CEST 2007', + accessDate: 'Sat May 19 11:22:01 CEST 2007' + }, + 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': { + header: '####', + data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5', + version: '0.2', + creationDate: 'Wed Mar 14 16:52:12 CET 2007', + updateDate: 'Wed Mar 14 16:52:12 CET 2007', + accessDate: 'Wed Mar 21 12:16:29 CET 2007' + } + } + }, + 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { + data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': { + header: '####', + data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=', + version: '0.2', + creationDate: 'Wed Mar 14 16:45:40 CET 2007', + updateDate: 'Wed Mar 14 16:45:40 CET 2007', + accessDate: 'Wed Mar 14 16:45:40 CET 2007' + }, + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=', + version: '0.2', + creationDate: 'Wed Mar 14 16:47:01 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:20:58 CET 2007', + accessDate: 'Wed Mar 14 16:43:46 CET 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': { + header: '####', + data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Wed Mar 14 13:35:58 CET 2007', + accessDate: 'Wed Mar 14 13:35:58 CET 2007' + }, + '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': { + header: '####', + data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=', + version: '0.2', + creationDate: 'Wed Mar 14 19:24:49 CET 2007', + updateDate: 'Wed Mar 14 19:24:49 CET 2007', + accessDate: 'Wed Mar 14 19:24:49 CET 2007' + }, + '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': { + header: '####', + data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz', + version: '0.2', + creationDate: 'Wed Mar 14 17:41:15 CET 2007', + updateDate: 'Wed Mar 14 17:41:15 CET 2007', + accessDate: 'Wed Mar 14 17:41:15 CET 2007' + }, + '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': { + header: '####', + data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=', + version: '0.2', + creationDate: 'Wed Mar 14 19:25:28 CET 2007', + updateDate: 'Wed Mar 14 19:25:28 CET 2007', + accessDate: 'Thu May 10 15:00:47 CEST 2007' + }, + '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': { + header: '####', + data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=', + version: '0.2', + creationDate: 'Wed Mar 14 14:46:36 CET 2007', + updateDate: 'Wed Mar 14 14:46:36 CET 2007', + accessDate: 'Wed Mar 14 17:40:01 CET 2007' + }, + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=', + version: '0.2', + creationDate: 'Thu May 10 15:01:21 CEST 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009' + }, + 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': { + header: '####', + data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=', + version: '0.2', + creationDate: 'Wed Mar 14 17:43:29 CET 2007', + updateDate: 'Wed Mar 14 17:43:29 CET 2007', + accessDate: 'Wed Mar 14 19:23:51 CET 2007' + } + } + }, + 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { + data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA', + version: '0.3', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': { + header: '####', + data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==', + version: '0.2', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Mar 14 17:39:39 CET 2007', + accessDate: 'Tue Apr 17 19:09:44 CEST 2007' + }, + '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': { + header: '####', + data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==', + version: '0.2', + creationDate: 'Tue Apr 17 19:12:39 CEST 2007', + updateDate: 'Tue Apr 17 19:12:39 CEST 2007', + accessDate: 'Wed Feb 13 15:27:04 CET 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 15:29:04 CET 2008', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 15:28:28 CET 2008', + updateDate: 'Wed Feb 13 15:28:28 CET 2008', + accessDate: 'Wed Feb 13 15:28:28 CET 2008' + }, + 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': { + header: '####', + data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==', + version: '0.2', + creationDate: 'Tue Apr 17 19:11:33 CEST 2007', + updateDate: 'Tue Apr 17 19:11:33 CEST 2007', + accessDate: 'Tue Apr 17 19:11:33 CEST 2007' + } + } + }, + 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': { + data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + + 'syntaxFix': "" +} diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html new file mode 100644 index 0000000..181a3bf --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html @@ -0,0 +1,71 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Connection - test</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="Connection.data.js"></script> +<script type="text/javascript" src="Connection.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js new file mode 100644 index 0000000..e4d0d15 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js @@ -0,0 +1,255 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var connection; + + SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1"); + + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current'](); + SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol"); + + SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleProxy_tests': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy(); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy}); + SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'login_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy: proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "First handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), + A: MochiKit.Base.operator.truth + } + } + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "Second handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + M1: MochiKit.Base.operator.truth + } + } + } + }); + }); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.addErrback(SimpleTest.ok, false, "the login procedure should succeed, and NOT going through this code path"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'login_with_toll_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:true}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy:proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("login_with_toll_test", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "knock step", + functionName: 'knock', + parameters: { + requestType: MochiKit.Base.partial(MochiKit.Base.operator.eq, "CONNECT") + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "First handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), + A: MochiKit.Base.operator.truth + } + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "Second handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + M1: MochiKit.Base.operator.truth + } + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + }); + }); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getUserDetails_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:false}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy:proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("getUserDetails_test", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(proxy, 'setShouldCheckExpectedRequests', [ + { + name: "Get user details", + functionName: 'message', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "getUserDetails"), + srpSharedSecret: MochiKit.Base.operator.truth + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + } + ]); + deferredResult.addMethod(connection, 'message', 'getUserDetails'); + deferredResult.addCallback(function(aResult) { + SimpleTest.ok(aResult['header'] != null, "got user details - header"); + SimpleTest.ok(aResult['statistics'] != null, "got user details - statistics"); + SimpleTest.ok(aResult['version'] == '0.3', "got user details - version"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.Connection", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html new file mode 100644 index 0000000..f95e994 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html @@ -0,0 +1,281 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Crypto - TEST</title> + + <script> + jslog_config_enabled = true; + clipperz_profiling_enabled = true; + </script> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> +<!-- + <script> + MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); + MochiKit.Logging.logger.useNativeConsole = true; + </script> +--> +</head> +<body> +<pre id="test"> + +<script type="text/javascript"> + + +Clipperz_PM_Crypt_test = function() { + var key; + + var plainData; + var encryptedData; + var decryptedData; + + var result; + var expectedResult; + + var plainText; + var longPlainText; + + key = 'trustno1'; + + plainText = "Lorem ipsum dolor sit amet"; + longPlainText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; + + // + // hashing + // + plainData = new Clipperz.ByteArray(plainText); + + result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); + is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text"); + + result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); + is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text"); + + + plainData = new Clipperz.ByteArray(longPlainText); + + result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); + is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text"); + + result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); + is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text"); + + + // + // encrypting / decripting + // + plainData = plainText; + + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData); + is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a short text"); + + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData); + is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a short text"); + +//console.time("encrypt-256-short"); + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData); +//console.timeEnd("encrypt-256-short"); +//console.time("decrypt-256-short"); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData); +//console.timeEnd("decrypt-256-short"); + is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a short text"); + + + plainData = longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText; + +/* + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData); + is(plainData, decryptedData, "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a long text"); + + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData); + is(plainData, decryptedData, "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a long text"); + + encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData); + decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData); + is(plainData, decryptedData, "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a long text"); +*/ + + { + var deferredResult; + var startTime; +// var nonce; + +// nonce = new Clipperz.ByteArray("0x00000000000000000000000000000000"); + plainData = plainData + plainData + plainData + plainData + plainData + plainData + plainData + plainData; +MochiKit.Logging.logDebug("plainData length: " + plainData.length); + startTime = new Date(); + + deferredResult = new MochiKit.Async.Deferred(); + + deferredResult.addCallback(function() { + return Clipperz.PM.Crypto.deferredEncrypt({key:key, value:plainData, version:'0.3'}); +// return Clipperz.PM.Crypto.encrypt(key, plainData, '0.3' / *Clipperz.PM.Crypto.encryptingFunctions.currentVersion* /); + }); + deferredResult.addCallback(function(aResult) { + MochiKit.Logging.logDebug("encrypting: " + (new Date() - startTime)); + startTime = new Date(); + return aResult; + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + deferredResult.addCallback(function(aResult) { + MochiKit.Logging.logDebug("pause: " + (new Date() - startTime)); + startTime = new Date(); + return aResult; + }); + deferredResult.addCallback(function(anEncryptedValue) { + return Clipperz.PM.Crypto.deferredDecrypt({key:key, value:anEncryptedValue, version:'0.3'}); + }); + deferredResult.addCallback(function(aResult) { + MochiKit.Logging.logDebug("decrypting: " + (new Date() - startTime)); + startTime = new Date(); + return aResult; + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + deferredResult.addBoth(function(aDecryptedValue) { + is(plainData, aDecryptedValue, "deferredEncript/deferredDecript functions work with a long text"); + }); + + + +/* + deferredResult.addCallback(function(aResult) { + var i,c; + var currentChar; + var unicode; + + unicode = 150; + + c = 100000; + startTime = new Date(); + for (i=0; i<c; i++) { + currentChar = String.fromCharCode(unicode+1); + } + MochiKit.Logging.logDebug("String.fromCharCode: " + (new Date() - startTime)); + }); + + deferredResult.addCallback(function(aResult) { + var i,c; + var currentByte; + var unicode; + + currentByte = 150; + + c = 100000; + startTime = new Date(); + for (i=0; i<c; i++) { + unicode = (currentByte & 0x0f) << (6+6); + } + MochiKit.Logging.logDebug("(currentByte & 0x0f) << (6+6): " + (new Date() - startTime)); + }); + + deferredResult.addCallback(function(aResult) { + var i,c; + var currentByte; + var byteArray; + + currentByte = 150; + + byteArray = new Clipperz.ByteArray(plainData); + c = byteArray.length(); + startTime = new Date(); + for (i=0; i<c; i++) { + currentByte = byteArray.byteAtIndex(i); + } + MochiKit.Logging.logDebug("byteAtIndex: " + (new Date() - startTime)); + }); +*/ + + deferredResult.addBoth(function() { + SimpleTest.ok(true, "COMPLETED all tests"); + SimpleTest.finish(); + }) + + deferredResult.callback(); + } + + SimpleTest.waitForExplicitFinish(); +} + +//############################################################################# + +try { + MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', Clipperz_PM_Crypt_test); + + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + SimpleTest.waitForExplicitFinish(); +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html new file mode 100644 index 0000000..094a58d --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html @@ -0,0 +1,153 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + +<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> --> + +</head> +<body> +<pre id="test"> + +<script type="text/javascript"> + +try { + var key; + var shortText; + var longText; + var veryLongText; + var byteArray; + var plainText; + var encryptedText; + var decryptedText; + var startTime, endTime; + var startTime1, endTime1; + var ClipperzCryptoVersion; + var i,c; + + ClipperzCryptoVersion = '0.3'; + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + key = 'trustno1'; + + shortText = "Lorem ipsum dolor sit amet"; + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; + veryLongText = ""; + c = 100; + for (i=0; i<100; i++) { + veryLongText += longText; + } + nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + + //-------------------------------------------------------------- + // + // longText encryption performance + // + //-------------------------------------------------------------- + + plainText = longText; + +startTime = new Date(); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce); +endTime = new Date(); +//console.log("[1] encryption time: " + (endTime - startTime)); + is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")"); + is(encryptedText, "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", "encrypted text"); + decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); + is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)"); + +startTime = new Date(); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText); +endTime = new Date(); +//console.log("[2] encryption time: " + (endTime - startTime)); + is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")"); + decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); + is(decryptedText, plainText, "encrypt <-> decrypt works"); + + //-------------------------------------------------------------- + // + // veryLongText encryption performance + // + //-------------------------------------------------------------- +/* + plainText = veryLongText; + +startTime = new Date(); + encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText); +endTime = new Date(); +//console.log("[3] encryption time: " + (endTime - startTime)); + is((endTime - startTime < 35000), true, "[3] Need to improve some more (" + (endTime - startTime) + ")"); + decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); + is(decryptedText, plainText, "encrypt <-> decrypt works"); +*/ + +//############################################################################# + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html new file mode 100644 index 0000000..f5b0a60 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html @@ -0,0 +1,169 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Crypto - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + + +<!-- ================================================================================ --> <script> +//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); +//MochiKit.Logging.logger.useNativeConsole = true; + +//----------------------------------------------------------------------------- + +encodePassword = function (anEvent) { + var username; + var password; + var encodedPassword; + var srpConnection; + + anEvent.stop(); + + srpConnection = new Clipperz.PM.Connection.SRP['1.1'](); + + username = MochiKit.DOM.getElement('username').value; + passphrase = MochiKit.DOM.getElement('passphrase').value; + encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password']; + + MochiKit.DOM.getElement('encodedPassword').value = encodedPassword; +} + +//----------------------------------------------------------------------------- + +decryptData = function (anEvent) { + var deferredResult; + var key; + var version; + var value; + + key = MochiKit.DOM.getElement('key').value; + version = MochiKit.DOM.getElement('version').value; + value = MochiKit.DOM.getElement('encryptedText').value; + + anEvent.stop(); + + deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false}); + deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value}); + deferredResult.addCallback(Clipperz.Base.serializeJSON); + deferredResult.addCallback(function (aValue) { + MochiKit.DOM.getElement('decryptedText').value = aValue; + }); + deferredResult.addErrback(alert); + + deferredResult.callback(); +} + +//----------------------------------------------------------------------------- + +encryptData = function (anEvent) { + var deferredResult; + var key; + var version; + var value; + + key = MochiKit.DOM.getElement('key').value; + version = MochiKit.DOM.getElement('version').value; + value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value); + + anEvent.stop(); + + deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false}); + deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value}); + deferredResult.addCallback(function (aValue) { + MochiKit.DOM.getElement('encryptedText').value = aValue; + }); + deferredResult.addErrback(alert); + + deferredResult.callback(); +} + +//----------------------------------------------------------------------------- + +init = function () { + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + + + MochiKit.Signal.connect('decryptForm', 'onsubmit', decryptData) + MochiKit.Signal.connect('decryptButton', 'onclick', decryptData) + MochiKit.Signal.connect('encryptButton', 'onclick', encryptData) + +// MochiKit.Signal.connect('encodePassword', 'onclick', encodePassword) +} + +//----------------------------------------------------------------------------- + +MochiKit.DOM.addLoadEvent(init); + +</script> <!-- =============================================================================== --> + +</head> +<body> +<!-- + <form id='computeKey'> + <input type='text' name='username' value='' id='username' size='30'/> + <input type='text' name='passphrase' value='' id='passphrase' size='30'/> + <input type='button' name='encode' value='encode' id='encodePassword'> + <input type='text' name='encodedPassword' value='' id='encodedPassword' size='30'/> + </form> + <hr> +--> + <form id='decryptForm'> + <div><textarea id='encryptedText' cols='80' rows='20'></textarea></div> + <div><input type='text' name='key' value='' id='key' size='30'/></div> + <div><input type='text' name='version' value='0.3' id='version' /></div> + <div><input type='button' name='decrypt' value='decrypt' id='decryptButton'> <input type='button' name='encrypt' value='encrypt' id='encryptButton'></div> + <hr> + <div><textarea id='decryptedText' cols='80' rows='20' style="background-color: lightgrey;"><result></textarea></div> + </form> + +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html new file mode 100644 index 0000000..e11adfd --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html @@ -0,0 +1,103 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.DirectLogin - test</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> + + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> +<script> + Clipperz_IEisBroken = false; +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +Clipperz_normalizedNewLine = '\x0d\x0a'; +</script><![endif]--> + +</head> +<body> + +<pre id="test"> +<script> + Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); +</script> +<script type="text/javascript" src="User.data.js"></script> +<script type="text/javascript" src="User.data.old.js"></script> +<script type="text/javascript" src="DirectLogin.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js new file mode 100644 index 0000000..d385c8c --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js @@ -0,0 +1,195 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + +/* + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + ... + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + + + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + ... + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); // WEB PASSWORD (0) + deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); // DIGG (1) + deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); // SAP (2) + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + DirectLogin references + - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 // Yahoo! Mail + - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 // (Yahoo! Groups) + - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f // (Flickr) + - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e // (My Yahoo!) +*/ + //------------------------------------------------------------------------- + + 'editDirectLoginLabel_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addCallback(function (aDirectLogin) { + var innerDeferredResult; + var updatedLabel; + + updatedLabel = "updated Yahoo! Mail label"; + + innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs); + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct."); + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes."); + +//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")}); + innerDeferredResult.addMethod(user, 'saveChanges'); +//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")}); + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left."); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data."); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addCallback(function (aDirectLogin) { + var innerDeferredResult; + var originalLabel; + var updatedLabel; + + originalLabel = "Yahoo! Mail"; + updatedLabel = "updated Yahoo! Mail label"; + + innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test <inner>", someTestArgs); + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(originalLabel, "The label of the selected direct login is correct."); + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes [2]."); + + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', originalLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the directLogin should report no pending changes."); + + innerDeferredResult.addMethod(aDirectLogin.record(), 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the record should report no pending changes."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the user should report no pending changes."); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'bindingValues_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("DirectLogin.bindingValues_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addMethodcaller('bindingValues'); + deferredResult.addCallback(function (someBindingValues) { + SimpleTest.is(MochiKit.Base.keys(someBindingValues).length, 2, "there should be 2 bindings for this direct login"); + SimpleTest.is(someBindingValues['login'], 'joe.clipperz', "the login field should be filled with 'joe.clipperz'"); + SimpleTest.is(someBindingValues['passwd'], 'enfvDG1RxAsl', "the passwd field should be filled with 'enfvDG1RxAsl'"); + }) + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.DirectLogin", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js new file mode 100644 index 0000000..6c0bf49 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js @@ -0,0 +1,33 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +directLoginConfigurations = { + 'Yahoo! Mail': '{\n "page": {\n "title": "Yahoo! Mail"\n },\n "form": {\n "attributes": {\n "action": "https://login.yahoo.com/config/login?",\n "method": "post"\n },\n "inputs": [\n {\n "type": "hidden",\n "name": ".tries",\n "value": "1"\n },\n {\n "type": "hidden",\n "name": ".src",\n "value": "ym"\n },\n {\n "type": "hidden",\n "name": ".md5",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".hash",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".js",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".last",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "promo",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".intl",\n "value": "us"\n },\n {\n "type": "hidden",\n "name": ".bypass",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".partner",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".u",\n "value": "5gp62cl2vg3ov"\n },\n {\n "type": "hidden",\n "name": ".v",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".challenge",\n "value": "iBEY0IK6k3t9Uals32mrTos8s48p"\n },\n {\n "type": "hidden",\n "name": ".yplus",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".emailCode",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "pkg",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "stepid",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".ev",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "hasMsgr",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".chkP",\n "value": "Y"\n },\n {\n "type": "hidden",\n "name": ".done",\n "value": "http://mail.yahoo.com"\n },\n {\n "type": "hidden",\n "name": ".pd",\n "value": "ym_ver%3d0%26c="\n },\n {\n "type": "text",\n "name": "login",\n "value": ""\n },\n {\n "type": "password",\n "name": "passwd",\n "value": ""\n },\n {\n "type": "checkbox",\n "name": ".persistent",\n "value": "y"\n },\n {\n "type": "submit",\n "name": ".save",\n "value": "Sign In"\n }\n ]\n },\n "version": "0.2"\n}', + 'Parallels': '{"page": {"title": "Parallels Account"},\n"form": {"attributes": {"action": "https://www.parallels.com/account/",\n"method": "post"},\n"inputs": [{"type": "text",\n"name": "Email",\n"value": ""},\n{"type": "password",\n"name": "Password",\n"value": ""}]},\n"version": "0.2.3"}', + __syntaxFix__: "syntax fix" +};
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html new file mode 100644 index 0000000..699c06d --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html @@ -0,0 +1,66 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js new file mode 100644 index 0000000..0a4fe0c --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js @@ -0,0 +1,225 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function(someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveKeyFunction': MochiKit.Base.noop, + 'retrieveRemoteDataFunction': function () { return "--"}, + 'encryptedDataKeypath': '--', + 'encryptedVersionKeypath': '--' + }); + SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject"); + + deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [ + MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'), + function(aResult) { + SimpleTest.is(aResult, "--", "setting and getting serverData works"); + } + ], someTestArgs); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'decrypt_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [ + MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), + function (someEncryptedData) { + return { + 'data': someEncryptedData, + 'version': version + } + } + ], someTestArgs)//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); + deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData'); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult, rawData, "encrypt and decrypt works"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getValue_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = { + key1: 'value1', + key2: 'value2' + }; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'reference': "testReference", + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [ + MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), + function (someEncryptedData) { + return { + 'data': someEncryptedData, + 'version': version + } + } + ], someTestArgs)//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "getting 'key1' works"); + deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "After accessing a value, hasAnyCleanTextData returns false"); + + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(false, "if nothing has changed, the object should return not pending changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'deleteAllCleanTextData'); + deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "After deleting all cleanTextData, hasAnyCleanTextData returns false"); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "getting 'key1' (also after a lock) works correctly"); + + deferredResult.addMethod(encryptedRemoteObject, 'setValue', 'key1', 'new value1'); + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('new value1', "after setting a new value, it is correctly returned"); + + deferredResult.addMethod(encryptedRemoteObject, 'values'); + deferredResult.addCallback(function (someValues) { + SimpleTest.is(someValues['key1'], 'new value1', "the value got straight from the objectStore is correct"); + }); + + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(true, "once a value has been changed, the object should return that there're some pending changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'revertChanges'); + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting the changes should return the object to its initial state, without any peding changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "also the value of the changed item has been restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'encrypt_with_new_object_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; +// var version; +// var rawData; + + key = "just a random key"; +// version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; +// rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveRemoteDataFunction': MochiKit.Base.noop + }); + + encryptedRemoteObject.setValue('key1', "value1"); + encryptedRemoteObject.setValue('key2', "value2"); + encryptedRemoteObject.setValue('key3', "value3"); + + deferredResult = new Clipperz.Async.Deferred("encrypt_with_new_object_test", someTestArgs); + deferredResult.addMethod(encryptedRemoteObject, 'prepareRemoteDataWithKey', key); + deferredResult.addCallback(MochiKit.Base.itemgetter('data')); + deferredResult.collectResults({ + 'key': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'value': MochiKit.Async.succeed, + 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) + }); + deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult['key1'], "value1", "encrypt and decrypt works for first element"); + SimpleTest.is(aResult['key2'], "value2", "encrypt and decrypt works for second element"); + SimpleTest.is(aResult['key3'], "value3", "encrypt and decrypt works for third element"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.EncryptedRemoteObject", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html new file mode 100644 index 0000000..a9bac22 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html @@ -0,0 +1,105 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.User - test</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> + + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> +<script> + Clipperz_IEisBroken = false; +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +Clipperz_normalizedNewLine = '\x0d\x0a'; +</script><![endif]--> + +</head> +<body> + +<pre id="test"> +<script> + Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); +</script> +<script type="text/javascript" src="User.data.js"></script> +<script type="text/javascript" src="OneTimePassword.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js new file mode 100644 index 0000000..0171714 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js @@ -0,0 +1,198 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'isValidOneTimePasswordValue_test': function (someTestArgs) { + var otp; + var notOTP; + + otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg'; + SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1"); + + notOTP = 'trustno1'; + SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1"); + + return MochiKit.Async.succeed('done'); + }, + + //------------------------------------------------------------------------- + + 'loginUsingOtp_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "test"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one single card"); + + deferredResult.addMethod(user, 'getOneTimePasswords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one OTP"); + + deferredResult.addMethod(user, 'getOneTimePasswords'); + deferredResult.addCallback(MochiKit.Base.itemgetter(0)); + deferredResult.addCallback(MochiKit.Base.methodcaller('status')); + deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.shouldFail("trying to login using the same OTP twice"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var user3; + var otp; + + otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + newPassphrase = 'tset'; + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}}); + + deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has only a single card"); + + deferredResult.addMethod(user, 'changePassphrase', newPassphrase); + deferredResult.addMethod(user, 'logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has oly a single card"); + deferredResult.addMethod(user2, 'logout'); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginUsingOtpAndWrongUsername_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var wrongUsername; + var passphrase; + + username = "test"; + wrongUsername = "tset"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:wrongUsername, getPassphraseFunction:function () { return passphrase;}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUsingOtpAndWrongUsername_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + deferredResult.shouldFail("login in using the wrong username with the OTP should fail"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.shouldFail("trying to reuse the same OTP should fail, even if now it is used with the correct username"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginUserWithAPassphraseLookingExactlyLikeAnOTP_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var username; + var passphrase; + + username = "otp_user"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // passphrase + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUserWithAPassphraseLookingExactlyLikeAnOTP_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['otp_user_test']); + + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one single card"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.OneTimePassword", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html new file mode 100644 index 0000000..c349e0d --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html @@ -0,0 +1,98 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.Record - test</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> + + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> + +<pre id="test"> +<script> + Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); +</script> +<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script> +<script type="text/javascript" src="User.data.js"></script> +<script type="text/javascript" src="Record.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js new file mode 100644 index 0000000..7d024d9 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js @@ -0,0 +1,1285 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) { + var deferredResult; + var record; + +//console.log("#### new Clipperz.PM.DataModel.Record [5]"); + record = new Clipperz.PM.DataModel.Record({ + 'reference': '<<< record reference >>>', + 'retrieveKeyFunction': MochiKit.Base.noop, + 'retrieveRemoteDataFunction': function (aRecordReference) { + SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data"); + return MochiKit.Async.succeed({ + // fake server payload + 'data': "#### fake encrypted data ####", + 'version': "0.x", + 'currentVersion': { + 'reference': "<<< fake record version reference >>>", + 'data': "#### fake encrypted data ####", + 'version': "0.x" + } + }); + }, + 'updateDate': "Thu, 10 May 2007 13:01:21 UTC", +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version', + + 'retrieveIndexDataFunction': function (aRecordReference) { + SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data"); + return MochiKit.Async.succeed({ + key: '<< key >>', + label: '<< label >>', + notes: '<< notes >>' + }); + }, + 'updateIndexDataFunction': MochiKit.Base.noop + + }); + + deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs); + deferredResult.addMethod(record, 'label'); + deferredResult.addTest('<< label >>', "Record returns the right value for label"); + deferredResult.addMethod(record, 'notes'); + deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header"); + deferredResult.addMethod(record, 'getRemoteData'); + deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data")); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) { + var record; + + try { +//console.log("#### new Clipperz.PM.DataModel.Record [6]"); + record = new Clipperz.PM.DataModel.Record({reference:'--'}); + SimpleTest.ok(false, "creating a record without all parameters should raise an exception"); + } catch(exception) { +// SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception"); + SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception"); + } + }, + + //------------------------------------------------------------------------- + + 'recordFromOldData_version_0.1_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var recordID; + +//console.log("#### new Clipperz.PM.DataModel.Record [7]"); +/* + record = new Clipperz.PM.DataModel.Record({ + 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, { + 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', + 'version': '0.1', + 'currentVersion': { + 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', + 'version': '0.1' + } + + }), + + 'retrieveIndexDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, { +// 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6', + 'label': '<< label >>', + 'notes': '<< notes >>' + }), + 'updateIndexDataFunction': MochiKit.Base.noop, + 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006' + }); +*/ + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a"; + + deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs); + + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "When first loaded, the record has no clean text data"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('label'); + deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('notes'); + deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(true, "After reading some values, the record has some clean text data"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields"); + }); + deferredResult.callback(); + + return deferredResult; + + }, + + //------------------------------------------------------------------------- + + 'removeDirectLogin': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving there should be not any pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'removeDirectLoginAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "the user has 22 initially"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addDirectLoginAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}'); + + deferredResult.addMethod(user, 'revertChanges'); +//deferredResult.addCallback(function () { console.log("###################################"); }); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes"); + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.setValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addDirectLoginAndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index"); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "the user has some clean text data"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest(null, "The label of a initially created direct login is empty"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bookmarkletConfiguration'); + deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty")); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Email')); + deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); // "userID" + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Password')); + deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); // "password" + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('favicon'), + deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"), + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('reference'); + deferredResult.addCallback(function (aReference) { + directLoginReference = aReference; + }); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "after adding a new direct login, the record should have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "after adding a new direct login, the record has now 5 direct logins"); + + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving the changes, the user should NOT have pending changes"); + + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.setValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the record, when reloaded from scratch, has still 5 direct logins"); + + deferredResult.getValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('4')); // TODO: accessing directLogins by index is not really nice + deferredResult.setValue('directLogin_2'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('New direct login', "The label of the direct login has been correctly saved"); + + deferredResult.getValue('directLogin_2'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Email')); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "The value bound to the direct login 'Email' field is correct"); + + deferredResult.getValue('directLogin_2'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Password')); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('enfvDG1RxAsl', "The value bound to the direct login 'Password' field is correct"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'readDirectLoginAttributes': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + var directLoginID = '03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.readDirectLoginAttributes", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c')); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(13, "Amazon direct login has 13 inputs"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsFormValue')); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "Amazon direct login has 1 field needing a form value"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsBinding')); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(2, "Amazon direct login has 2 field needing a binding"); + + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(2, "Amazon direct login has just two bindings"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('email')); + deferredResult.addMethodcaller('fieldKey'); + deferredResult.addTest('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2', "Amazon direct login 'email' binding points to the correct field"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('password')); + deferredResult.setValue('passwordBinding'); + deferredResult.addMethodcaller('fieldKey'); + deferredResult.addTest('01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7', "Amazon direct login 'password' binding points to the correct field"); + + deferredResult.getValue('passwordBinding'); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('password', "Amazon direct login 'password' binding points to the 'password' field"); + + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "Amazon direct login has just one formValue"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('action')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('sign-in', "Amazon direct 'action' formValue is set to 'sign-in'"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginLabel': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var oldLabel; + var newLabel; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + oldLabel = "Yahoo! Mail"; + newLabel = "YAHOO! Mail"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginLabel", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('label'); + deferredResult.addTest(oldLabel, "the current label of the direct login"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('setLabel', newLabel); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginFormValueAndRestoreChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginFormValueAndRestoreChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.setValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest(null, "original formValue value matches"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('setValue', 'y'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('value'); + deferredResult.addTest('y', "the newly set value is retained"); + + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself"); + + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('value'); + deferredResult.addTest(null, "the old formValue value is correctly restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfigurationAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfigurationAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + + deferredResult.addCallback(function (aDirectLogin) { +// var newBookmarkletConfiguration; + +// newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}'; + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration [inner call]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration"), + + MochiKit.Base.method(aDirectLogin, 'favicon'), + Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"), + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']), + + MochiKit.Base.method(aDirectLogin, 'favicon'), + Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes on the direct login"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the record"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the user"), + + MochiKit.Base.method(aDirectLogin, 'revertChanges'), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newBookmarkletConfiguration; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}'; + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 1]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (1)"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The original direct login had 1 form values"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('type'), + Clipperz.Async.Test.is('checkbox', "the original formValue has the expected type"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the original formValue is correct (1)"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('setValue', 'y'), + + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', newBookmarkletConfiguration), + MochiKit.Base.method(user, 'saveChanges'), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the 'login' binding is still valid after the new configuration is set"), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 2]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(newBookmarkletConfiguration, "the direct login has the new bookmarkletConfiguration even after being reloaded"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(3, "The new direct login has 3 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the new 'login' direct login binding still points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The new direct login had 1 form values (1)"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the formValue is still correctly set"), + + MochiKit.Base.noop + ], someTestArgs); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfiguration_changingTheStructure_AndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 1]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (2)"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The original direct login had 1 form values"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the original formValue is correct (2)"), + + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']), + MochiKit.Base.method(user, 'saveChanges'), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(0, "The new direct login has no form values"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('passwd'), + Clipperz.Async.Test.is(null, "the 'passwd' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Email'), + Clipperz.Async.Test.ok("the 'Email' binding should exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Password'), + Clipperz.Async.Test.ok("the 'Password' binding should exist within the new configuration"), + + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Email'), + MochiKit.Base.methodcaller('field'), + Clipperz.Async.Test.is(null, "the 'Email' binding should not point to any field, yet"), + + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 2]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Base.evalJSON, + MochiKit.Base.itemgetter('form'), + Clipperz.Async.Test.isDeeply(Clipperz.Base.evalJSON(directLoginConfigurations['Parallels'])['form'], "the direct login has the new bookmarkletConfiguration even after being reloaded"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new -reloaded- direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(0, "The new direct login has no form values (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editFieldValueAndRestoreIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'fake.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a field should trigger pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'joe.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "restoring the value of a field should revert pending changes"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessFieldValues': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.accessFieldValues", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fieldWithLabel', 'userID'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editFieldValueAndSaveIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + var passwordFieldID = '01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs); +// deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the selected record has 5 versions"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }); + deferredResult.addTest({'label': 'password', 'value': 'HRRd7ycaFVG6'}, "the current field label and value match", true); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.addMethodcaller('setValue', '<<pippo>>'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a field should trigger pending changes"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving, there should be no pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(6, "the selected record, after saving a new version, has now 6 versions"); + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(6, "the selected record - reloaded from the db - has 6 versions"); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }); + deferredResult.addTest({'label': 'password', 'value': '<<pippo>>'}, "the current field label and value match", true); + +/* +deferredResult.addCallback(function (aValue) { console.log("FIELDS", aValue); return aValue}); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'joe.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "restoring the value of a field should revert pending changes"); +*/ + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editNotesAndRestoreIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editNotesAndRestoreIt", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('notes'); + deferredResult.addTest('', "the current note is the empty string even if nothing is set on the record"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('setNotes', ''); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "setting notes to an empty string should be the same has not having the notes altogether"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadAllRecordVersions': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.loadAllRecordVersions", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('Amazon.com', "the selected record is the expected one"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the 'Amazon' record has 5 versions"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getCurrentRecordVersion'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "the current version of 'Amazon' record has 3 fields"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'createDirectLoginAndDeleteItAfterward': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.Record", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js new file mode 100644 index 0000000..5684dbd --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js @@ -0,0 +1,1941 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +testData = { + + //----------------------------------------------------------------------------- + + 'simpleLogin_001': function () { return { + 'users': [ + { + 'username': "joe", + 'passphrase': "eoj", + 'version': "0.2", + 'connectionVersion': "0.2", + 'records': { + 'record 1': { + 'notes': "Some notes here", + 'fields': [ + { 'name': "username", 'value': "joe", 'type': "text" }, + { 'name': "password", 'value': "1234", 'type': "password" } + ], + 'directLogins': { + "record 1 direct login": { + 'configuration': "", + 'bindings': [ + ], + 'favicon': "http://www.example.com/favicon.ico" + } + } + } + }, + 'otp': [ + "12345678 90abcdef 12345678 90abcdef", + "fedcba09 87654321 fedcba09 87654321" + ] + } + ] + };}(), + + //----------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', + v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', + statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', + userDetailsVersion: '0.3', + records: { + '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { + data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + }, + '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { + data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009', + currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', + versions: { + '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { + header: '####', + data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:31 CEST 2008', + updateDate: 'Fri Oct 17 17:00:31 CEST 2008', + accessDate: 'Fri Oct 17 17:00:31 CEST 2008' + }, + '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { + header: '####', + data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Fri Oct 17 16:49:20 CEST 2008', + accessDate: 'Fri Oct 17 16:54:23 CEST 2008' + }, + '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { + header: '####', + data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:13 CEST 2008', + updateDate: 'Fri Oct 17 17:00:13 CEST 2008', + accessDate: 'Fri Oct 17 17:00:13 CEST 2008' + }, + '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { + header: '####', + data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:59:31 CEST 2008', + updateDate: 'Fri Oct 17 16:59:31 CEST 2008', + accessDate: 'Fri Oct 17 16:59:31 CEST 2008' + }, + '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { + header: '####', + data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==', + version: '0.3', + creationDate: 'Mon Oct 27 08:58:49 CET 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009' + }, + 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { + header: '####', + data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:57:17 CEST 2008', + updateDate: 'Fri Oct 17 16:57:17 CEST 2008', + accessDate: 'Fri Oct 17 16:57:17 CEST 2008' + }, + 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { + header: '####', + data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', + version: '0.3', + creationDate: 'Fri Oct 17 16:58:00 CEST 2008', + updateDate: 'Fri Oct 17 16:58:00 CEST 2008', + accessDate: 'Fri Oct 17 16:58:00 CEST 2008' + }, + 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { + header: '####', + data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', + version: '0.3', + creationDate: 'Fri Oct 17 17:01:59 CEST 2008', + updateDate: 'Fri Oct 17 17:01:59 CEST 2008', + accessDate: 'Mon Oct 27 08:57:58 CET 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009', + currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + versions: { + '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { + header: '####', + data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', + version: '0.2', + creationDate: 'Tue Apr 17 19:13:41 CEST 2007', + updateDate: 'Tue Apr 17 19:13:41 CEST 2007', + accessDate: 'Tue Apr 17 19:13:41 CEST 2007' + }, + '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { + header: '####', + data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Wed Mar 14 14:53:11 CET 2007', + accessDate: 'Wed Mar 14 15:24:35 CET 2007' + }, + '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { + header: '####', + data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', + version: '0.2', + creationDate: 'Wed Mar 14 15:33:00 CET 2007', + updateDate: 'Wed Mar 14 15:33:00 CET 2007', + accessDate: 'Tue Apr 17 19:12:56 CEST 2007' + }, + '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { + header: '####', + data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:26:35 CET 2007', + updateDate: 'Wed Mar 14 15:26:35 CET 2007', + accessDate: 'Wed Mar 14 15:26:35 CET 2007' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:30:09 CET 2007', + updateDate: 'Wed Mar 14 15:30:09 CET 2007', + accessDate: 'Wed Mar 14 15:30:09 CET 2007' + }, + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', + version: '0.2', + creationDate: 'Tue Apr 17 19:17:52 CEST 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009' + }, + '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { + header: '####', + data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:27:35 CET 2007', + updateDate: 'Wed Mar 14 15:27:35 CET 2007', + accessDate: 'Wed Mar 14 15:27:35 CET 2007' + }, + 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { + header: '####', + data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', + version: '0.2', + creationDate: 'Tue Apr 17 19:15:09 CEST 2007', + updateDate: 'Tue Apr 17 19:15:09 CEST 2007', + accessDate: 'Tue Apr 17 19:17:01 CEST 2007' + } + } + }, + '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { + data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', + version: '0.3', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { + header: '####', + data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:55 CET 2007', + updateDate: 'Wed Mar 14 18:39:55 CET 2007', + accessDate: 'Mon Oct 27 09:07:56 CET 2008' + }, + '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { + header: '####', + data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', + version: '0.3', + creationDate: 'Mon Oct 27 09:09:11 CET 2008', + updateDate: 'Mon Oct 27 09:09:11 CET 2008', + accessDate: 'Mon Oct 27 09:15:58 CET 2008' + }, + '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { + header: '####', + data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Wed Mar 14 18:39:35 CET 2007', + accessDate: 'Wed Mar 14 18:39:35 CET 2007' + }, + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', + version: '0.3', + creationDate: 'Mon Oct 27 09:16:14 CET 2008', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009' + } + } + }, + '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { + data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009' + } + } + }, + '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { + data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009', + currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', + versions: { + '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { + header: '####', + data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009' + } + } + }, + '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { + data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009' + } + } + }, + '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { + data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009', + currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', + versions: { + '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { + header: '####', + data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009' + } + } + }, + '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { + data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { + header: '####', + data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:10:17 CEST 2007', + accessDate: 'Tue May 01 01:10:17 CEST 2007' + }, + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', + version: '0.2', + creationDate: 'Tue May 01 01:13:27 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: 'HxkHstm/nWfD4tTwtaDqycSrP6vR7O9JUQrVXp90Z+prnnvuUMH3SbOlv+AQZFJotuM9VVOh52yWcl8TuSJ5SYR6pwmZVcK9GJd3aRH48wBRrsi9do+pgyxmzfpBm+CMnUtI63LMPfyz/zPndUQSke5+G/Q1b8ZddaShjYHWHEifjdswmKg68FOSu7RuElR/FwRCBwuT02vMRdrjwxSxxM5zWB3vqzN4xKi/jkvqGgIc21m8adTQoxAJARleZiyWXzfPO/MpUs3vA6nxH6ZO1kEayGw3ZAR3nFBiW0UjjdXCBI2b4PcUP0nSJKetRSiudo2cUKfYxsWgEPoG+PM/CQFdnlfGcPf4d0QYnkU+JHff99mLJRmz7VWH7ZeW10NTxzTEr47diHLpyufZ4knnRgfhfKtwOvgmG1n1lXyXDRVTeyfCCX+mB5qdB79ujqon1BiLOGQfLWZ8bDyTZAakpcRJb8qk3zP004XwN5BpO+jC2waMcUEuH62gSQeelGZ19pzBiRz8kn3ZZ8iviX46Wwk3X1TTke9teF7t6Pop4pRkaAj2z2ji0mqWtv4T/3QW4Xgf1mKaT2t8ZaucGvZ3jrxm0CW/Ra3Cy1v1APwRPvKnY5i/WPDS1elq3vNF0NY7EQbXrxBX7hgGpUGRcHSKYsuftIquJFv0HV31jRhd99nZz6Otx82xidWbroIS+37o2Rr56X/AwkLn3DgH+V/YAK24z3Otku+lbaorXnv6C8ZDUhcce2CjgEuCFPmv928YOahgmE0Q0uKniwVXgXACevvACEsduvW32JhI4D4cjRWcSzB6YhqXE8QYCQwK97OykJ30Szd/ZYykiXjdjymyqFOmI9tZqi/PUOKRJ9NhYZaVAeLEFUunvKJWHNs50CqElw6z7nAvBwYyEVvvc+rSpMb2Z/KAWLMzv5R3MeITVUph/RlRlMIrJr0lBhmghnLRt6cGRQcDA2Si3tGAm34K+BpxVbTK0ilTrwzCfaE3Q+dvBTFRcZzMcPFLHL7Mho1/kNMb5S0izIpsNPCb26yH/gueYghVmhRL76HQAH79k00uJcyXt57AYlOYQM7FKDHWciWtJDOMNjVFDYQJJSAS39HukwrLnAdqCNrabrS+AuWhX+CqmMlKQ0PRszjtT7oQaAcgJd0uPOVz3IsjyZ/CmrzSxM+c4iPXugkiiyS2HYU7EEz9IEDvoqwv3Djcy4+3oxPUdmIJGMz2Mk5UXMDyMpqfuujirZI5r5WQWWQLivD9mid5RWDiQp2NYwpnQ/J0emEpWFlf/XkmXW+Em/A0+DOeJtHB729WsKYEvMWOB1nuITkqPJShf8FVEunHzUuLKsG3Hf5yEc3isB5rWGO8hPCueVUKgiS/NSCxQ+iinBTO3gUl+hzK+yaajQUomCx7+N9/n5HTLM5kFsUxZ8gfG3LMEK1iaza4KZeS8Hmb58NU3e3MI0FvlZHa787LqNO226awx3sX/nuTMX+LXx9v8/AMrkRdbzlcYbe6xWRWcBGiTirbTV/CXMgCdop60xfRqCskQPbfj89zpHQS/GiTJjhUwh6XKc/TpbjQJ6OZ6dAQBDxexPa+sjr70kLARxeUhvDUytp/zd/A5OBpuZ0aUz530aQEj8BCAk18vdUks7TWcpiw+/Lq//QLu/9uLU/rLanu2DFUYGXo7bJzy2QpzuoHqKDqa3anK9Gs34NfcIjUbeMUyCzd6CFj+1vGNIk4zZi44PZvmqxZXI8XcxboTpnheNRksjw36FbhIKWMWksIIq+mh4XMnkQcS83PB9rwMHsYY4nKfCwddYfRlbVjcjX+jSlz0r6Oh3KxVDP6dt37CPo8DGMvXSeU4LFMcYBkZ/Q57sH3/gyblyHK8OqYX3pzbnkCqoaOwAseBrQYMel3OgSLt1nAxzhN+ZicCLhpSYHCcHYDcg9xoa/1u4uEMJ0JC+/OzU7xp3nC4OgSYxVzL+gBNnqX4Plep7oikvE7+qymqwtoEhEEuaO5pbOdPG4I7NknL+u/RazjXdy3IGyfUPCCQKsjAEbAkD6OBZZf4St21e4sSgV/anAYFGr87fHMPtXhBxH6QTQPgWqrK75Lr/RaOLihrQHgVhcQHYcTD7nTtPNelbJKx5aGOFtcqykaVizLzrflZWXnk+QAjHo6Hsn/edm7Hbna+JTlyVsttp2vcs8kHQk6xcCpi2kR7nJwb+6kntEEPZAyuFQVwvdkqyC5nAecdg==', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==', + version: '0.3', + creationDate: 'Thu Feb 12 12:54:37 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009' + }, + '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': { + header: '####', + data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:45:43 CET 2009', + accessDate: 'Thu Feb 12 12:45:43 CET 2009' + }, + '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': { + header: '####', + data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==', + version: '0.3', + creationDate: 'Thu Feb 12 12:47:39 CET 2009', + updateDate: 'Thu Feb 12 12:47:39 CET 2009', + accessDate: 'Thu Feb 12 12:47:39 CET 2009' + } + } + }, + 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { + data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': { + header: '####', + data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Mar 14 15:51:17 CET 2007', + accessDate: 'Wed Apr 25 10:37:27 CEST 2007' + }, + '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': { + header: '####', + data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO', + version: '0.2', + creationDate: 'Wed Apr 25 10:39:26 CEST 2007', + updateDate: 'Wed Apr 25 10:39:26 CEST 2007', + accessDate: 'Wed Apr 25 10:39:26 CEST 2007' + }, + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg', + version: '0.2', + creationDate: 'Wed Apr 25 11:14:05 CEST 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009' + }, + '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': { + header: '####', + data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=', + version: '0.2', + creationDate: 'Wed Apr 25 10:51:49 CEST 2007', + updateDate: 'Wed Apr 25 10:51:49 CEST 2007', + accessDate: 'Wed Apr 25 10:51:49 CEST 2007' + }, + 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': { + header: '####', + data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==', + version: '0.2', + creationDate: 'Wed Apr 25 11:01:21 CEST 2007', + updateDate: 'Wed Apr 25 11:01:21 CEST 2007', + accessDate: 'Wed Apr 25 11:01:21 CEST 2007' + }, + 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': { + header: '####', + data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=', + version: '0.2', + creationDate: 'Wed Apr 25 10:59:57 CEST 2007', + updateDate: 'Wed Apr 25 10:59:57 CEST 2007', + accessDate: 'Wed Apr 25 10:59:57 CEST 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 10:38:17 CEST 2007', + updateDate: 'Wed Apr 25 10:38:17 CEST 2007', + accessDate: 'Wed Apr 25 10:38:17 CEST 2007' + }, + 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': { + header: '####', + data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=', + version: '0.2', + creationDate: 'Wed Apr 25 10:56:58 CEST 2007', + updateDate: 'Wed Apr 25 10:56:58 CEST 2007', + accessDate: 'Wed Apr 25 10:56:58 CEST 2007' + }, + 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': { + header: '####', + data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==', + version: '0.2', + creationDate: 'Wed Apr 25 10:58:33 CEST 2007', + updateDate: 'Wed Apr 25 10:58:33 CEST 2007', + accessDate: 'Wed Apr 25 10:58:33 CEST 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009', + currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + versions: { + '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': { + header: '####', + data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==', + version: '0.2', + creationDate: 'Wed Mar 14 17:27:40 CET 2007', + updateDate: 'Wed Mar 14 17:27:40 CET 2007', + accessDate: 'Wed Mar 14 19:00:21 CET 2007' + }, + '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': { + header: '####', + data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl', + version: '0.2', + creationDate: 'Wed Mar 14 16:09:07 CET 2007', + updateDate: 'Wed Mar 14 16:09:07 CET 2007', + accessDate: 'Wed Mar 14 16:39:40 CET 2007' + }, + '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': { + header: '####', + data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST', + version: '0.2', + creationDate: 'Wed Mar 14 19:01:05 CET 2007', + updateDate: 'Wed Mar 14 19:01:05 CET 2007', + accessDate: 'Tue Apr 17 19:20:33 CEST 2007' + }, + '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': { + header: '####', + data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb', + version: '0.2', + creationDate: 'Wed Mar 14 17:17:20 CET 2007', + updateDate: 'Wed Mar 14 17:17:20 CET 2007', + accessDate: 'Wed Mar 14 17:22:06 CET 2007' + }, + 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': { + header: '####', + data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Wed Mar 14 16:06:54 CET 2007', + accessDate: 'Wed Mar 14 16:06:54 CET 2007' + }, + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v', + version: '0.2', + creationDate: 'Tue Apr 17 19:23:41 CEST 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009' + }, + 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': { + header: '####', + data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC', + version: '0.2', + creationDate: 'Tue Apr 17 19:22:08 CEST 2007', + updateDate: 'Tue Apr 17 19:22:08 CEST 2007', + accessDate: 'Tue Apr 17 19:22:08 CEST 2007' + } + } + }, + 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { + data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009', + currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + versions: { + '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': { + header: '####', + data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD', + version: '0.2', + creationDate: 'Wed Mar 14 16:51:02 CET 2007', + updateDate: 'Wed Mar 14 16:51:02 CET 2007', + accessDate: 'Wed Mar 14 16:51:02 CET 2007' + }, + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=', + version: '0.2', + creationDate: 'Mon Jul 09 15:10:15 CEST 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009' + }, + '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': { + header: '####', + data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw', + version: '0.2', + creationDate: 'Wed Mar 21 12:56:43 CET 2007', + updateDate: 'Wed Mar 21 12:56:43 CET 2007', + accessDate: 'Wed Apr 25 09:59:58 CEST 2007' + }, + '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': { + header: '####', + data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm', + version: '0.2', + creationDate: 'Sat May 19 11:26:44 CEST 2007', + updateDate: 'Sat May 19 11:26:44 CEST 2007', + accessDate: 'Mon Jul 09 15:08:39 CEST 2007' + }, + '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': { + header: '####', + data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC', + version: '0.2', + creationDate: 'Wed Mar 14 16:38:54 CET 2007', + updateDate: 'Wed Mar 14 16:38:54 CET 2007', + accessDate: 'Wed Mar 14 16:38:54 CET 2007' + }, + 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': { + header: '####', + data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Wed Mar 14 16:36:20 CET 2007', + accessDate: 'Wed Mar 14 16:38:12 CET 2007' + }, + 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': { + header: '####', + data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q', + version: '0.2', + creationDate: 'Wed Apr 25 10:04:29 CEST 2007', + updateDate: 'Wed Apr 25 10:04:29 CEST 2007', + accessDate: 'Sat May 19 11:22:01 CEST 2007' + }, + 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': { + header: '####', + data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5', + version: '0.2', + creationDate: 'Wed Mar 14 16:52:12 CET 2007', + updateDate: 'Wed Mar 14 16:52:12 CET 2007', + accessDate: 'Wed Mar 21 12:16:29 CET 2007' + } + } + }, + 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { + data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': { + header: '####', + data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=', + version: '0.2', + creationDate: 'Wed Mar 14 16:45:40 CET 2007', + updateDate: 'Wed Mar 14 16:45:40 CET 2007', + accessDate: 'Wed Mar 14 16:45:40 CET 2007' + }, + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=', + version: '0.2', + creationDate: 'Wed Mar 14 16:47:01 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:20:58 CET 2007', + accessDate: 'Wed Mar 14 16:43:46 CET 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': { + header: '####', + data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Wed Mar 14 13:35:58 CET 2007', + accessDate: 'Wed Mar 14 13:35:58 CET 2007' + }, + '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': { + header: '####', + data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=', + version: '0.2', + creationDate: 'Wed Mar 14 19:24:49 CET 2007', + updateDate: 'Wed Mar 14 19:24:49 CET 2007', + accessDate: 'Wed Mar 14 19:24:49 CET 2007' + }, + '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': { + header: '####', + data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz', + version: '0.2', + creationDate: 'Wed Mar 14 17:41:15 CET 2007', + updateDate: 'Wed Mar 14 17:41:15 CET 2007', + accessDate: 'Wed Mar 14 17:41:15 CET 2007' + }, + '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': { + header: '####', + data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=', + version: '0.2', + creationDate: 'Wed Mar 14 19:25:28 CET 2007', + updateDate: 'Wed Mar 14 19:25:28 CET 2007', + accessDate: 'Thu May 10 15:00:47 CEST 2007' + }, + '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': { + header: '####', + data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=', + version: '0.2', + creationDate: 'Wed Mar 14 14:46:36 CET 2007', + updateDate: 'Wed Mar 14 14:46:36 CET 2007', + accessDate: 'Wed Mar 14 17:40:01 CET 2007' + }, + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=', + version: '0.2', + creationDate: 'Thu May 10 15:01:21 CEST 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009' + }, + 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': { + header: '####', + data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=', + version: '0.2', + creationDate: 'Wed Mar 14 17:43:29 CET 2007', + updateDate: 'Wed Mar 14 17:43:29 CET 2007', + accessDate: 'Wed Mar 14 19:23:51 CET 2007' + } + } + }, + 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { + data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA', + version: '0.3', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': { + header: '####', + data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==', + version: '0.2', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Mar 14 17:39:39 CET 2007', + accessDate: 'Tue Apr 17 19:09:44 CEST 2007' + }, + '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': { + header: '####', + data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==', + version: '0.2', + creationDate: 'Tue Apr 17 19:12:39 CEST 2007', + updateDate: 'Tue Apr 17 19:12:39 CEST 2007', + accessDate: 'Wed Feb 13 15:27:04 CET 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 15:29:04 CET 2008', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 15:28:28 CET 2008', + updateDate: 'Wed Feb 13 15:28:28 CET 2008', + accessDate: 'Wed Feb 13 15:28:28 CET 2008' + }, + 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': { + header: '####', + data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==', + version: '0.2', + creationDate: 'Tue Apr 17 19:11:33 CEST 2007', + updateDate: 'Tue Apr 17 19:11:33 CEST 2007', + accessDate: 'Tue Apr 17 19:11:33 CEST 2007' + } + } + }, + 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': { + data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'test_test_offline_copy_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': function () { return { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}', + statistics: '6Kupec1ZD7Dw0WzK7pPesnLE', + userDetailsVersion: '0.3', + records: { + '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': function () { return { + data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==', + version: '0.3', + creationDate: 'Tue May 05 01:28:36 PDT 2009', + updateDate: 'Tue May 05 01:28:36 PDT 2009', + accessDate: 'Tue May 05 01:28:36 PDT 2009', + currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d', + versions: { + 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': { + header: '####', + data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa', + version: '0.3', + creationDate: 'Tue May 05 01:28:36 PDT 2009', + updateDate: 'Tue May 05 01:28:36 PDT 2009', + accessDate: 'Tue May 05 01:28:36 PDT 2009' + } + } + };}() + } + };}() + } + };}(), + + //------------------------------------------------------------------------- + + 'test_test_offline_copy_data_withExtraVersion': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}', + statistics: 'EkRr9wEXi/WOlZfCXphn9kfx', + userDetailsVersion: '0.3', + records: { + '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': { + data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==', + version: '0.3', + creationDate: 'Tue May 05 18:47:53 CEST 2009', + updateDate: 'Tue May 05 18:48:59 CEST 2009', + accessDate: 'Tue May 05 18:48:59 CEST 2009', + currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b', + versions: { + '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': { + header: '####', + data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz', + version: '0.3', + creationDate: 'Tue May 05 18:47:53 CEST 2009', + updateDate: 'Tue May 05 18:47:53 CEST 2009', + accessDate: 'Tue May 05 18:47:53 CEST 2009' + }, + '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': { + header: '####', + data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=', + version: '0.3', + previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564', + previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==', + creationDate: 'Tue May 05 18:48:11 CEST 2009', + updateDate: 'Tue May 05 18:48:11 CEST 2009', + accessDate: 'Tue May 05 18:48:11 CEST 2009' + }, + '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': { + header: '####', + data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==', + version: '0.3', + previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7', + previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==', + creationDate: 'Tue May 05 18:48:59 CEST 2009', + updateDate: 'Tue May 05 18:48:59 CEST 2009', + accessDate: 'Tue May 05 18:48:59 CEST 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'test_test_someExtraOldData': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a":"0"}, "data":"3iVejXl+Wnh1P1HeNXhuNswKZezHtSDEnMVPhtFmF+5qimM4vXvQ+8hTO398SktE18V+lTxzQBLrLjMfZBLIaq1rszO6CVi+Zz2+A4jC9jOkjqlHlMIQMxF0jwvTr2fRQSYJIT086H23LVH79Pdik+E/XmQCMyX5oPrm8xI3TnHmb02GDy3uEYTOodIw"}, "directLogins":{"index":{}, "data":"zxt4pdoEyLS2Z7F4GuHsR2Js"}, "preferences":{"data":"/nCI2oM+0mskwEBYj+ghKgvI"}, "oneTimePasswords":{"data":"OxUue8AceRz1qmwkj/c0V91x"}, "version":"0.1"}', + statistics: 'rGwA4ZUPNmYKzQCzLpstvcos', + userDetailsVersion: '0.3', + records: { + '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': { + data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25', + version: '0.1', + creationDate: 'Mon Oct 02 10:01:52 CEST 2006', + updateDate: 'Mon Oct 02 10:01:52 CEST 2006', + accessDate: 'Sun May 24 21:33:48 CEST 2009', + currentVersion: '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + versions: { + '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': { + header: '####', + data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25', + version: '0.1', + creationDate: 'Mon Oct 02 10:01:52 CEST 2006', + updateDate: 'Mon Oct 02 10:01:52 CEST 2006', + accessDate: 'Sun May 24 21:33:48 CEST 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_with_preferences_and_OTPs_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '5f7dca20b7bc610a966ff3611cd8d6bcb5c5782d810123fcadf7155757ea39cd', + v: '100000924a0b2bef390c27b2f5f379ab1a557e8b6c2d4ce5ef57e983d5c3ca49b', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd":"0","cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d":"1","6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38":"2","9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a":"3","c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24":"4","5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da":"5","97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a":"6","6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a":"7","5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359":"8","52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a":"9","de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0":"10","44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558":"11","98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3":"12","3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013":"13","608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791":"14","35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b":"15","c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91":"16","2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b":"19","aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42":"10"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"4","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"5","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"6","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"7","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"8","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"9","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"10","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"11","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"12","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"13","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"14","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"15","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"16","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"17","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"18","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"19","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"20","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"21"},"data":"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"},"preferences":{"data":"pcQa/VkZWvrLv88k/npaOssWdQafXF9zJS+/DjM6MZwsUimSlhedy2pWLvrXp/TJ0ws7Pef1CbVmoxHJYyT1x7Eon7y0qy/cf483h4M="},"oneTimePasswords":{"data":"lyRIfuaIli6Zs4awYtZWI9JgUxQluHa+hxopJ4ADzlXfY7vTv5Iuxtmy1JviMKcGT+xge69tkrDBccydict+biWRPoZFEuR/V7tLMNndQBSdR54usAJ0e+obc6jDM0u38TpyMit0W3f3CL58lV7VkNUQgt6jEclKPxnKLMCqLOTNqoPTDNDMFJdlWVXFVeh+TDG02rarglHzIKd1lox9h/j+Ty4s04vjhISdlE1dNiQ2LqTZ3M2xv2Lg/kH9LBWMryCKmWpMI7IiD+S+eBnyq57EdwrqQi/3p6E34NcuJVJRnLBjnVAMoGkhU/vMg47iLcZXF9obP+oHYUg9mIKO2NNr/OYA7UIQ9lEHXWqs1XZmvnW4ORrzqQNnrXaO5/nWjYO93oG/PLGlJ9G/Tf/zsc2BAp3KJSwILoNS+xWckUydT7gickZqN+JSBXj5W1LZxJ60EY3PBIyE3i37yzho7nP4n30G8kGv5PgSA5BzpKj8/EiPFF3JFJVB5oDcwdeDgvDRsCOGUSMVWcWP1MfDsKHsRkMdGwW8kjFB65/jj3VTGaS5tYtyYVIhr49Mq3I/hUVBk7fcDQQM8DMYqj2EVfDoYAnA0BT+BAFRJ2bfez8Zj/vgW8GOwmsvfaha5YnneYVFg6w8Elw0cwJh3uKGHKCuXwXpe3h9LHSpA8RB95m/dvdoRQg9pg5l2y6oqFlMjBd+3qrpDWG68VZoz7pes0WHMVsNSmJQs+yJ8XfiVnRl27O8/8v4DmhRUb/GhuBSu3pew2YIPVWXEGq9C4nJlZhWAeT1pF49Gv+2bDzRI2R8fJykNXbStn1DO1I6bF01yECRgfzc830T6VBdSbUjpmmMMq67ZS0XVPvO8ZErmQcM6ua0RlttgMdXwNrO0pQ11TKNtGD6k72ud5MYDOYOtgMq5OFdpPc6A/b44mJ1Dim/8j4ETnRM53gl+FU43kbDGBkFu2Q5UGTmza/FctczfHqGEhthyBEE834FDFJeRZSNpGPAvGALGfReifNuc8GtrNyr4X5YxQdcNLHTa8wPAU04M+2gi/tXMsh7AlKbZ6FOEXmHe68A+twG0gcmPG5hEJo2n5L8pAd1eeW+EiYW/26g/oxKgl7p1x6I+fen3rlhcdNkGpUJeGnf1B/Su9wTKeQjobCcQax6RBbdjewLhbCFvSjRjH/9IbWNDgD1sI1xHEh1hKIgSebB1Wqi9pNc4Z8zRsko3/ENscVC7onTyZDu40QRNApD6c6sOLrAgQgUXdIC7Iinwv9MHFLARRmX/f4N+GfFqz5xvfuZtMeQI/H2MNtC1xVT5p+MhBxo02LM03wW9BuXCVDzquX+X5Zvo8hECl2zed/Bnpze7cuyaMFpQLqLnpgOrIzLUWix0ri50+k6SODYj6Fkzjz92COdx1DJCgrGNV/LyalPs+bsmwQQ2SgfxcE9+pWaayRlXB9zSxoZWv9wMX81xpd0fDLpxfLmINKx8G7hSK8YNU6Ldl9fQWM5Num7/NHkiROA57Bnwa8jEoJSejKLxWLzxoyVm6AwJUVFHpBhm/VOoM3lUW7IVyyCQeZP9zeCfmTtHtMDu4FkxNEUr2YppNmaT3CRtOJsLjcbpDqq+b5ls62U62uJ4HXz1ZBwgxfZcHUzU9t/dEr9dCvAiTSfnDhXnqPP4g5G+TGvcfOw+UdkxAOMvvsoYXKO3A6VqJOwrynUJKxSd7I="},"version":"0.1"}', + statistics: 'I0/F4RIPSdiZYXN7dF5ceIel', + userDetailsVersion: '0.3', + records: { + '2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b': { + data: 'wHhEnGsTCdIhrNEdALPSq5KBPYwrqvBXHEsvL4gWGbkfeIJqpEn2D+p/HPuiO3B7UHmL+peiyduOI8VNzX9dnCQ/mV4/u1xQwC9n/SxbUq4gewvL9GZv9KE1ay0Yo60Q4N9YOdDmt8wjo3n/CPgtNyRFISU6hQIo4g8/bfpKMAj1gZQGaIxb6aiwY5VQgYHYlOhZX68v2uHCXPS5N4gvwAP763Y65scE4S0W/wjUG2QbTQJGR0ZslviT5ex6VX/FDNZtYco+WA3QDKKM7ssiIOtrWhxv5o6kXF8IIgeoaSDAh1MciJY9TxCygx0QG1AaLywGdy3+vChyZDM8rLMiEwaV5yKvvShmpkw3q4bQPziFKT5uLsjwd1VE8ruDv1zuZPNS+KaU5RybZSeCyo4EppK6NfchrG2gzNtjilDt1oRIagCeWO8miGgktPYLqsyvXSmw9SejMHXOIdyIHjgnXEYYt8862gnDMG+y6hufrcjG87LGo/4wuApKBwg9L54PQUaWVVI8RcSZ7C0Hgbw5zBekUI4LjoqOWKaf/BgrzZOGRcpEVvMBJXPWhkp15Aivoda8Ac96J4blRtnUBM47HExf8Ux6wNgKrMw/CIsjpFdPIFheteaFBY37QUWKV/BKSOVno2G3oq8j+PjNU0OuAzDv7YCwM0JGueuJeskdy6bX6+ti3Xg5rs24HXNXN7lQSVMr16WgN5Tic/wxSziL58JFz9eDwQt3v9IHMp8OpOUQRgFsrW4m532q7GRRmaHKdDJtkxBMPmmUaA4lHGLXcK44DFuq5VyzX/qmhIggrYxY5tXuBwGQ1LeQZrjT2ahoMXWy0eEvfvqrrPxge0YRfTIQX7bq9vCvOMDa5wC6o/4TX7zo3+H8PbPZUyK+obeSdZP4QjyE802Oq1XZNEIZ4L4hQUZjhBPXWKyNo51sr121HS0u/9HURc9jAMd7dSRP0DPTOrnOI1UDIL8Y8Hc40ubBtQ2q95PMmJaiIiDixwk+LDWmof/nnsfW74cttgKZ/YUIdmySCSTb5QGrtST8ZxMVCC0B8JBie6WlW4cEiW/OqMiAT5hy7JNPo3IyTnlHI+4spps8fy5JdH3geOVahBTSfhffvz7QKOrZMnnOTdWH1NY0fcRRmk9JRhbhoqlwtxYTMw1RhvTw1meja8XvmF/lVWUVh7aVMJK4+9BpgkRKJIVhIgRmcJuDDnYnfcLA2RGrMJQC9y+Mg3+aJaYHLq9kC5wDRa55yf9OdaFh/8I3c/qFAuxtiTYTUdGoVfBZvdndnwpcnodui60ChywNOoSH5SC/8EL49hVdKZHSiq3H8vh//Z4xz1Ay1b8vsMQuwjKF2vrWeq4kaSw/AKuERmvtOJzqkQqqBs4PWQl9BOVEp662715WsKHI/LgeRY6rOg15QVnrsDBmSqazVOA2EQPL3AKPnQ/xovnxkXZ8Qq6dXF/axtelGJ9nOPXmQxUrnIfEPu9BnyfNulD891sa0xEeWDTymoOdMe3woPh/J8IDBuq2wOJOOMR8wvKqxsaHur2KGSSNVSNejkkM7usiAk8eD1HRXqxbGi13IE2PBQTW9VltJSuDAbc+bz17ZRGk8pVCmDI9l6nnkMgt8gdm8txbpD9Ocg+pNQM9C3mLjz0a3DiFA8/ZtMvmjeAokibeQRlIfjDQTjiunSXDSK++IWBA82OM2/CuTE9jLHxlH3drZ6HuI085CpWTgjsDd+Lp5LraPO4Am3QmRF4WOakhhhO+Rf3KSGSTCKuib8W5XNcRAearZCaPaFD+oPDI32d01ZAH95q9gQ5b/erXOeOfE3teU4jUestSvFX9XM9x63oTcG25ZBIcOCiu3quYDQNy8YZAmPNprMii+XzEsEI5F9v0DWudhGyGQdqhiskRg4GKr5b5srk3nvD7gG2riDZK1s0eKv6JJlBIw1yqCBRaerYOqAjkWf6CmdJHc4t9VPwyl7IzaX24iVKy2tl/PetdBO+JEWWGpTHIyMYVGhfD+yvDQCyYOyJrzFMYI50OtRbn4t3W/Dm01WUnMKI0opZVirHlWGnGQOsLvPH0E6KrdbyY+OGsPuqYSmOrQTqUAYPuLZdq8YT+P5x6ktjpg2xcdSOaWUlZnXX5kbgKJaEra08ZhcORjv5HUyP3F8edBrFXLcq209v9INGpxD81GN+rvqI17mDrhsQUvaI0dC6s+dlJ6nfjFOBQvj+v1/dY/FB1J1+n5MpeqPKWGGSLXoX4ZRWhVVlpoJyw/1EXLi4wU8PJjsbVGLIKXm0KnNRNKxJ9ngcIrQ2vHSD3nHHNnsXZwppNb1pXEqbVuw+b7lpBP8Cw0zBGDqpOCmYoGDxaDqYZ5qFH7EKetNVs2Ai39jlQJgPZ0FC4VI/npYV/io3ft9WRLU8SrNE8NdoAzCb/yE5kNVDVawLhn7+XjnIuE5CgNKTn3DP8QNIr3DwMsXKRkQpGh96gSQzBQ8Rzsox1v6TCUpL8kakBOA+czLxPexusnxnBsJEV7EtRlQer9Pa1d9JgILJCzqLNC7i8VW9wc5PqXmSXNjuGluIvhtQlAxQr9mOOgOOXOJoq3KCa4/XLfIYjicsOmhdXAcG7zpejh2O4nQdph7UMzqPnW9jl0Q1jym/5zRM4i2hF8x1U3qbZ88MN/4k06eE3vvHO3kN4YY2BsAqTk5sZIIb7S37IjzRBi4XgfPOgsW4imy0fT4KZnymiMqPI0c6nEViGSoYNGSLUxmADLcl1x9zhy4zS8G0I2uaqDuHgOtX3SaygYdGHFzJYtFBWTbslT8EIc+v9fob21QEknHiRPHd3ZEkk6hZgaI8m8ZwFaN9y65mkHDNO9EZRqH4vm0HUGpexocWbX468rD47asQZyBfcP9WD0AxICuWwa7QUUj/gKrMPQKK0BJvwFIRd5mMOKyeMq5nTLJTCMZcwRvaIyaBH2/Stv6XQXQyKgu2LxdY2PC1YWugooteK8zKh3Exq9J7q4lw/WamUzPZ/+z22ycpyMxWDfxW27ZFDPPUHyoxykwcSk8wCoViKkmFE+i0SQTJseBtilLb7e5hX0k3wM5uGUs8bhrIWVoDaQ5t18JI42nF6P7rbJG48dVDcOmfRwJDulYCh1FMAcdV1mb/H/dislJY9N8PAUYQGYla9TdqaBn2dw3TRTgnC7+zag9pC5fySuUg29lucMFF8FLbv2YIWFV6XDT/x7NVqwc5TgUHAzOqgE1L2LiahNgqIo1RqxYDeRNwlAhQhU08wKmHJ3liGrEuG4CABuoLXPs0KlBoOC+bi9DN9ZQ8xm4lpY1zALyObZVf2Iy25eIgtZp4/oSdNv0N5gG9mEHYVRZUUInPeAEyLRCVRSYu+fxnoBgignuZGMBp7QSYNFPXS0e/iueYZc77eMgFWjVQFMc1g0I3tLvo1vb9t9tZeHNwQ5VsIkDBQR5ZL6jkODfAhduWB8mnkZFUrlK2jNZKubzpEGuzDuc9+Oa1v2y/687VW5ZuAb0Mq65wF+Gi7gkrC/DSFcocGPJvDCxyWPwP0iQydbuHNG+1sp0GOJ5o3yuXylq/oQKGrtty1VciKC6CjZZFo0xXChev1dUGdZ/R53xgxa27s9yfFBJIkn7ipVuBwex6t446SxichuUumGxX20jnYttYobxFsyXsYKlha4xXLoucfCGxOLT86HCFYmbFBMjb/Hdyi7EqEJ8mwcmgYFdghl1gPGOC+trNm14pLYV5sXlJoLL0ofChmTBTOhPwSA3dYz/ldk+dJIYG6G1v6ZcAaBijPQxAKARUIbEzDYL7kNVw0VdP+uDbGirqoyUlPdpMi3UCgO+ZHSxe6a1aO20GdzNJc5G40/L85Vy1QJ0BNva08jBL6kNeUlK2Snsl/1S4r0ITYiT/UjCj9Q1hVGmBSgWeK69vKmUCawzBguNjLbkjYkFoVc2TrifNeLdRDY7OYgHeIc+1GE0e6R9IeVsdJ84Plgt1NnaKWh1jfGS2zGaV2HDm2fDaRZV3is4OVzBoNowdol182r4Z0cHcRNfjtzEei0yHi4z8pcwXQXKYW+6ZrSNGIRZlPcjfjBS1RRbbNqKlOjLB2z47SalFmTYomPpCtIV+fcvBqCzGEFUyzO1QbFeI5BaomyJRwzMcnmS0js4UKnwShr7LUNM7RbfSen4GKChCHWaqEyxIJfxfafi6Ol/h7ORvtBuh0PRQTFlulreY0bziJ+yenXU4CFoE0G98a0Kj20geLVuMwAwif1/mwFTdo8dxY0lVlrj1I9UBbxugOL2Q0YBabed+zCJ1zD9gJf42INwTfNEOcomvRds6O/K6teDT6G0jhLzR1SpzuBxADXfyX+CsEV0qN4gh56UTcLIxrdPbStHh9Lqzj3f2FMWkobqKwmmxLdjpFZMRD+9LrUKmcMUXBzeiGqKZD/6vo2Pvf9KLaAlwt3cKtwACm0kAQEUhpINw1DyAHGIlU7cSguLHef26tbK6lnkQhNBAm4YUNeMMBujiII50Y2lKJ8D6KLHBegInLeu7CAKj7V3uprmHjLwoTyTKQl7J3xonuHn5PoBpwf9BEmZhGZC2Y9qFTeU9fPl/z6mHEmL0QrN0S0j+eN0cXk3MEZ/sp2uvjKL+3gKkcn+O5KtZpWiFqG+CTgax7ayDDtFC42eLNKSipL0E5QuSYVqIJtvMqflTtjH57/qbWkGa/IifdRGJxYk3iTjnwMKs5vwdXziYzOnUR79hzD2U6pAkjpYYSK4NOHSY+L+5RVCIeI/cQeLBfXxEgep1GV/mxRroDTGaRdr8oc8CyLg5ZgV0eMDrp7AmKTXluRllLD73UF2b2MTN8vc2MRoarQ+Jeldd/Sowkk24FOQPK5rQNifmRxQl9X6Ablk5hsLrZovhRDQBPhZ7r488Kb3vwAioTsRIH9mdowQH/cW4BfljcOuneQpqz2xU7I51Rc9xmvlAUDZldsZigSSjWxQmLpNx2Zwhkfh6REHu0Xy5ermL/s0azKnuyxyCabuoAgFLHs64ezDSeqkBDEs2bkFT1/ORKNExHTr9SlC6q2lNQl1Kuhu/GSpKclqKp9vDzRVPnywUryIkMOmfS88omjI1HVb83L2G7sjgtPKK0GurIL+AVwuBCNBtINYtBcwja55wgUwHZT5KxdfT3H+9QwpG2VgvCYKfzk3ZtNOinc9Qv+eAbeSoImXQdnojloJ+8+0NXpnDe7ZFBipFj97+MYztxBmPYedzJCBhFdOpnh/Xp/bTmCtd5fh9Nez7VwsuH78JEuj0wwERmZPAxjIihIEEk9O97leBVIDoqCWAgxU/o9W9tC1ehXsv8mo7qO9DB+jmTAUF7gcuB8zYaUTcpXOEBboGkb2wRoStddp3lqHnz+oVtzR5/fNmRlWP+PiukfQmjcQ9zTeKAW9N1FxNAMDovJBuqDYx+yUmdArj4WU63ukT/pRXYMRcXiozRQgEv90InxJlS3DhBfkU2aach/jTCy+39g6T8qPJR3H5Mo3/0+kCKjMT55ssujl90uIq9rzbdUAs1YpKfEPnP6zDG4OKyxhLaTmGfQDWVU2M31LY/OurrM/BtvORsN9e+jgaiGVXQGVKf/Danw4NoAS7Ulnsp9YsYQJUiEmwz5Yc+PGOlk5p/No0QR2LpWCHMiTCeDBuh2baaUeC46AJaOgpjNllvwPphlwp2bkhb4u5PCP1DK/BMTo7KEt04L8Jqnzb/TYd/XXnSIbza8ezoJx8Pt2tv8kKZFXs8JWDPStxe0wPHKk4PoELLzJahfaGYWUmvNUyv+QAtVXonrDZMdzSD1NO5/9yBiVsGqecg5zFbb2croGzC0NoZTYbSOzo8DxEpobxkvTp0jdvLyvt2k3jb0WN0oadn7C0oczlOrLce6XUQNKjPDHRiRxsbSB6vq0p9BO1HzUW1KdhyBl3ZAy9RieoeWmC5yf0JGGbDBQo+J3r8AJpB9zrp+OryjZJ11E90bwl9r1vX9/ikNN11XOIbZUtQDfNXA9NWbTUum2TLJBXsHkGyhfsn40xSF2SXADXgiVCM4l/pl9Be906Z7lG8noslPSaknF9w0xkEF9EehKi02nbjg1Qt7CSAMCzWWtLXFW/DLGTyTML4SvvD4smSU5+xusVDVDxT0sScnxwM54iRWzPKIatJWeBgeNEe2dEAdnMzD6R/PFLwX/onCT4sFV1LXS9UIw+2bz6+l0XyyuEhLqZVfxbOrSK+jzrUiWc1c9WwO67CewfOeU/QLZQdYp8UhqGx3Dwyh1x2o347M3iEaBJ7d27CVdquXfejg9EDSM6y7wDqjI3z7vym8XmqBraSx5py+N4+a4/+pvUfDo4ntEu7vuUwV3zhq4k2X5MO5NGJSnPaFaWOMHbAQwWlrzTyq7Kbadn9HUvChXaNLAaZzKZNdxW25/dcVpi3Dk9Oxb7dpRn/Ns2H3mKpDaBszkcWtl74DeW/CO7Q4gFj+V+mkf9+lNw7qc9DDRE8xRRMwM5NQZaPy50VBj8J7iw9v0eis5xdeZXIgDFmXmaitFYzBG8phyqgtDwcbVArqx4MBgURHlLi7kJh+OnCSEgu+lUXEw/PxkNO9ooqMlMrp5EBTbnW8jRU+giyJ1G7q6vuv7GT//KvczxiYuWtEFcRJr64O4qy5o1gOG8wM8uivNfR7toVyLKyezX0Rx0iiLNfn5TzrZCzgbSRukLh32OetepOk2YqGG/967dsi3LBoWrjh9xyTgAqc3NiiFmMya5j6ntzC4LyMDet7l7+k4AkVn085DVj7A+zJrxZNJ4i7Dkhj5a8BTyz/sd3Ewxzh9L7qWsAJI5/YQo3Oh++ojJxppwfXD/+a7T9HdI/rSvvrkNmESiEjk0LReRJjCRPWl4LLxY0CyBaxryNn/aLJPDePL5PSnbXbBmCVLfFC2FmQzHeadRvTI/gRWbSYp71Ya8uxZRnA0CpHFL8qyMRUSdkG3805xGKtv1YHUpX90Z52krHNar0g3rrB2r2yIg14eC/fBbNE9G6oz1vUd5VnP1o99B29SbR3T3ubp0jZ2Fle0oBA+EbabBSkhARChsIOG2SbHUFRuk65Z41dZ70EoxtEqaud8pI34v2ASR98KIr50wtFqrN6h9PStzyImGc3pVOficgKAKmMxPgbbC0lxiGIqxergIgyBtyFoqKsjWHih0/WbkFbm0kUUlPsWsKAM5cQoY77IZOo79Otw+CDU20YUtVbOzZ34rjKzbEGzWi3au9yBuIsJc/LU/N32jmZKfyr2DLOTr7U84Fp9nKb7Zcw6LbmmZyC0o9JPRkFXrUJtPq+kXtGiH61oSmcm+6pitaFLJyw2TWHsMofIvNSOReTEQnke48BJ41c0p9j84X5aO6FUv7xafpSGhvGkvYjCgcAnmdld2+FhZO5B3fi1lt3RAK5RTVJK8SPPJ2YhYjIeU51c1PPatfmDlqzgIURoXUxSuBp3V7Kg4WRCW/NV+uO8xUFL5v1u/fsX9Nqgu4X1QF7oZOVC9+pVTeHUyBxGQKq/iQm+6q6p1b+4WHvINzqgiav3nhOJa9OpCQw9NOg5hLnOvGeD671peeV0l7uhNDI/jiD/fZlz+fbeSN0gt7j8O4ETOD734zjvXP212vt/tTgBLAjMyiCBXX0WCfslB+u8MvNgC6p1psz2FtOcrGczRVz+g6ZtXXUJZsHfdjGF2wwq352CzXvxidGlbO5ejyMoBZFtTHFN6aJHPEc3WQeUVNeZp9u5AHTRtqIUxfrA+e7ZlkLOrRaPFwIDRhNvkQLK3HVpRCYzh3aoSHmwwkEF1yAAz6qsRgHUX0FtddQ75qvpzB00+GszH2VXYpTpq5I0T3X5YmSSdHhhxmUAH+wi+OZ5ZheFBIlBEtDylMJBcY21JPyy5fwEvhk3Dup93TbOdDFX0HnzdfS8CFZv8sdwEWnChZERHmtIIXidVD0Qr60agqtRYl3sPIJDwIO/1KDytVZxF80bicqqjm8fgClei3VFjHLm0zHI3OuSv5vw8oUT2BECBHFKREcnPxAQ2oVQ0cK3fq9JkMRI+LLNNe1GKWk/BlpYi7aIK4g1MjWEaHV8vo5oYjtsNti/sxR0yz8eshks0o92sCUdBko2iGSNpxL6qEf2wrAbKp8VziYB+k2JcSgmuFgK3aiXibkGM6wqk1mD45xDP5zTKQY9cDtlr93DK59gOK4ikPw1e/vv2bz3oFy0aYCwhfR+cwds5IgZOfcHEoK2gfciGiWbKYXZejqEKC2GiByiNMlJew0D7+mWjl0pefCefHEeP8+cIB89yqTSUE62iZgRYPXprP3dJ6zXlw6vDtgbP8vSrVtGpHukLE2446P8Nt/Hznf/JcyWYL63ronB5Xx0OlbJBSjyiJUrCfr+BrYhkyba3WhNjnLlE1guftTxFcRF9ruYMUX+F9Dy13xBZQglsS5rG1SydN+oqpjZy0sCz+KNAEmsyNYO0XJTgOcmcL052qsyJqkx1zu/ig7E3F2llQmx0yJFTBazbrpeVFq1ow0QXW/w0kWX+/kl9tKO3mVd6BtXM6QY48CNvRoUKuDGxQpAzbnYI7wP4fuwJJcWD9Ee70TPNtjGlhuWS3CyxtgkOd5BhhmVZGDlfcodMZq/Klp+hnqlNbpx9fGFeDC6FhWrSBfBdFUtdkXwkKGijlRKKYAGxO8vu/KY7548ojVo1szTObD83pLB292wxzCXHxEjC3qlNcU9jhIrcVCim3nflRag8GF3iYvL/j04ieV5TLgc0CNna0sFf4KZhv8LaSpLSEDtTSP/pJAY59FF9442W13qqC4WqYxeq4/kEzZIwLle06VsH/mEdFl5p9tTGiLk3J0XItwUphPRoZ4i1R+UHWGOJmmaGAsZ2ulGVNqrQKNVTQtQl6kKDDesyqW4Gcwjh+VoPxzpCHlDJJY6/Fu8w6K8/xCsHHzF5SdPzfkekL5teLkMyhg+qYzjHYKSUvBcApKQLJe0h7Jx+OFUJH3wruP9GnjMg7je/bTh91z2m2RjVfNPbsjVsD2k/yK83AteJz/nm26dlfesnUT1XuKAbzJKGZRVhtJxhatWyglLZuy2gkMfpHZ3QeJWuXn23NUA4H18qIeoHTpiPzM1Pa4OmGO74te2gON7E03E/LALsqe0q/t7v9sEjCMujf3CxV3IIsMXEGaqRozqVrUS6VADkLjZwpWtPx0aqEA79heY67h/LMRqkcdAK9cpeEhnz1N6UcKsWDFdSzE79eNTvW4f2p1P6gh+7BPRsol6b7qOPQZQOQCAU8kZdqqKP+z3uuq/REW+Ttz1WxuKSUmYrcV5g1ORC0f6trIfmMSk/n0NYvUeT1B2tTcwG6j/yamL9wuYkLOvEwD0ff2672Ebq2MBqmmZdkodPyNJRhpH6YA9evMButurvXDFicW1hFQnMj+2rfYBO7NVux4LfHf86CrWSgGUiAWROMps1+5cyj5uKC0IoGrWCp62wxwEOO0201pD0m/7+kMmbJ7SteCkR7+vlPDp5dWf3KXNpyJcNV/LXgGdNau7AO3G6QHYQ=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + versions: { + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: '4VJOhqSOjhTFz/k+JEODmNhY7cCD25PLK7aoD34G4wGzeoVjBxzAJ2NKXG6X3eL8cXG7DjhzI3LV/PiPkYhFf2sVkHbcvAlXBcuQFOZkZcf6PvedC1ZfNh0/QKVWaCmTGrMUP+MEk448fqKfKxJZMi1lUzvMx6VX3bSG5ZQpjt9DtpsPXsbqiz1ujkgwR1a5f1oXgwoWVVcI95yOb3cS9/RPBy9rP95L7reRkzBG8hbyUkZx88yZNC/RgnF68PfgAKlIxAuyMX7V7OuXzHntSxw3FWBGIg2EiWpvAJAUi/mEpZcp+0es29rbHJ0FyuWcW0gbeUsCS0gAyQOj7/VoiWKhG1Zc6qe5cE0F+EA9bLuewGynwX0CV9IDYtoC2IAJXO/HmPF+yeXf1TI84h8l', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b': { + data: '0OkpVF6uWFeKVFpGzUr9u15AmZHzn4RQTu1aqA5yn6btxaKkYLrrBLc4ifw1KjupMRIO0lufr3vQfto3FroPQRUomvFNspupxMkEiVAvZdH4CVeoM54IppBbgji+u17obbDNkLiKaTaNRQ4/hEM/vkKHxOKdWzB5KnbEPkCPW2I2aMgyYvvDzyDpJMux3HyxSlRe+to2moxK6o7UU724TOqwT/FrV8rjLyyvaeWOuMRCBc/hUW318sobgRyZNaKxxnUOgVvrL8ZF/7EJygf0qMgmK6C1IFZU8wh32FO1v5dmlU74P5iDV3YoErswCT0I9k/I4EAP0Vih4TtuJsLRyPA7r/zKCQvg+4TWoEwY9yzpeRiYKpsaD1nDYGC+Wm+mGNAgCAm8ZzGEFWe2EMvlwzv3EkfmaQ8P0qlxsiKuxC/FBZoQ5FarCvdFH4IJaVjquInBZDwuDVFUTmnx4dwAO+18PxIVKyih+jKobhjZiZe4oRdMbmGIlG18TsroOFS8es+4rPAZgkb2AjA3oyS5Hui2BVfDvjT/XgLJDriVmHXszKAA6oApW2ltROAz1ROfEcbjs+v4pY2dM7iLSLs/7Hzri33m02+yjyEuy2hQtE5ihfnm/9UIwGdcaNgwjsa41pSj/m4jvflT3P3pdUTSmdUUfF026hdyNL1TUF7mXioV+cqqU5fqB7CYN3i6ufwQFVhQkitFRDGIhkSHgi9PSo/D06s7Nn8n4KUYC76NH2kmZq1b7c7mElgjAWB6oUrThOAyeo9EMo6BiMwMdjj44nWONTCq/LnpGlrEnsT5raTp3u/N0f+PpiNOl7ucNA8Ae+5l3EYwFz40g396Yhgp75WZM64ooIw//NYcVxkbjjK+bGRPa3VdElMDuPZTwMmzebpdjt4IMKGFGdqnUwiWhTKEMM/FiCUIzR/uv8t6Pu59bUnbtTwAw1kqBN9XbeDlqCIxpaQ+47TyPIE450b59D2vonib1jwjqMOaX+suqGky1oO1kvI5NDqGggu+z2cWZHI4sgKIfzsBbZkwGFgjvlXRY1ei+gbQhFHABwHKw7rb7JXWepMw1AAApWnELbDVLmVGRFAStd79y8NoxLtUawyAIKOg0Blcy1yKQ0Xi/epGF1lRHLNKCe+7y1/zDbzAlz4ZuO4ev/Kef4fXLfTTXbB3Ld1C3ymeX/+6NPaFDiK7A7RZUUz8qCn/q0Tm+4UZmRZdQYd3C/4wi77oGe9yX4ouyUYSXQalxmDbpavdOC8pyknkjopVQFVTe5FcRyFZcm1D8Sur4Bn50asQpocBKl11s5JMwgTZ8XUwpf3CaqfedwRfs2M/QG5vho0zoRemm3xWD7hm6wI5WFIfc2C8VRobyKwxQ72HsxxieSff9rQXUQ5FsXyonHGMPCfNPGVRkJoxI+d9INGyj/HLwa/A9rkE5l1CNGz/ZifHHgVYrmaTw7WF+W/GVVTl6qvqIC/sjVfZs+o9Kd2rQV6Xyd0oAzna+itCxTb6vYAY0yObXbBNM0yk+wviTSEm7mIwKMldc4+qdkpw1Pl1DDUbswOIEmZkPo4BtoNo8dxme+6BipmK39FZ8jyixN8Ty57EW2iSZifHGXo7IMu3C0OYRJmpr2CCZXWL4ddQCVS4ngpC9h8vRsK0PUtzfzIb9DA3dgcULcgvWmx7wWbkb0rbtD7c4aorw4GenCPUUn6sPjC7bsPcYciJOw4ZKS//PFrz5n2wE25vQkHSVx4zk1+SY81flQSSVfTVq7n8TFbLoLN53ZqZCwq/gOL/F9A70aQmtrFLmHYJ3cMKGqm0M3EWsXQ+KkTssBAr5QlhyyBb1oVfvdZ5RdOpV5owux7VmH9WaFA+/WRR9KM94dbwKo0RcyxzOsiHgOASXn/uqR/wgbMPvqRmdaEkPDCFv669IMIC/dbTilsIQAtmTkLOgImtW3uARJfxzpY+mPjyBcFoi2S/Gn+vhqKS/ZOCWMRcGaa+XdViMEfxjbfq501szy+b276qkqAQKaO4LvRMZ3F2MSY632nWBxP2uSCh0q596urHTW6f8w0d005FWpc/srxE06uA1WPXZVWiuGZpP5qUSqp4B+7SYo5ZlcROjDYPkhIkkcFPlewXEJgffkFbVjJGm5V7wVuYt0W/t65JWEA7VJWwtBJLOvOP+y4Zz+dMJpG2W6VWhjeQkESKaOvPVffrSw8kyVC8oSivCP4Rfz5Cl3kdOL4qbtYCdJ2ktg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: 'AA3YiiY3wEYTTnaKKxYsmKqTZDkmG4FoICNWtkJXiEhHzElR5vi1OgMNhm41aRVszrCemeM9kK0we+rMCyFItJ2mLcbsYQRmuuhOqzmp1fCGSoR1x09KpDNug/FndY/UjtAbs9T948zl3TWvdwR9VWOzw8XXxmJg9YTsw5uwhqQXcxdVnQI5akKClcoqz0q2NVp+OdgQnjc+FUE9WeqKY/Bl0MV0l38L07DLcoHZ8OVKPSERnMbcAbN+1C50hp9QfmniBUIoVdAIsNQ4Zuvh+6uo4cRMeWQfKw+DOVAWiIvrpUBSk7pVZWeOoKF/IcUR5Ftem63GIxwZolnhJ+HcTFcNDWkZtb+E3QRZ4A5kxtPZqI1KQwiTkS+mGI/u5zumFtJunrpbe8JgikhV3mA/WD08nZdSxmfg41BmMC8t+0zQ3Jwiirmn/F9a+TIntcwyI/4goY6T4Z/t+vKHVdv7XU+Ma0Oy6swrXB9JLfPF8S8PcM/IlyqnCKkjq1G1eBymMw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013': { + data: 'PPAaxPg4YBKa+02+PpnXDHCEEtAbyyPGrpVdLS4DBky0KrUV1J8C3lsCudQLrVNcRdgtXetkLipukMuZ7lOS+qlr1vsF0JyaU33GpMszeCNtOUlWMidZk0SnjHPPGHBXEzmZm6yVfprH79bv8YsoWASyRamubk8kZ2lYefQvl7QYNBQVb01cyprJUVTtm2MttYnfKSKmlN0n80nSpNFZuTyMov1XAlot3iicojBvSvicsYwkKDmJ5bnpuq4kzqonL2UUQ0TDTJ7erf2MkT1/UPdnE3ZRjfsoIEm07+0ORTqrVZJXjmBjSLlxvBRitAcwVs5IWTUEnMF6/bYhCMdWnF9w2oayHjEnKh2L+fA6RQjkjlfYscmv/HfxErYvFvfSRCiu66AotlL9qwBzEooaXENZfPqZVrYKRm92oZDoz8KOm2EHlttnBgjE5w7kRtdDDBIgGsU94bLObSu0UNHERADv9VitYYK5dEU9Myugf9V8aAJbwkxhzZHvYj6KsKhiQtMnaU0FVO1qib0g2tyH4+TlaUUlY3Zo7wjIn3GMVIomgN04Lt/gBp2vq88R8/erqERKdZu4XXl5nATF8w686gedHHIjpObeVyBN6PTNp9enS/rM+sQti5AOKQLx9DgVaoT46iLcg2/UOgIwt2zDdXOccXqBq7PzS+aSzya5Pgpp2H2VH527/PGfR8D4EA/tiNGhUdwPqz1AJz0td2qCWMllJ8GDgme7Bzs8UG/Gd+fWUkngTwRA/CcNAv/1f/SmS9V6RjidkAiNF1D/CGO9rWMOLMr77W3kAOEdQZzxo5tzymx7FgG0Q1xa0fUY8z57UxViBILddU0gArWyppOjAKtP0vw4eDzPFlH77a0TdXKnfB/41arRi5kWl/fX0VZmcjRQuFRS3t3m8Ta9GINaZHo/QAKK0Wjjads4THGjNBOFq/pVfqE3P8EPJZimE9A79dz5crZCiqdflTgAGUdW4razA2jqxcLbbxvXuSaJM2kecddVvayOWO6gVu/xbwbqgk3eETpO6HBbYZq5TzmAOJEZ+XBt+F+wx4EwYTVxNtzV7NDKvooBH5CDtTxfmDIE3b/FXfqIluPLXuzjUaziotJ+IARbY77w61VjjK1xPYPCF52Ovb3d1A0L1SUwfACzMYtG2Vp7rwAa4kUETedwjrZ1rw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: 'HI2+42Qv/BK066PQvkV3a+njq1IJeWZS3XmFYL5Q0G8ZChyeMUz9oCSfLW2fZrDcwTQNKk5Q1YIbK2X9PunUX5+s2eKyta7ZejiAs4A6T+AL9GEIPYnX/OjQx5bHFL1lVWCOhg8dGU73A1ryMEUZnflO17KzhktJENZvh+luEHjN0GIqCBypenDE3gs/A8aPoqba2EcJ5nfazVxwIpiPWhyF4HoJ66pjBdj9gUoIqq079MPVcs8xVdO3LfVOc0rT+pCi9+ei47s2q3rwjhC+osWCYgXdkdcf3TJvOwQPDq5JEtv4vofeHsLV3f0DrBRNb1Rl+Q5VNVJETVv5CGOgT9doysj1ktLA61LVBPKIJnmtVaa3IoNMHvTeEze6kgIsgWaH3t48uynqowx6QeveCQBH', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558': { + data: '5DKtDM4rsjjlFeJ2jznb2yT85d4lhBouKjDGFQ0qkHB1hUaMf+8j7eY0LX4n+IlFYaaol3EfWCbIMrpTDtfCUV5+VWgyA9FunbRHYDyCRZwy28+cJVtWAt7aBUninuQ87LCXDEYqwATDo3+wSW69OOIzqs4dq5bL+SAbX53biquKtb4kDlSgHGHImlpBG+tPYFLVL+fbm7MC3khgVtM7X6fBUhm+g41mAkU+0WUxft9hQJUZl3JH8tSBxhkHxexfekuaoJkFlpxAKR1Mtb16Lo2w+8/3mJ/cDxacjjui0IH2jaZG61JrqJutx2+e+M3xuDpcLeGm9VNEiEDNzeNWhiRP2gojk5liQN7Hhxdl9DpKpRY2s7uMRXeU909vvEWaAcEbF84xf9Y+hgwCGBT0n80VKkHPvGyC9Dnva4HfqIvu4wg0xF2ISEun058kaTy/+BnZu8rRPsc8Y55Q6wbNQvy0npzk82wqsHomrXNNMnoufM3wQjCFt0jIR/UowSBBvtLxIq6fF5PvnqQgwZOliLIM7GAvMvn+Pu/k8Kax73QgIRkbTRW/pOoKIAbvnk216oe1u1+AGqBqWzISgMfux9aWvx2rmk+MZG+S5xdVQzRhhgecpgYzDXCm66FbzKVZCNnCSBtge5VwChrfAGod92RiqgZBpqTe29MwW1vlVils9XBfvDCL9BxMpBYSOOHFilnSwdp8VFPFejFiEg0nJBK63IuUS8wyKtkzsumYJ8WKlLKH/xDtLBPkOnzMzj8s5GowhBfwxatbi5BZII5oEVlSgMlrPUUNf1zExDxIvrDflTMoZQuYTG9SArJ5VIbJrznaBk9LGphrQNH1t/90eQhkCFNdSbLraxxDN9+8qAv4cbbEUUVLXiXO3GN5VZuVZxsvkJ+3RjcsQgg2CldV1B1Cy3iY+sFqtnPChXDItMdZU08BkItB+pStsjaLhja75cw1Qs/I8vdJdo0czWgb6SQPU/UllTxo3CS3t94PgR3nNgXcUYafc5QzjJJ2H59PKiQGdXju7gjLVfe6R3ALysiGJRD4VRQx4fVZKhtnrFBfy+o+4+dMwu1HeW2Kdm+jwXrGWCc0j1qan2d+6G9bj8fLT0hOykuixkFOp8lvublO4JKvrSpSrCcXnE3dxQoFeHIqwI14euka1Waf7D75tXI/leiszCY1WGPyGIV1ezIzgIyRAfLH4RcxWfw+2iaLJANOOhKro4cb/9M6wsNJ91LxpZF+YpsQmUkciDLMafoCvYnmWKq5', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'UukuFiQRHdw4Yp8YoQ5gsdE9ZMOG9T7TwNbEAKMgqTiCmbQlWr7PWnD4myvH1RVFE8D/L8vUXcvfGoUkENRu/amIAPZv4vj/v41COpuahE6Ge7gOeFDr36bxncCAC9QQZYX/PiDX0OmsdrfsCHk0xIDln4yF/QTzOlygOn/G2dtfOaDB6qLs/Qn+dGuQuCIo6H2ACRT+yW684lHziFwch+4USry8IrI6L4OJDOgjHOdPNuv8SKEPYWeeMiIdvPfpWvLR+hgYVCJS8jiBHWDO7F9VbT+ed6w3b27ORcXfYUXlScedXhfxmxZ9sBkEXYVUhlgVpMOUBw24jVNrpkq5wxt4NGEhlfX6L2jdc2nj33hP7mp4Slr/6gGm7No5woXr+abCWZxgdsbj6Yybbhw=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a': { + data: 'XR0Do3w0K649LRGUi/FZZqF3s/cTvWRH/ke8qNXqOUh7xFZWd9cWnboAjFu2dRAwtBDIkdgJU5cfPJZIQdbGw8FnyvilokLgZdNqRqov5p7fQy1Fi27pQSvK5QJAiB3dYTmb6SldpuAqdBHcGp9UGecBzzOycqS9GjsXrrrBF0jKRuHJrs4nR8qkrwlQsa5JVFKbj+kgH3gttd2y4cYaOgj+c0/93co0/ao5hzgPovP5IWRf16dxWCV0p80e9ufvP4b7rpdXABR/tkQ6AgoeHF1asE+a1PPG5MS4dkn4o/+HXLBBzLVY+mMc5vsHCfuP7U74DoIVOjqWmoAmKDEBPGSj2bZELTG4guhAX9hdk1cfNRE2g7fhUXkiAdZASc46ny8Y57qc/duR0p51g0b2lStu+OLkzaGhAl2m+k6rxHGyhZE9o/bkGWEUisR9W558M0mKoAzWBoqRzcau/Z2fOGaAD/qMc7czoOMzvX76gyo6NQx9Go7l8BMXPgGedQMAOOVA1uWco1Es/WBzk+Gp9AsDIGPss1HzXZt/XjC3pvcV/Sfv5M7eyu0puNC3XiwFfZWJgoChd/QkIHicJnZlYTyrpO2nEoHPTbm2AY6UDl58K9+x58voKQnrbrdHF04GVBdtZvHiNEzzSd+4SfQaWql3KdhaAa2LzPM6cIVqREXI3UwPVpDu1XHsiC2I45mQ7/eIT0kSQm7wPlZsT5Fu6EFaHh0lHBa5MML5/EQzYqfosFvwLqxuI9coF3JyQszo5x2sdVfSkm3ChJ5iG5T41k7fa6zQbZeUHM9dLLwx+tCxF+XwoxkBJ3fYSYmmF/7xdr15brIB5Pc7dbBZMPiktn1nc11bE4bgyQOpqr8a7m1tAOT4xK6Relo9FkKubLg+hbUr8+6KPzztiamD9eAGQRopf7e7bVNt43UZIfSmCOGopkfZ0s1AVi396ZUexYJm/OgKWNR0BE8P1kXsSj7Q+swYXZM4QacF3u4sQwhKGu/Dxfj8hBecfnCQoe0oDBQwT6Ep', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'mewISOORFbu2QbxavMOFNOKpVRZTFZ5l9SG1T9Es0eDksCgUj9g1cNqRHC4lrRcp1F1DbXLrANM8Q6fK7m3Aw3yOVKog3+l3n0IeEeOacY2iPy7t4XgUqs1LoenPfqgKwvtG4BK0jnyefbPKEsT6oeh2TkfDtK5n+ofVUieCPqgyc/giAapjhxtKE3nkWVuKfcpUsaeHD8kGPY/rW3TlD+53pQFTdRfRgMGV6GveNo4WND54w+7y0WhwAqow/5vIrsZamUYOGogToklldP06raxY581IhwdogLmobs336YJ1NA4cpwLdkb/GlG1Tjj7Id1DY4mxuD9h4pxwrQJ8ogeexBlLGlHxmxCuX/AtiGeG4a1i8QC/CZKuFtQ+URRbCqtKiGmTEvNWVhlbw1MSZsbU=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da': { + data: 'uRB9zloy8YqSNEu2S6QgUEznfxgCvfLxQIm7dIxQL8cRRz15WdN1bLjdJkNNr2X0LZn6J59u45pn4MKJo4Lr6p6HB4Sx9f3IjWHjSD5O04PTnddX2rjpQPM0ONFTuOTUf1ETaG3NaOY8AM0nvBBFBQ9hxupGeEVKOY4jkxKqPo4UFD6AEi4e74CMMBnGZbKNPjOLJoMn6c5Lyf2YXMc7stXC6HswINHcMq8zYOuN0qlhj6wllgW7zSQSbeQgz8Xu0RY20K1IxAyzNYq8OdVsNadcOvNFCMFE5BNvoZvKOa5nDGmYqyytXkWVsPHULamBhOUAnrU3tKDAjNWIeUNcI1hCEiVSP7ggsHGZ1PJdHPpSQZH+5/xIPtKtZRZ3J7D91abZHN8XNk0WUC37WhOnIVI+79CIS+t7t9muRH2mBL+v/VIRUWjKdBYS7tTdXPUJOEIregvGc6qX90GC5jt5aYNTj12yJ/AxQdKVP/fmE8klf0ZgRqdp8fNP9IwT8S7/8c7S8TMQPQzfuQ39m3aJiOJrHkQQBbRr+es87P2aMu1is/BTzzbIEGq74sc0GWl7aC2ocjJRogHRQ15NtzGGFuSvP7gbwEp502mJ/2DkKKbY6g0DyTJ+FDe3aTejcW4md/gTYsSTqN1FHO5lg/A2tVrmaAnFFrPvFe7OEIwMbN5Ft22GlGG4GL9L/xXtKTFURdd4uxaAr1xJ6u4m0LnXc1iNs3EQjyVCJxzpW4aubavv1mzGus7fWOB5qMgDH6Oy+BqmrLoQgidy5+6NYvvejrqE2nJgNIEeg2iSrAIly9Md1m0FL93ZlFYIqLdPNn47vvhz8pZAQsLaGyrEvNZzt+67IZ6XUhkbO4NBOt9toJkHW8eMy/go3EBWkE0ZdleXfi75pJjT5gRMPOknSsgpAtB8Y2AcjHvdP9SfrZoOtxtRHJnOyQgwfWcnx+fCxCFPdo7mR2aDRQR5vQFU3+LTwgB7QpCUMZ7EGg4fGexfCKyTfkDzNFRWdBgRV16CV4q7HIIKNYB9dn8mgTldkMjaBIsVFGd8hyvhArWqQdDbDheghNz+uQax3go94gkQ32q5uHC3Wq4uCYkZSMGtGS4xZ1gL+yqjbV3e4Mt0uDbtCucMu9Og/ftPWmw/xWPY2z6L8juU0WsClz1rulvO1zsqJQF7PF2hlvixFrXOzxcDmSRGig4yWszcesgDnu/+bG7X1yVnRjWA6PyfnHW6', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', + versions: { + '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { + header: '####', + data: 't8y1iJOn18POJGNiM7JOX59XRrvZDoiDY8SxTnmIRhuqgE6T1FZ56s1ObEMsiyzPoR5OrkQgp1GcT5zDpC1uAtwNRnKUqfe8xmbsoHreq614Nn95vDSpIBCLPqWZYLs5PxAD/M/HIpkdLYBtluFqS8jTPTGGl4Mo7BYJHVEonHN6qgPxzAB5rYZQxGwuGK7m84Hdu05wKnGfwLT49nnR7pzBoSfKgGzYU2PShki6qd36x1T8bFxZCG38lX219pNZ/Ogqu0okqxdNVH9Cib2RWwRdW3a1Z/7PyUoqDCjddEjIi5eS0zqk9JYFFdJQ+VnWlAEkOu/MR2C/Mcf7ESmSlyIfTWkTJAE8T/LY52aPcdJR4CyoIt5LUVchn750UQV26voTKoORkke8uW/aZo/LVoH34CmmNQdH6YVw8IUvqAs16OSUikgk2RFFfI7ca7OGftLJCSwjJT+0bkvLo4jvi6DrLj/OReUbIWEQUmP7cRMURw6tkEP/rpHbkYD8Q7pQR/z4I8nsh14f7/AHU+fHDXZGAczT0ge8FFFinyTVkg/2yBk7jU/zcNwnciSq7Q985bAbmQTP7ZyIErAYvPjk+Sa5VHoGq5kEGYDPTMJ0x1vZ3ev325k0+eEPzX4Pez7LewnNhkDzxx9o1lpHo0wwB8QfkGo0xdVcD5UUFmXVGwRy5Qnr8gb6E4lXKhll6dFx99n4OrMipyNd8it2LzbWVZr/UCoizEhy+3+nI9bg4QBGfULH7uWSM81jyHADRBKWbzAXdxoF+F/lJngLpLrqUliXSIHi5d2GxuJwHd4LeBIjETJ6c4oEEqvSoM+ZNKalTybpVgttN6kZgu5CLI2678nfKYqIro18VqoW507B9Dhzm+34UA/RdMd8PmIlYVgcadi+KknKZiFVlITDidO1vcCh2OVCLQuJshFCyWFZQtthWPupQu6VXOScahFiAA66fA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359': { + data: 'a9CEtLuWMZGaIsOUVOpZ8I5u1X1BUdsCkAMDqZpa/xwgIlvFZop/tTGZ7xXqfLuGw8oBgME3odWfSwysYqFlLyLxvvHHFdc5eWEi4ZUUDRMsfl840zFZjXO+GgrLVpQDph7Uvrnsd4X0BUq5WyKDuLwLujZOS00DZRrrEaim5fHUMJFceA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: 'CGP/3gax94oP9EMpcFw7ZhWUzIp2DcqDW7CVRblVwQg2UpsWe1K1fvsrzyGC0DTM6yAUXLhSP4T3qyHjb8rrsQCNPr87R1a91xQgWVB+zluCbXH/ZfmQrYd5tY/OEo2e8UosOQL9qieRsDuGbRd/76iIysR/Ce4vGyfYohjKzYepZvq4x+uIwe4uKbzn5YedPqsJ92WTGK5rYIN9fGzPOQMfm8nOkhMLXocEm53Nh5cbBYCw8SGxxDBKRPn3g5z1jLCiOJ5i2KrVQUwIa8LdLPfEBN0FFJEj6Ri8NT9AWzpITZ4xovTomdIdSEvypXYHnkfBw9OWn4KPZIQ8liLtYd6oo3rkkWBZppjaLk5oBkKsxBNSy2gGnh5Eig9HPQYjvwPF7gvG/nunSm0nwkreCMQUzGUd4lLNVdp4dhYErGhsOLb8Rif6BVgxlDccXaIr4Ui5MLrS2vBiO/UmyuYFEduU+7eXuXR0uT6oib5f3cRKFaJNT8IyBiPlvVkEmG3gHZJBXW8yk8fuL2paGC6J5Qp34bkOqDW8BbM0Jf7+CcZURZcW2RpjU1UW9KWX/ga8Z5uNL2282K9C6cZWdw0yeFHsAOitp24xOIJkeyuRnhkpkbGz525htXrzXdwulVSqT4KiZDCVbgMh06k14f67HfYBoJAvLW7thG997HSWQlaxBz40vyjKD83rS1JvJZDLCKTR2VSb5skaAP1ye6CMbsYojZ3Q9/xVdVfW7jQ6nzjT7O2hqhIuIBezJCCvYdZcK2oWY3jW7S497wh/OveqniATyIk5YzIKGteIIhP2lPQ9utTInFzSwQN7LY+pDhCjNT3H8jGZuJFLq08NWTL5AnIS7DEXUITQ10+b9F/DXrM9zt0A2ELKReie/eVeHGGkgrO4ftR3S1RA/X9w4caDjG1vFxGwzFVU+a4TgxnMWwQlaKiCNhm2phgLH9Lxrv8KL6X6Pi/scV3hz+AXvLbiVGMbs1jk0VS5VHV/+Xh58kVcJFhUFl9n+ELDh5byUiOSBfYBaCvUvawkP/OGi+NZeoWckAY9dvvo+Joz8YpA0sQsUDYNNjw9PO++h55HdKOEQYHW0cBR+0PQWgtuARDEcHH8nGHdZd1+0quNJAeUWTKopX+C5cgJ4ST1iPHtnMVYPFQsnZkS7UGS8LVUJbeIYR+b/2rB7H5fzew=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791': { + data: 'Mb51dELDLMqkQbUrpOZOTFvi90inlkadvljkbKY2flQCxQzyb1OwdZhj+quCah8RjXNKUGR2UMieW0whcLLqDM4KcICsPutmHnXgw9oGuFboPKqtznujC3pvZED8+W2sBXpyq/lGWdSM8TAjoMmY3r+VR0W6tYvtpOBYiwBsz8MJfpC6zJLEwzd0ElqnpGUCIZOBMCAUZ5KO1DpHhm/o49mKmSXks9Ilh6drS1E8IWpTrGknqiV48wQjdL+o1H4/40wq93D8rgvEIQczlHz6klMSyk6yWHLMhAuTd4k2ZYFsbCOtW7ixzFN/QNo9faJZ051C5RP6srlPgXSQA4lRwm5qWBSth5GmGmelBYt93d2aYF86z/fkjE4hNTRH1wJdh233dBJfh+3nCf9bdtdBs2b5DjkRTLZ/6kAgfdngti4+e6DiHX3NMA+FK/hbK9VnVr1YQOZSDH8NExthg8oWDK2WhiXUX//I8a+Oc3pR16kZHPJwJVJmhRSnE8DRH/mYO2VqV0rSnM3I+i/4DYiftAl/inLBVTIx4DE87skkywXSmBIgwKoU5ekZNgPwU83VADTVXO2vlwgNlA31mmB9f++z6zNdC4gdPEiPn7imwKRGKl/ofmqY87/nWQGqw13hts0sUmyQW70CCnNTL4aOXVay8LjrCHEbelz4Nx9Fy6Ba3pMEelpsM2wMQzuOkjN3JlmTTVV2yydZ19xDMDf9c8lNq7PsiRepEf8xXcGJtpeWXLVkw9h59G6e1RVmAxid5tS86uwnEs6c8z4idycMpvTpMCUPG/KEqYYQnD59wZEq2Ctr6cOocdPSUQ/HE4/+qY/9/949z59B+mDPVxcRAED/v65ohop1QIekq1BtDbrolf8rhXLFMv3JWZl27mwUr8+DgSLrrI+xk3v8mbASUKrSjp4RqFRB11kLdVC71JJz1RBKBvfKjsfG5cO5nDIS5hVkBJX1hXP9pvHYjyDEgSI2h9DgtZh9xXEDwMKITqI9jpTuGWNJMas1J3Ip46u0PG2aoLU1O6DLRgfutVDTyJBfNHdlkgBxydqsl5Sxhmjy7SPwk3xmxI1D6CLbCJ5ODf6x4CekWrFmF21IWfF/73oWr8+KAa6R14L9iTwnl0ynmo5MVa5IJBdn+Q==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'nrV954wGGDHVx7+ovlm+4b2zB7TcjxIfXBsMCBUr0LgE8G+zEd5oj3Zc2MvOz9mLaYH/Bu9d0ecN+E5qFeDyRYbVgCH/EVijYemXpXnQH8bCcx4Ek2OeguqkhFNjLubQKRC38rOcWgKDXL3fa8YEyXQpdfWE8g9X1vCshxVOXN4LR0L5bYX2QP0mmoiFOY1Bqr6cYtCAGZNDtfe43Gi53q3FVOnOUhIYy8qrPet1gcdgVbmLs5DufjMdylXd9Q9rUVZCEwzsORAGLAkk7nWNqL9BtYquz6fK5/z4BwRkEztlkIDrhjEwWGjRujbmDD1/5RgKG9Ztbw3LBMkyhabPlYpO6io5545qndV+x+N0YvhECiZdaBr77KUAWVIH3O8EIeAwyvNGKKmTbHox2h5k8nWC', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38': { + data: 'BNaqOx4gozG6ehd386VaVAqr4Gon3oCztTSRSMdZ/HskNFQfRme+BKhMHljLFq732lVDYW13jEcx2Z3h2PQT3Bm5+v2Ke3aSSlvyIfvIiPUl7PbaaImKg19wnAaZqhxheSwVUHmBIbfhCt7UbTP3imEKl35fXcbYIOrWiea/uOy+xwcIbC9YkkRyrrk4ttFExRuZfnk8L6xfglyY9xlZak2OClqLK91l0xUfz/Ol4ylpQxWhmwiJVMkyL+S3Ild0A+CyuxmekcsgzSyx4OS7X7uc9u1SeWjB/mSAzQh+YsZis2J+hFLavUTzWUYWaKUbHcQjFQLHD3ZEoZEoB8iqY6ogeNIkrV22VVHlcBm4QDEhijApnte7OaE1kXLesCABKiS3tWwymSpLy6TMXx/Md4XSY9A+EvLLgUjkgpHq3ftMQRflNvLYlEfYJYXCoAzo36pHymVp+uIN5BR54BdNr2DbfBHKZtGUGQ5+EcnEhPpvoMnLcf59IK7C99kNJ0fLzEfBO6lvGKfG4WfO8AaVDo8sonaJCCMEdMUDKmNXlBsbZegXWotZLdIbZqN1m9OtEt6ey5PAVqR9nvHL0wHX006P2b1092Rv5fTfaltztpXDsJZNttqWP8U2vkZqYPvSBu3jdCdY4Gkjnea47TzTnPX10EdFcE2r0h1G4ap8mSgiC46j6Wuzj5IhylgL4fbmsPfNvtRQB8jlW5Btf+i13Ed79W8YnzyYbgcF02GR5AFlXBMfvZ1Ve9QETFnSDJNRLcPNNpslNVyQITBlPjfDn3NSgIVdUs0EMDsDIQrMvKHpsWuiXnt0sKrRBJ+MthJh2bD6jSSYB/f71OOWT1t+i/wDZ3gJisRR+KxZiCTt+y4zygjOiUH65BcljjTnEv+XzVci5N/C9SFyT9O0Lxb3/dNSVJLKcpQGCOz4pgM06NFQFePJ2dr8az9pjCWRwuGzhpRsBsqyOufX3QFveABvRDeaEyNWOWuCpnUMaNXy9YdfODWFQa0Snff7tDD/fG0ipAY4s0/fy7IZWd+pvgayBouKlt57JcVU6K3TMvE=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'ihfKoU9bJ1HxBWuZ+wyKaK9n8PPx1MJMB6dppZniB5tnfUvnUf9PPA78x3moJRcJ7fVXl/rNHWv9Sqnf3wggFD1iuDFCbxXAY49qrWEdXWFyGM4cihTlWQBYZu+cMWQrdi7dZPUY/lLltKTSRKplyVUmqfG04yd1qCzmiSJtzKUaIySXkQGX6oxoeOMpw3eVaKJjrIgikmjfxE8f43HNpCPG0TYq4CNmvZENZ1z2itRtgIUSdwEaH/xK49ztqxJPrbeXxTBUKIZ/toE79okotm0AysfZdlG35PT9eC/hzttdfBPwqb7auj6J3ttc7DWkFrKWEemw0dHZYL0ut+pdodcvWLLrP1Gyo9aJwfE5heImchRbGal2BTUiyZO9zALdsqjRvMYSyHfxtBUDAggWL6OA', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a': { + data: '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', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'dn15LeaR9HinK07oo1yVaKS5SgM9SN4jjB5psuvJWV77JPSXYngldFuC16IsKzrkMuRg7MUhdjRuxYxRnTla3FIzWyuwfF5XYHM/AlHMbp/K30yDk12+UtSAEe1r8bUg5ra2KOhZ2pGTxQi57qWKkVkKvnmxeQa/LuggfC8PmlYQpC/8acTPxoy5hiVmHsxO7yoTl5PHrIee88kgLiavSsKRMMHt/zIWoI7liVcPV3xqVBrlAoOgtATNdqfk3YF4N7Wokyx5sDDOlxCXYSoQkHfTNVxL6la+tHcE6pC6OezbwSagB67ysJ7P8ek2kTNfzG+/smdxq+iolTlAbJ//MtdBEDOAlfsc6nXXo8N3OjGNaOActaMP/EiQUD2NT5L/JOQw3zM5lJidNcP3urT3PxQ=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a': { + data: 'JY35iFwT0aSVy9r/b2tHFmaOC/AaNieghwPqz+PzMgu82k1WdeKZzpIZWBf7ku0VXUf1pOYRwUVM7AblkFxlnNT2LZeLZojwIAneSZIBRExaLaRpZqQEdqNYUr6tVayAdgB52ObXBArwrNRMSFkZHicGjjvoOI9WS9G+dhlPaY81yW5yQhmJmu64JebF/c2HljkBj+3hXI4utRggddaDKpOerSw3PHpbJ0dPSeH+EIWG+3cWCO5Z4BVkmm/wQZG8wu7ymWdxE1Njm83XiTSLGxc2YB4Tl72WRe7ekmobFGM1BRzf6VzmBKOFzJb5SBXCi5XdGumv1GgtJEIr2N4zRJMoVDTu9qSzF41mFKbuGaldMuVI1pTsDTWAOFYq9ntuFoNWEGucWOeFZZQQTvwzdAq0LLp8/A3qEc5Xkf6Kge9kkG34kCkVcxAKhuGWjxUVWdmLSAHKNR8hgipKGhLRoUVxJ5kLFvm/7BNXFqsKdZckFzHXfQcemFoPKDcqhuGVrRhPQ2VG4oUJTJ1ZjtQsUwJPHr8LNBvD93gHJetF4DtKwercWBmlPTAx60esw8oilgJJoU/u3SnoRa/zQdJskPjRvn55C6Kbp93GGszhiUNTL+SbyxeZOyfISLj5xyVEXCJwWOynzITQfrU4ReoWUAlhk+LwnAbnJ9rEqVPkjbA9cB+gXj2iM5EDLT9yaiMlNmiPtrq/sh0w/VV70Czgzw+JMZ7efvcTP6Q7jKEEDDF+oaj/x456gjeb1ckkK5dkTVk7AXMFAwfjfIrrPMpC1CEa5h5bwJhpqVe16IU8f7Nb1pnGvd0l8VGUAAavrHXJEePqTkR+vY6I0hriFuXTaMbnCoJW70lW/FQao7SzxOdybymL1pWPs5bVoUaX+zrvBKQr763+dm9gSBhGtpngZ2lQxmO5AjfRuv2rG/SPZsFYhTE4JKJIKEdYT96FOKqgQUQrs1MLppYH4BTqgKwjMUGoTWGJkfF7LfEgbOwly/ZGLIgCD+fk0u9a9DfRB4dIy7wstU6MN48nd5zz6GqLFCrf8wtrN1yEpI1QqjVvNv5bzuugJlnT8WfU6m2ppKBmNlgZVhYc0Va/90ybcvQDLPVVBTnjYydlgE5z86VfMREn3/5+DgsXVXS3QwXuWxjYktYsg2ts0QvzCIMCk62pAx9LVM5tn93lm+RNg1y4EUiDTbF+NqYDCLu5Ea/0GXmaHLYqu9X6z5/jPUq+EgMn52L4WsRyZabiPgxCvXjpntPJdP5XeQ5i4ACOFhUwFFRAxWPWVWv6ecL29f5WoyfXBsPM5HOSa5eXVz89Uk0v58msbf1sxkOjjzSXQOB/hUrkSt5ZlMpVfWye+6uBelHCWWfivMi+S4tveDJgDbssnagE8EDDZxIYuYhYUGfbUjhnvKuChAWw0K91ZtRDESFMpRlgBAFCwxgI2KoDz5yFWNckPA2ki1+VR6Rxd2z2+ihu4uI1qtZdzSC58PHlBFjeZKFzZPABfttlZ6t+qijg88Vo8fLLxakwhb2kJ9Fs3I3zqqnLYfkvfCw0/ZbwC5fH/5Ey9WiIaPJBjW6e6to4NJcy7pEAJVKRsCpfP80D3+LBzoCFGrdMmhwymWvi7xlG8oZPYkJrvhvW46D2apRdqAKJrfLn+oX1fCtkfagH1bJ2o0a9J+ckG4yTtoxBfkxSJ0cCErkQE1xU6ADCd8+p+2Mm1Ls3p31+Ynr8CSGR7+ITZMjMysnIc9J97DrI93Trab1mOp/T9zOM09woCbopg7IYNQxRlcmpH/vZozmGWHBWGHAvl/+ey9FDwG1t9BXf8kYGlwg=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'a4+XW+nJaw10sl9INOIl+MBO6mRdwmGZUW/BRTvcj/PlpVA0vCE7pT4JgdX3IwrF1JTk2KaGHKqzKGf8ydUiDL0p60R70BiVmQlony3kmi5XNCZ6+Efh+EGtM+4LNQ+2jojnUuF4xKRk729VMV1z7b17SiuQzcHwkecBgYxZ2Swm1SJaia4c0tk46pzsAKVrWVOuadtemhcJvHnYaQ0I2bnUEtct1wYldSI0DPkIuaI/0+xDn9jx1nk/HEu3p6cgMnS2vSN1/9jXYf1cDsrI1+yuO8lFClx34kU2mXCjDgFZGhljkgU1HJfeMufqyJ4bYPQfTL8/5NwFNNhw3HVFsrcWKcbct6bM0Puc5bFA0cSMCVx+61ONXqtkKHy9NPdvl4po3+TOmtXjooSOgQU2hg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3': { + data: '0ZJHKdh904kbB848o2+gi5KMfQ5p5c1FeE4PZrZHhIyDl13DnxFFu1vm1t1OI3g89YGQejU0vzT3+d80MoO46ItdAX63V7exVFkZDnkozjL3Pjo0iksDuz1nAHxHGMSoixIKK4WcnvqMWaMdMk8LTCl6EZES3aHaqjZ2ywROgNBj2exGBw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'iumHWw8KQNnhFThhMLBzHEJFZ7y53CqAwEn4DVn1PYVKpaMxjtBHa46XDDA3qliCbqLzPzDKllL/7HHJZcxxjyFMY/vV9p6YsZ7F9tVaF1cCQrCWdM52LDnKrmNEH4iT7VzJ96qsro1osgGwKwIucSSi1FkhWOFtOQhESWIS9TVrFo/yQj54z3x6k4juXyeLN5yDrgieypbvN3nsTOCyjIfjpaAw6ztcEOo/8R6/+mKEAej/eVs=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a': { + data: 'WQE2bjUwhJOc4e1OTFI4xKTDRNIaJ/QS+OGszIo2GxP48UVsjMts3M5TtglFfgUmXPt2B0S4Fw5zALIs1r4o1xfqTuhvlZ62VpzgkMsE9Vl0fQsZawK6a8oKErwAoacZqkdALXGjaOYSP410tAcFIhUvsBmRWZIs02EOV0DMqCe1fYSkNg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: 'VsZfs03f+Lm4zyHzyLstuhqWX2f3fDjw56HA1EvhFAPrTK6uM7pvXvseuNGT7oL40wJQWjLuJgDZ56NrXNDfoz4BUNpcrSaJ2bUQS0ZDjmoOODrLM1hFmd/gzsdpx70M/b68BEqVbHCf0Z53TOsLXaFZmAebMvbrLMXkAIYP4wrhbLa7qNaEnj7qUaV/+q9CysfaOKpRomaj3i3F3/kohJL4NdNsZ/N7qzY9/pQHFaZT/GEPvZbiRr5tGb0oJLMG3zsHKrmsZHh3kpHScyfxqWFzm85ZRAEx6eOjXlfAZey8QgZyLVmRsVsDyIRhIePHCuMukRokohDjKwlQi2k6eVXHSaEEAo6jbK2a6LgbbQ1uPNf7ay9WtxaCcGCh9qBZJ7Ndq5g746AN5VzqyUc0swstRFOn9FjB99sAenhpqzo1z0Ddfb3reiUmNuXoETlHlA8SYfb5TCVoHfw7lgV8ikv4nXW7eEAxYeB03VWBuZPFKzlI4k3tWLHGytNThQ3ZGhcH5/Fi4dKRJgtzgWAJdwX1qgP6+Gcu3DDcrzcrIXFWVtsZtFgwvS5acy6hBha1gN/EapZoidoiIIkh', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd': { + data: 'fGNFj9R5u/KSyYN9BJXdZflva/QVzNmjVFnYxqk+1CP4x91a+szwhppmeZZ4C4448LVLtj4EjcXYdDxjxlt6yJxqOKKrZxmvVWmG7i0UJ9AQlZncPSAd75Oe7MhhDv/bv2MCfPAiwCF9Jjlfl5mWWk9+y2vHvxh8/zB1gJtGlNStCAiEnL2D5Afw5gzrZjOvmgOdqS7U92fulwdSRgwj4zjkqkHj9zmP9KI6qS0lGjpZXbCiyl0FNZKwJYrD+bgyHwc7c6xIYsK/bgpWYkOzHFLjCuV++p8KM4jri0A+xxz/dWEDh2d7hIHBTxjBz4oHlSDmid58wIexj+ffJrMJmOsD1WOvAGqTH+00TYlskOpcHeozhUQRd+TPotI7N0/Dz3y5OD4LQ/p62ELIQ4nICrRXpe6YGUUst7Nel4cPkT8eIlIs582nD5diF+9PtIxLJ2E2BTeyDOgjlNf6QeyjNCMs3mD0mEFFuT1ZBGCuAPHA7Ilzpi9XZ31CSBYYRUb4gpSJaOcM4t9L7bTbxXghXEaPXKQuHdyp5wuV7uqRBJEgM3f/O4+6qXNujORp9PFbxr0+1gnkVEir4krBqllnmzY8MEMmNlNOJ+OeVTtj65Z4wPCannsLSx/7ifYUhF4nWBCH6RqRyRTHiUF+TVvjl0kmgjnbduoDJnFa6blGn5abyiGaddcoEDvE5peika4xHYYaJuh5vW2tuJGEc+E099PmJUbaXWvjGn79tbWYQi2lnSwFWpoIT910WbYMJquZ2pEF0s66+rot6XxVI4TvHbAPDyV/JnAh6yDZlUCgNDzTjYnp0KqWxpvDQPUPe6Himid5Vv8PW4bj9pwboM4KOtVu+1xFQO6W4coEM5rCqYTvAJhaCnxIUQVv3cVexRXDBhqHcVhTrwe71aJdwqk0Z58bMi7Ayl53BclB1Hzc5lh2E4wJdpUD13fQBcjCsVMCq4GZbmzNQQMTvGbiKv8LFtA7j5zBZdxHNX14fijc9hOQqQR9i3G2oqL6R2QEPiIGVxIdeScP88g/ErKsQx/fNH2nG1UVZRdkSeg4IhP649oMItef5m92MttiHsZ5W+ayW26VbKPPjrs6U6t7GK7ROPWoz7YU3FYxoha740Zo4X5Abb8zDc1Gx/Cp91p32b1E0kPmcAK6R4KLB0CEW8y6fV5o9+hd1kBSs5H7fNY8HlM9i6w5WaC/W+UKcY8DPbKsG+G5xTOf3K0f/3lpzIhpZGZEmJhMuzxx3Oxr6Y+G4H+FEgaYBMTzIJ56HMiMa97ipAyN/bqSGRh+H3krrx8I1Um921wFirA9w+aCUXNOz9chfdAHBHilRGW0zYyAc/Jmd3zeM+aIpuphsEt0aANXDmRaqKrEXRGREpm/gozFnatEZlIUwpHfIRpaG+9ivzicPS0R31x/MPyII3pKbgEmDdi3zSCCPVBf1/JFC3HV+XUkKvcfRMIk+wLagh1ECELNcLqg92y9LQizdmLcwA/ZVo8dIQfKhZfQAzXODcXYGMMGxGAF9m39sHjUj+BTs2HpovQSp/iAantJgNT2n3/ptmNYGgrhuj01B1aHCAHxMSEkOI/oNP9+on5dSpHfA67l5/lAtxVmlwcVIzY1ooJDriiR7MfLB1YGfkTwvZNuN6Kw7iVyPoy2j73T7/FOARcrAA2+wplR8EUfmhPhhBaprLu+UnxXRfm54yxc/vOUIJCOhIl9o+ZcUIVvB5dcuC20T27y/QOBb9DGFeUX2jp/UkoAFmyvFeVl2EAtv9kpycbDnUgLI65EQ/IrOteFogzWjgkDwqBBlAdlTRyfTjeJN9DocOsbWYHK1PNV32hhvwdLLs1wzf+E3S/4pb5Ozq7B7zvS710gVSRcUbvw5PtQSYwnn8Ox3fsvXFkfFu590ZVwieJtX9YIqDvjU11JYgIBfI0CliQxh1jeYuKd50CJIdlknpjFB2ncDt0/UNPuZnevO6fgJo96jd4Cq8QOcAC26cb1R81urHOnttiQf7oCeI/vG8MzNdrwBU08d41+zdD0x/wWbbCznSR+uXLKZPqaFXpuiVNXnuaWbnnjncuu4QrSyNeVjZzsEk7p2Ltm9TiWuzif0tIO2MyYd41eci83LgLdxilEFb5uqecwGh3aTchmf8x1l8SaEv//RxV2aODV8C6f66zx1Iv7IRD2y9dokqj9AIzn9oTXCvVi8z9MG36axqzHYU4KUf7w3retPn6QiAB4zL3+TZACoV2ExVj49fIp2yrudwayPKlCBYdF5lV3LPWcSeznPwHWj2INgUo/EYhmZ+8QrCtaH1uOI4I5GmnfCYEvIMKUevgVQEgTnQoW92/QXJdA+BxszBQulL0yFk6nVgaYaRyE6+0Kc+fg3UXXWdJ69dVSzDy1O5FCZHIgnHh3gjWBGMIUoac9CU9rS8XG31WFvUgmvez8jNjlIjVhuScwge/MpCd1KDxF', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 12:59:02 CEST 2009', + currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + versions: { + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'EkK8xSZRZAvE63intN3FTaRKNhNqZbu/5L94kE50wy/OdmBmYk+TVYe5WmrHxrJC+9c8g9Da7vQdH7vbBWwlLpbuPtMUDUxZgBQHdADAxN3OKrTbf0ZXLVgWtm1D/OBgVQCCKiLKPjujFSs5Kp2Azjnm5W9gLnYmktVhRYY8Y7hklX6AMyF/cTw1k2HdmNZ87+YGKZCUcDhDr77a6m5hhknxUXOEXaeKlL/Yn4QudgCJdhtbkxifB2GPl9qal9DOsiFJwg169weucHUy7q64vMFEc9RZbbJTpH7g9qGXELb7VtjaKv7A2N72FOt8WdJux3nsgBrAkZd3oIPAGr2KWSg2bxbJ5MU9Wb/LyTXIJQb5z/0UtF4dlavW2MFKBGg9vIU2fMukOq1YWKwZ1TjG6GmO', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 12:59:02 CEST 2009' + } + } + }, + 'aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42': { + data: 'cGK0775KN6QUhzU2QD7wFYwTffs1nZ0wd2otvljnUs8q7pzmnA9XFQNkvuqjh0WseVZdqGLfUYrrh2UUhMSpKec0tKEmrNqijP/7LYiSBte0Tlg9OXzIqvdhFEtDO/WC3do4rYnfpc0pJolE+I9J249MrCbSXyQV8hDeD7IRFJ53', + version: '0.3', + creationDate: 'Thu Jun 04 11:27:25 CEST 2009', + updateDate: 'Thu Jun 04 11:27:25 CEST 2009', + accessDate: 'Thu Jun 04 12:55:14 CEST 2009', + currentVersion: '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f', + versions: { + '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f': { + header: '####', + data: 'UzVgxfbPpCV4VW8nfK5AtzyKlFUQs1MXW928M0cWqPzQeA9t0+oRS60ZTvDdMjqWzM1Qs0mOhi7wdLdOoZbbT0wUgeU28IMpICZy0Jy+ezjjQxRnC8O5yPQJgg+fNrUbtn5BWMonPVWC2hb1wyEsIJyTBt7i3JsxVsPzQ18M1lyRZBwa2z0QWRZiUF6aacNf2GFXhCkycacNztQVnMlq2f7AXPAF25l9ZQIO5VViBZnbXwIyFbrmP2xJX0Xpp7Sspt3sPwWzg1BpTyjl/P8tDHA0+fe/iPhLGNk2omBko+rPlUwBymvh/t9G4PBNhuHTpEfHW1bGQ5RHGLGLJsBfpNuWALeAfioRakynNpGaCaUhxKOysTyH7BcGyDbh+QxyBkX7ITNRQg0lfNkA1PMRGnREph2g+Tclizgr0eawTstTl1qma4qYKEb2egtyABuvhi/q7ltK55VQOLO51VOY4cJQiwSXnk56FXFEaLS7Kra6zc85xJY1ZP+T9CZmmd1E/W2TMQ==', + version: '0.3', + creationDate: 'Thu Jun 04 11:27:25 CEST 2009', + updateDate: 'Thu Jun 04 11:27:25 CEST 2009', + accessDate: 'Thu Jun 04 12:55:14 CEST 2009' + } + } + }, + 'c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24': { + data: 'yEGo5WUC1jnPQRqAmksQH5Ph0ChNdS58uolzBds2+KFBNZinqbzr8OQgBax4/zN+lqLJkvHbsV9/dhPzCfGHV0Q3q6VwZt6R7n8b4V0F+IYvq1sbv3THahwk7icZcrJi9TjaAKp2w9IBJ/uf+rWoZKegmZXnF8cjq10btOk5JVkVVSaKb2c/v3CLYYz74PEb4ImMVSzNxWTy44w+YOIWpL4IMaq2nWpULIkulV0UAZLOudf38cEu9Zb6T9yGZPrACSjlANW1UhtfH5KosUMhMRlbyAWDD/CTF58Smkf/u7kzyCH8E/W7BE1C89GhWjaMwQq2VAubJ9VAE2CAJG1ax23/ZXoUgk4oK7ReY+J0QbyuHnJDIN2FhRLZt08MD0TujA4xyg/Hp9S6F8cd2hV+BFVIAb2/jXCH2OqvQ4pq93DWF375P63uC7/uz3j7+jYXOmggtfd0IX+d7uSG9V7FX064dl7xJzggSwnkBXAsuSwiQjFDB+jPpTY2k/F5+UgIVEzdR4CPMmaEc+Ied16XVTr6nXzqK1zLRwmCbeCL1ZrahmZqhqJQsV0Z66wQS6pBr6dA9YSkTCzH3lgBg/YSmNeKaaPmwD1oSoqVwkzHigdUO8lwzyvuMqZZdk42KVO/QPC8ex92dvzwvSoeW7EVNzP5fSymd6pmO3d7sdWCnzEQCWP5ADfZBrH3YH1oLY9UzaBGiLLemM3TBZfBZ3u7k68y5QnCfuHtL4Y+IEcgtOUtAe/XErIaSZjjwfw8mfrPjQ95XA3841UYNCtoLMPTGR3rRSj/Jluh6MHJc7CpTOgcgbi5VKqOIrHL88Qs1tNK3wBA8u6RhIG6B0I4lfPTE7Jq+FYDyoeNf2qGqd10XnwHi0GSoCisi4NFawaric7GmVMuQOJsJK2HVFJ5W6e+IhShN4uWQmlFpyifOd+91tMrJ7uovviHkJwcg5ROVTk5yiihGByRUmFVU0W1Azb/CWiQp3QiFKSyHq+uQKUR9gPN1WpaYupSnp4+1tJclgdeMwsQeE40qFxQbBDZynqWeSFovPHXxhiu7xjkLGHlF0QJGMXaMca0RIr9XiQKSlQ6FrzpKnFzmOPh0LnUDhd8FGuMPgHhZ8L79Utablh9GtrJd1kWzSiUKpIQoZm78Sbls9wyc1LHK6eUAYwB6A==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'k7I09dmz+LypgSeYrYH3JQGD5Mikr1YV58akOGEn2Kmi3t3n2ngvDB1+cv9hjREPUiGIi50ZQJQw5pt6eY6jOD4aCgGjBqHYNS5gfbaW9dHhjXRPu2e3yhMm+YIlAaF005zecnB67RD7POLfhRx6qjLtqktUt4mAotz3ts/nUmHW45psLPLVBlpmeTNAaSz3nXubkoyfpGrotGGEQCndB57L5Z2popMAdEhT2mVQqzzpasOQnp4PJVf+1vfrQ/9AP6ublijutHn1Oj/HsBmrwE2YQpj2wpZlGAFdghKBgtrvLMk7dsIdDuK0MIQoDmgNPwgiF5NNmG3hoNhS/WNls7uozBNMYFa+W8IzP3e442zJINdGs9zDpEVWZfC35OX4F6QKGSeoHDBkpB7aWAXfnkKz9owt+8OEVEQ=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91': { + data: 'sk0Rq438xMuzxfEwjPhlg1WxN7Hyrs6VW0wFLQBB3m/tNK9DsHpswq2eMRqKv1S1q/MFTyx7/Q8YVxRMkqKWIgUQRe0g/arWR3iHP09t5JMFIEqxIbCSotukZBgy5aXlG1WMnEsT+tIqrmJZzpOUy768JpkJjJxdr2dlGeCUJbO4bitAySOvpUoRlCb2/a6D5Cib4NU3fjzrW+TZyQB7WpspAfxxyg2zTU43D74OAJR/wy7K3Tp7hOl9cXmUoHvM3vp52ENvPdZmy6wAbz5d5Iu8KL1mxwGbl0pxx7dDecbMJOO/OjHwH2/me+DhyVTmv5smb37X90fwZRt61mn3A66ECsp3nq6pRZaaS+U9WRC1UAVifc6T4DWqrrma8D1BGnLeR9lQxJj7Jm4foKvnWqSeurdRNOyZ38XK5SBSZd/FEalS0UwawX/5qJhwdK2pQRvrTyDDrXRSNj3ssuB+3YX6l0lxacUO29wFjmkh2WljCkDBYPNKOVRLBLUtgQ1pWKciy8BlH4GsqdjvkcQorRgfgS5L0Ce2bHWbBsy5X2LReW6Ugst2wt7Q4xS75P1qF7202s89jQVQritexaUwbCibrZ0GFZFfwnDT+JjKiNiB0WvDBO9tdbqzCA7T62+wUOtCX40tQc6+4mBQkkU+mi6PfsInGiafKctrp1d7GMQHJWQHIJhx2LUvyqPxOa0hE2vqCSJUZmNVD1KzMYGguPtHbuHHaWXc1cNTjQuuTyXDuewBl4NnTgTki43J/lVt0VLuoLIEQx58y1rMTVDTiEufA62mmLxokLYyt6VLb+OeprhuYiU0PhkgkDjRstSnRE4B5JsvFcPdYENYJwRYbC8Ho/rnAvfBdGlYw0TGS0MFcd54JoXiE+oVVRDuYTVfm9ytGYkG45Z5uX0D3Qm+KZhGAd2gQ+NX6umxy0v7RHwqtUjSqI4U0SOiVRNdwFesQRFAzZDtr1tKNf56ACLt/yXl1GywrHljtr4BlQ0Nym3upNweQZyO19O3kaQmtbTbp1Tg+xewXr2MZ2U2QQRNrCzVeqe29eHU9133xo+97NxGi/HDZ5tr5aUTB+OXqnoIzSeqyHLIv4t6r8D29+MTfZsf4sNC7vNlpO8+GLYr/0S5md9Z/zlx/2iPeAPnNkf95gkav+6U8F3nL1Ok8MUG6drGrduKyv30CGDEwWJqcDFJqOZjs8reCst6S1ijRhwm93fqkg+nzqw8mZYeltSbTXFmpypD20Ravw2JdJUyo3umyZiyPaL9UsCFSf/ssO47C1HTN+OkRtMcTAyKEqhzvUei/JHaOvRhmMCam65+gKuoCwy/x7Si/oRrQ8lZkF8=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'bGK0B/s932NBepXEWJJC9i15cPn1iy44m2xFxohFQ1r2Wz4dKsy1JowXHssezfU29ge34tx7PqbJM+o6ExNVkgufb0tynMeQAyPcoV7jSnxCqBUfupTWndRq6YHkG9xdsLLrrbmmRwV7fIr8Xu6PGUbCs23sDFW25tiLDtps9VqFNb8jBQ4ms56rjtDVsL/VqBBI0koojN/e9JZr0/3Wv90a1qn3Uz0hRJnryCPuoDBmcLFdlNcd0W8I/8SGJa/94V2S4QOJD0KqP1+/jYA6p054V/tRnDlFdkV5G8vm0XqI1t5cehSV/2Prq3fGj2UaAs25C2WU0xAHPKJErzy214WztzCd9vqINx+DtPEewS0QcVvnqnC4kBMhGWKUqkJBySSQ0nHvkJrBOjeratc=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d': { + data: 'MVUf8enllOr1nuCWegNFBnC0YrydNpddm5VZzlT/xJY1YvqIcYnr9HKk4i55TIdA5zjcf5TqUdwBUJ+LbsaGA3CH9YBz6AqAxt0mQeTaS8ufyXDzxHthmTKcsKjPEuJ+1R288jz2D7Lc24+YDNrAySXWg2i3+mJNIFU/Sg7+rLiGpcvB1go4zlh0rsZbM7AnIcCRM5GQLVxtVn15xC4fDZ3rQDu2A3GNB0+RFB4xZlGFIidr5ZmUc+3/0eSdMWb57xRdCaxESjWQbGkDF6OpsozPVuXEqd7K/6RnHAjVsTWvLGtCGttznrCcaXquy1xwUr2LGnqLSu/+Jp7hnZhkGGrFxMFui8WyiVhpTxr1YkB8X/S8lTvsgsUg96PGgVlWK0XeW0GvWgo+v+6RyX4mChoTO5lzIUQuTivve8OH9RHY8YwUJeiY+Pg5ih4TpsGULQRZBIXrmWGdBA8euFSu/mPYuBZ6j0+wD5monR7pvrIf3kEQx2g0N8tdKmN0W8iYV80ONMWqwP2rnbBYHbHE8cljP624xO4fXWoMYlufyCmQp5Y7f7ugw7kWO1gYsMgY0e1pZ28U2RQsTFNLXuLgbeOPz8bpsm0lTFec+WwZ/yMTXFfaz+hFKc60sUADKO6ax24pnUId9+ih4J1DBT9IfUadXcqKN76nVWl7/iApOu/F9kMLK8AtxpSpTDVEZTcS2RhdyvVisx2vqDR34JSP4Ju7qaLIxOlMrc9DVTrz/yMzqwjjefS+w9IJvuwz2ikCW/m6PesRwTao4K0TONJE0aX0xQ19NfYJbNU9Xfs4IFyr8c755UeUA8dK15P7hgf3E6A+pBTj79a3B2SfKh16jOukNsdAVbZkJcc8m0ABR1azzNY/zr8MnHjpZuhhFFnqtxoQYi2si4Gln6Qh0uLwTN4557Igh2W0WcZKSAo2wqfgTx7iRkXz2J1BAbdaN1wmgLZKfljq14H+YGOiqhHndM3UV5VCez1tpA5eHDZyEtMIyalMbTvGRoQ2b0dC4idO4Ec9CoeYwjRZLS6wGG63N8RBdOK1RQeW6hbOrgJIQiGyZ7e34OAi7kSwC65f0Q7SOdg1JJVLgUPh9vfCkFyGEF5OFUNDR+C7Whosvvuijl4hKurZj1KzxoZIAl1IY7C+GiAL0FmaTqEiQVjjz0xf4UHqKw0qEwCqXosbhuwzhmV0EtfNRbWEj5yOt9MyXnIdEAgmer+uEP6OYJTtPx1M16KFl4r9BZ+2h7NdAkrBbkuhiq0VZvBifkinOwe/P6zo6mI0NVmLAWrAO8ZaldY2Ih/Px75C6g2u/zA+2U8k6283cQFt+E0b2qNdUcqR6sxz7gu5Ym6Ssf3+8x7KHrlsXoClcuuv2MO6De7GhRbf7+fC4IlMuw4YwRS0MIFg+nVMV4xyCAVn8z5jl0yngSt2wjdrLooDa2IRKIpxhSreVdsttCtiN0pq4ws+QTsg7PTUf3zAgVoIfuC7CuTr0fCEtYpZxhey7cuvhwtbdcANAc23OoedjS3o2z0vy9/dnEA93vbVmJ7cTztPOZA6kKKfhaWBMZDzoNbkLU7ebzqv5bpgY1/aKYLVJxUST34ZiWigna8nfBS8nnR6N0nKpslE4uPv1oQgSGTtl3A7e+xX8htlIzDxLIblQjZcZgdtZVRSmUW5/NLraF6Fceo+FZcgxiO7+0h5ychXL+HkT81DCbRMchmTOA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + versions: { + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: 'wRPWbH+Dw3y0DuWz0YDL/e5zTQukx6++cLlCY/0Fp1J2qZS6i6/CLhQrZdOLtXfEhgzkxQygcYGMCyz8wDILafKNIAoS2BcuNi9RbbA9tKXDeqINcnYdzA2NDWj1tQDoNU+/KssWdkI0VFSr+A/EpLMfa+Kqw4SMqNVbeEAUT2Nkyas+eyRVu2iLNV0bFzxzbXvHu0XK7rqL1Tj1OxY25vvA/tVRI4jlzI/rcQZrfVB/BTqzEymFel4hDLu9d4UmZn6H8gubyAU5IiK1Jf6B8nZnNhs0JKUPEYwSXPk9tAupRjQxsac2XPyUQXkemT7TgZdFuzLYQxOAtUmYHhXyigzJRDRY4KPDJwcHq5bCw4OwBNzjhCm0uCQLmRpDIauPVf6EGNs0vorkdOW758bmUjMM4fwlULIocKfhreJrGiGbXTNW80h6SljKzXdlFZAYTSdsjmACL37xkgMJI93faHuGMQ3HuVqXuuebIV8Yg7dSZdWsEus/cQPnOXvVok9qwJ1L+wJs0darskaEN9CGOEAjky9iVoRLuKepjPWrSorvEitedjErBntX0ErI9JDTCdke2jO/2e97fGlrU9++k7T8RRScpxBKmXVHnYpqiesX4KtORnGQFrV0tHgoSiD+Q9YwBj3KSRdFh2eZ0t72ejqehhuR69AZqC9KvY2b7O4PDG//emeXLXMXuVcBawZGgwpOCeu0YunjdgcASADRPVTh0x6IGP6GQ50LoiG5hhiA4z8PRqJ+twcvZ8yJr7AOOTjyMyi00nXPG0OAG5Xg1sTzXtqTwj/xVWbzUEMFt0nxMSp+EVD/Zo7+bdDY20FKz82y2DabKFGAcmjuLTmmS1RaLExvtsZcB5QihhTEwEUSI6a094udE2n1dCz5ZA408BCMi78aHFna+pg8xLEJHLcLZ2XJigkF8r98XeA4fFjWUhfYEhIjclG2pIaSBaXqRT5QA/ziMe4OBTLKTHIp7K0=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0': { + data: 'l5j1yk5VXiXb+81T15uzjSwhxBdsAQ/JG73GNCGulKTA64NmN5SMxDL5gNV5AApu+p9AKKOThZNER9wQgDt05svLWN248YROu7PTsBJpHZYLt2JKlRDO/SOWHAhWkmHrufDs6omk8TpxVbIibsE9Whp4CjkAneGFpvzIJcdZDyWfsaFXKs/gC6O6mxYgU6dBtvMemorXCgSEwL/B3NF6OkudADJUZTIha7mjxa2eWQo901kwD2EKSvVyokcMdok7FyR4cXfs9K0TSOOYK4eQWrqE6wnt3Ab8OSO9oAdCFIUB/WUES3dF7zshLNFG4uh3G5NbTHYBoOrUY4rYOzx6gXWKgv+AiqsUYQGIphPm7GSs85s0eb9IiLNb0rQnrkX/Qeqorg3EIe0aRnWmAWtRWb61vClo1lLIJFWXbK/6DSecAfWrQmD0ExbJZbNQ6WjtVg7fSOul/VGOrbiG0QysCJI/D6Pt5nQcKf7Ooze67CsrYOnmF5oU6BPZHuyNPsaAFZR5TOZMlB1JASkk/dS5W9vgX02+xEYzT14ZLqTlMsgX5ibw69xxdrTcqsbHcfbGVn98FZMNHPhP+XP+ED8XllDomt1oUZEXU2cZg/s5QLFTYKbQIu2j8xgaDMmpAyzIKQtenpf4G0VMVa1T9lVApqmw+ILC31kOWwlEknQhey1ZMowCbfLMw9ipozGyNvG8QOoDQCyJ0nQJ7OBI0m4BDXJXIj3kz6LDrH2KJYu63JFaxGNFhbNDoMNhTdLyD7cBUps1++CgKNxcSezY2sWR6YS7OBW2wvy/X5yKIOtWg57I4vvcFQCs04EanIuViPik2CRbTSAUIiRvi8sbnqXYNT1PpBIPiQJvIbi8NSjrpTjPlEL5MJnIdjX6mjXbiwp4qWh129MvMZzF+Bann4BlJQwwGhba/X9d0K7pyOIQ605W1PeOjgzSPXE02wcemgF/tvFXSDtO4LOfiSCC04OkMtGTwcG5yMOzU3rhu64LdDknruYjTZ3W3AJitWixDj/ZEeseUCQbaJjMX8wsBFrPqbTWaC9MsztY0qM0w4o3lD35k0D3whK7zdfb0i1rgw4TRG+UaAy4iv/jxB9orqjS4CULzPDXZygYopwxRJowF4Sm2u8uk9/NEsuJcDmfHOh25UTnMO1HGSNRZt8lnA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:31:01 CEST 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'zC2F75+cfQZXWJ5EquBKnCHqS1TekPWp4Z1KXd4166/CY7tcxfEzPtI/6QqkSdfPYesPgea8G5vOhTzd8yL6nIL0ksE7dTGLXx38wZTXrOftuiHKuxW2HLGE02WRtwWgvgc0v4nkG4mm7LIwX5XFSygGmG3fKfPwfLaRhayD4Jsf15r/zWmU6meVCvR3VAYvHgNqIeEOhzhVN/ZMZSZ3fb64CyDa8wc9KZpmbjg6s+x+80sriotYwYTq3CwiHqQyZOZDm3P7rhhbqy3EhyH5aTfroSBWgra3HuCzXAGFFog3S1zl+a1Mr2ZlmC/RxCiMVcHVQ9CluNU4fITebcxE3VdbcgcOzdY3O7U7cWFaCahk5y/momzFVstPsPQBhXfX6p3ofUTuHh1jj2OIRcvrWgYb', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:31:01 CEST 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_with_multipleRecordVersions_data': function () { return { + users:{ + 'catchAllUser': function () { return { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }; }(), + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': function () { return { + s: '95ae437caee9bfc2a2d716291c2d4bc7b6412072df45a1403182d65ab62818ad', + v: '30cb1d4c26a4b93f9303685f2f08d32a109411044a1251ae3cf82e6032d18c0f', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e":"0","5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394":"1","0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657":"2","2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf":"3","983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378":"4","f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17":"5","25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3":"6","5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69":"7","b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e":"8","d8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530":"9","42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828":"10","63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc":"11","7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf":"12","166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6":"13","350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6":"14","a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a":"15","91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d":"16"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"4","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"5","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"6","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"7","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"8","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"9","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"10","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"11","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"12","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"13","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"14","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"15","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"16","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"17","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"18","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"19","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"20"},"data":"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"},"preferences":{"data":"XHFpIEPRLRjziGOHhPV+FN/EWsxs74xco1JuUAfNC/6frao+PCn03q/K5Znk9mN9sQ=="},"oneTimePasswords":{"data":"GEy1evbARX4ibdMDLRHCU2WMCian6ATOcGaw4HvRGCKyKt2Gox9ZCGZ1vzaM26PqovwcUJ30xvamvtj61Mp+VZB71YJ25irL3eGiqHplx6V3sf6rCx7EzJBPjykzemuRTI5AgRf7mkVhNz2qPeBtw+Xsm33I4cK70ST7ybh8EKjok5UZOgV86EKSxv97NeEsfhkumSzfRQ7zGkT9vjGfDelPUss2QL9uhjNvm/WvabX7YVHWM1qMgxsCCi+Jzyjl9kNTt0x3G66xUFNk+Mp9GgQcz24S8HRJj0S5b9F4YRhLdUwI8y0CHk4uNPaa6VmWpwLCMEcmdT64uatmCrC/CdLrVp3UasDMGPSqic/yF7R8PR4jrvee3SuIf/NtltRUQU5JT+6wwLYwdR0LEMrOHpXZMg/Hf4V0UQxdNdH4yKOe8H00bbg1DITIL5aILVu3yGFgxlrCBTPW0OL+ql8TQukEHZ4PdnRvYWKzm18x+mmPBi5enizxoO4Us+dYshXzvOoWIJ0VFcstDZxBJSvrcWySsxMtWe37DrGD0TfFGTDj3Gd5t8nPYu4JzBOaESSp9WKtKdw31uh7wynAeuGh61LqHRWS9S5ax1C4atdYHma5Qcjk6QwLtBn+MCDOnJqvAW60YW2V+bGptOz9/nQO+cUASkTQ1uOQ87z5+3CXIsDbNk9T4gEbPqdWS8/SiyHkqarIrVkFMCqncTqzaU5wZ9l2sX29QZqJSt/NYTYPyhTbKQ8gKQOVSqXPONewMdSOsP3+4m2+JPbGUcfj+cWBdQGwoHmLlg65Oa3lWLP0s7yjpzN5Tg/M0h6qhmWT3t/6pD5JbFA6fp8HYzRvo9DC7G1KhRd6uvYUTXkzOKzxRuEzUMciV+dvfY7c5yFEnk4VrM5ssMZ5+CGGgngFG6Ab6epTn6PNmW5HTS9WoEpuwqoNnAPq1Bvv0kSK03EwdrgTW73e5Bw0xTOfSMaIWMZrORwuEf9Eus3znkT0n7pEQhpStP921M4wxT1rO4EGGXHgt/4o0OXoJfF+lgHHl95ZmPJAwxxvwH+sfGlmp6PTycyPsox50GNmkEuwSLwPLEra75YEEVQSvOSM9Wua3ed9J6LkySXd89IjNA432m2qFTXzsqX65/Yi/88CcwDt+mYfSuvkh5aSLbLtNNteXv2BirNq6QRWN4P4CA84czBnZUug6HuDHsIR/Hl0X5Eip6+7tESxitT98sftTry9b5VmxHRih8maSfrGjWCqH7Gkax3i4aQE5ErKwxgGzP7PxrWWmJeJXOlSzWXM/+iGszgHcl0bqorMvWBJGdaSQT4TyOoaeyK1UWZnsJyw4KSZJP1wEGIYAWOs1lnWiT4wrqIR1jdZBRGk1fKQ9qRwLrKzPOMeNvHLBIFkbDdAVYY4ScotmNXqSs9dWLqHfg5SkE1fAg=="},"version":"0.1"}', + statistics: 'm+j5iQXSMKvijTYJU5v7iNLF', + userDetailsVersion: '0.3', + records: { + '0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657': function () { return { + data: 'u49WrgrQIWQsB/ly5AQAmi/RixI2rGkp0JZh9DlBxgTLOhQ35lNVa9ko39zxAXqNC9ZGD/OiQz6kVT7XAA/anrfctPOTIeXEeQrTQTwlHBZ+9c4zq1ZDNP1rm00v8sr/dYpqJmpQzEko5qdaPakxMe+gag6FGdN/FbVPBbn0uVSkpiIZSNpiWEQ0uHjHN0QqfrGTQ6Yl2UeNoe9P019XTDtfaupDZwh2+DL1i+s0UrZqa6JHyXLnsD9Ue1S4muyFtptJjasNPjzSfs+BHhQj8pIpZWEEVhH16Bb3fKlr6crRktEau9uAtEE5bZbPXTDrPi59JdMYmD5CH5ftDxz4nIPuI6Y553s5T6AejfbFIX3QzMG+isJ4SDebElDCQDNBsmavojxjegZ2GG1M/xXQ8Cw6pELlJBYPidfEJaSjb5cmo/eo32OLLiR03PpQrpzqQkzcm2Eh3XrkVx1Udg+JtrC5V5t4H+BxLpk8oTbFhXVDvQ+zdWuq3icrfb1zOd3f6b9GiXFu5tqAq42xTInciZr7pPWth9yeZ3fYI/Fyw+9F2kuowy/MbB4q1TL2VjxT9WfWmIFoLaLRNr/w9E/RsvgTc/LukGb44AjPaVFckVSw+mqpAOqvtZN21kWkJ9rQk0W7CQ9tRYRfrLhWVIu9vwPkjyX2o2t0+ES810GTPNesbbGAsxlo2CC3a1GZLebeF4x+h0v30ShC9UJLhxAMD0PGpGYjc/AOkjGxTPMKLMvyA9sKKZU7PRLQQg2vFGXWIYoK6CHFBJey6Q0nTDY7Nomi+nMlQv5f9BT7YofNW2oib9wQmyS1hwBSCB2Gavh8fd7zPjETCCURfDMfuMlqRFgySiOpl+yYSHLmlBl4S6sIsdU63uyy/4QMQn/SLGh4ASnhI1GRCwODVClachEbt6D1u1JInPQtgBXyNiuKc1s5gZ2WtVB8tPfkSfUIQuuYjK2N9aVaioaWhwSAIX771+EaYMIrVeVq+twakrkFkgL8+YHF0sOoZ8ddQivsWyfsMwDAzHgGk4hMdYzr2Mbb8ee8p9oaZBVqZi8E3EM=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:10 CEST 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'HnjgIcyk9xbqzbZLcIx1BLpcxwQc7hYQ1sHpaqrKVvzx/CFeGGWTmLHoy/dA1wr8/rAUPqvaEFNjZBDfTQtYNWQ9H+Y+YzJ54TmGCQY2h2HYLSCvJWRlucsHKcW1XLIwsxLzBdtZK7AkR1dPRd3s0GQDH1pUcWC7WC0thJM4a2X38lILzxXmoxdqQvawNAeVwscokb2Z4+zQUMLdRt8o9v/CTFEsU1jzrxVSXztrhBzjkUga9TUVcYA7BpOMdFmeevvfRoVmf93BL82wDDWiYIIb6NoA8SjIK6Km/cmovGikoPjUbOErvq0TaKuC6Gl/nUpqnW4kEjR0rVDh+27AuMiJR6MPdqjAYAk7pN8vvfTk4GE6TGxl5IbLbl1yZ/7HHC/CtihstANOSwpdCDpEXLK8', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:10 CEST 2009' + } + } + };}(), + '166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6': function () { return { + data: 'QxBwxxwjNGkbV5L369GEfAGPghu3xUhmQJi4r0dhbAFscS4SgvfUPuQmX/JvDfWZFBhAHGunrPxHDDHRgx7GVVI/Kv1oMexHKbPuxhRSBRQz2HQlXDAUctW1uPo2xEbDHGr3JaCiqnHltp9XMkmGSP8IYwgizYt+ZwRllKlmDbVkX0gBgM6WzOhP5zekf0E82XauOc2YUW2jZQEKBQ3azi1kKNfTzObGL6NK4awJBlB4m+R8xmKkmybcbDOnnUfo6rXxef6KLyd1Xq8wmmh2oS+I5sbG0CeAdujbhrpJNZMkXFUjKjRu7yCrCU5rUqpKGcYUFtsciFxcklhMwk5uQmjLlKQBXcOM6lmw6OHRwzE0eOMB5iPQF+gRUo5EKdRd9B+lV9QyCJlkTgQlLLQfDSdZ0xAoEe2vzJ0p2Cijg212w5kGf7vEtQrYwb6GAlfeJiYtDKSkXXx+ltpCI8RLOXdg3KZDu7iobQZ43I4MA6QELhGhc+GeRzvHnW9rBaSdxWVgba/EHAsTVq2VSt5u4Upm+WMyAQ89VJ+JMUJu2k++tID9ZzKF4Cfv/DfP+WLGEmZFmfUldl7ot91HFHi9kH5HGgqbkqKUCHTwDyJhQM+2NAed9nPVnV5EKv1YY5ABcVE7M9FGEIVaTlPCQ4Fc2aKD2tyXuhmXlLKK3uBBsSQ3gn7NI/6s1vIDTnWQA6uzUo+IpadwGwcUd3F9TfQ2yckE/FuWq5WNeLV+Y2OeQgLZSf3y0/sqSIhDOhowNMwppZU/fS6Q17iVDhGcmZn+frfNv53rZAOg2zWM8kpLjTOtNCYsToR+2lR3hQuMUw8dJuNs9WHCywj30J2t0FEuLt3091TLD5S8mufN/O7wjloLOH0FtHH7zufyH8YgKm2KNgUHMhopsjnqp3YwXhXgk3OfD55lSaiLO01pLP5kDfNXsmUDyK9SF9gn1pt+xTVJ+ndZiFxzuFvPsASiH6f4Qp6KMoyTxl6w0cIHVZ4e9qHcEWwvTfqBHH2O1KPvijTSmlcZ3gx3HB3zfI9hrY53dJsYv1Wh6mMe1KKT+2ioTlkY0vuR/aEiD/bDJY1yTQ32/TlY5wF4trd3mMeT4yIOPjsMWPLy/H2bF68BOd7QC5EACoik0EGBy13yhg==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:43:43 CEST 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'InmPOw8JYXqygmHyo1pTce9ig7lBEINjEXHBq3O3JIJxF1+kI1+I7bMwBhPJIu7dwFgrp84YGFzk/rf8i89/55c0an0H5DASo2tyE85RZNA98ZVXDEl7fg0FXvi74248V9vfjqUajSc3z/NJb6ykHLcrVLIDupwr+0UsWXIy3jYrLhpSRUWHKMSnCus44BpqmBkkDCTvHN5YQdjGwGcevC4L0g287vDO8i8rgz0P56JwiEF9yB9jtHMRmHFsG+8RIi0xPAPGJlh7pfCkNqhx/A/aGUjB3K1PVw4z7uDzrbF0YuhElZae6HbDu3ouzELUiOV0YijpuT5Mc6kq/NIvxWenrSwNx00kAGChWScG+SUTOyCPmR7jEUHcxGS8jvaHSPQ7bkr+u8BYgPwVuvHhReQp', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:43:43 CEST 2009' + } + } + };}(), + '25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:46:33 CEST 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'f/VmR3IF/aryj9hlTaXlsE57o/x0jsH2ah+qgc6VsOg1/7xa2qtBQRhOQ8RWr9oYmjnarWqkLVrVZqP63O+0dOTmwWHoSf17dWlSZVxErV1Kmb5ojgFlkbHJX/RkcgPrav72fk/A4yJ7kb1FZjTvGNPMpJCDvSA3VT+xEukGaIig1Zt0KRA4BZasYuge2Kr97yT7mPN0d2EKeM22Ybgl3Vd+Ja+aWkTzkLLo3pRBDxFXP0PJrVHFG3hDpVqLn5/EGZguml95TVGlaqRZfzmho9VHduO/fQpDr5jelWA9ZDNkQhxyA6LlOrZjcidbyEsMYeJqVdVXa4vBnYh+WM0KJIU7XoJhur3DMD6yaGc2wAX8dwM5zyWTaseb47l+OvFkpBgstqBnIBozGqRj3ATG8e0=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:46:33 CEST 2009' + } + } + };}(), + '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Mon Sep 14 10:19:04 CEST 2009', + accessDate: 'Wed Sep 30 18:23:38 CEST 2009', + currentVersion: '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0', + versions: { + '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0': { + header: '####', + data: 'hhwId0LMOaldpCUM7uGnhMnjE5hqoMV5DbeA4TsGP81BXevlGklqkoQC3erIiXSatq5eG/dyqDQrzyzkrTl95CwINRWYmXHDhaoH6LftAeSpKHAzfpfRBX83MR9HyT9Ypi8Y1j00L5qEqi9Z+0w3szwPT2KY3ejCsgZAM8NaB/8y3sBbU+fc4sUZtWLbPxocEeS9H7uNBE+NSWjm3Hw5OvfU2PaAR9JcTy8B0HyL3h2g6/QBCEEnf6QiR0L2tfEo3iHrsyVYAdNO+P4nM/vFALCLEPCb/nWstS6tZu/u5q+KERluskP+EKzGgDwuvLwTHjq6n9mXs6umDWmjPmJBefHYQRCYpKMUM+CO+3MFKkZJ2GXExp8ihOVdHPh+zxQlke7rgO2doPJwzLJ9QKH6rnovixYkt02MrbTLNabsmXA7ystuXICcWlSRzds3GlghTdvbjnkgqcGxfzja6kL/ERSx3yq7rKT0cC3O+hWuV6zWd/aYUDnCVbK60gUAphUz/WWCfCMp6LwfRXFn24njkfkPfp9uOKYPMsY8w+crlPP9qBYrVTjX9oyKIC+f', + version: '0.3', + previousVersion: 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11', + previousVersionKey: 'sG96l6ebyht8o5i7Yt3HxAuZe85AJq4ul1cqFmjjzKe058gPKAN0QM0BEoa2xlJxIoXeIrq5A8QsHGPs0iH3OlU77RgBgHUG4TZt1QMyG+Pkow==', + creationDate: 'Mon Sep 14 10:19:04 CEST 2009', + updateDate: 'Mon Sep 14 10:19:04 CEST 2009', + accessDate: 'Wed Sep 30 18:23:38 CEST 2009' + }, + 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11': { + header: '####', + data: '50+8kvNBZ610YDniT5vM/2VKaFjO46eVWBzgz/kUgU5RmwSHw4PJlupqBRT/VM8UN8NVliS0A7IoSmIP1QWAb8n2KFi2e0V6bYnrso2gPZU4CIOW8Xxh2I8mDci9Qdo9kZSvgB37vcRw+QuYXwm+SjCKqgieGcniacVB37/lcOsGcg3I/o2Vb+ZgXbyARKS2vN8/I/XM89/0t/OUV/4+PUvI4rCHSd+ML/0801t0t9YrD9yXEnIEGl0YzHB5KQebMmhCgLWQKE4NdPN5xnPxtCXRQakGmycUkA6gPzizpBhrRTcObFeQObPD9E/T4UxICLEespPy0FRtipB13Ql35CZbc6YOJ8YbRBXBy9tzZfiP68dabGzPsQoUdhTnudqtSHTvgZgeYP6Y5X7Tl2eaAZGf', + version: '0.3', + previousVersion: '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870', + previousVersionKey: 'Lhb+2Ikt6oJ7RjzcfBKGcdw58j0p0m1U8vT8fVlPhz2Qgfs49PB+IFDJx/CAYfVqn0XugP6G/C/bt7W+26QIcUywQQMYGA0As7wQlAyntExBvw==', + creationDate: 'Sun Jul 19 01:31:30 CEST 2009', + updateDate: 'Sun Jul 19 01:31:30 CEST 2009', + accessDate: 'Mon Sep 14 10:18:48 CEST 2009' + }, + '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870': { + header: '####', + data: '/sQ8oax3ehuArmnZEeX3xiqqDlFMPNgtisChk2A6Jj3jqk+MxC1Y7ioYoY922oyI0lZG23IUHsTvDr8YV2RrIcEMXPBduPl+XcnmGpL65ei3ZeqNSji9Z/i4j7w1JawQSSfnppB9EdE2OQ8x35PnWCIKKDS8pPXLAXnJmnlar5UBhJ1vaTqQY5mi5OCCDra1KTpcFlGQH2RfX0Kl2jwYzFxqUNMyf3FM4hs7cvJcm2yYvvw/c6V4QwRIiANoDjSQjtarhK8dULMJWIXIpaHUkBLBlxpINWkGpGBPyY77CdTOgA4UB5icgZZA5lfxmkHubIpv3QegAf+TKSOUeV9UWmHj64ayHgYjQ4NB7XfSUSrnMshn6q5zY17TlM/b7OEfe2RR7xUonmNgw0ga4OVzYKMT', + version: '0.3', + previousVersion: '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae', + previousVersionKey: '4VhpG+IYuvWSUkAP+NhCcFquszJoBeuwBL3A4HkZz6cylGHu9UBjAsn5VWidptcB0jI7A487rHjVmqOdP/K3MlJqVYSNEVzdMjAfkPgZKSGrbw==', + creationDate: 'Sat Jul 11 23:23:47 CEST 2009', + updateDate: 'Sat Jul 11 23:23:47 CEST 2009', + accessDate: 'Sun Jul 19 01:09:01 CEST 2009' + }, + '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae': { + header: '####', + data: 'u/iOk4faLI60d78bNAf1i1/zxImUkdtjS5K+gQqrNRnqquQMJM+FV8qPDt9vVGgKijB/LCgl6Cfvl3Pur/do8V+X7V87fROBjD4XbmMnbG3yBBFgk9snX4upCAkoEL8XrxOY1UyoR0SiLMI/9g10PMRyLmQVCCViwl9RRjcHgI7YKekXPuVWwg9uAUV3pdOamZpyN4POWNAk4QpxVazlK6UoJZ76IAq8UUl0oHbzRNWT6d44LZzWEbsss4SgVf+7+mFMSwKxB1cVm+jgk2vcNs+txAg04EozT2cJGBsiYDqo3GrA+yHTnhdKO8tRBLBsOkmwS60k4H8REZY40xEYF2uYnZbOmBUJPUUOSH44nZ2cD+3C6YyK8GmOS/8ODd/vZ35mCZzoCnHDqqpvogsBv5ks', + version: '0.3', + previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7', + previousVersionKey: 'CNxkOXhTK/SCSZnj+MD4ws83iHGVfl1iBIfkcAhnMeqAkft6IoQQr+r73aZZDRCLDkzGX4kT9iKCGg1qwsrs+EjoeXZTrQH1Iq4J5G3sFLb+jQ==', + creationDate: 'Sat Jul 11 23:23:27 CEST 2009', + updateDate: 'Sat Jul 11 23:23:27 CEST 2009', + accessDate: 'Sat Jul 11 23:23:27 CEST 2009' + }, + '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': { + header: '####', + data: 'PPGwtNXTyrZpCY1GKT9/u0pPsSunTuRFhrPfld89swJtAeNgz4VUTXWTT6z0fD9MxnaxsxLhpofDBn2mEYnhQ5ZptSKd7/MYrkVLRyMBQaZ7tPgaWVyFZ0vhJ1et662H5Qj73reiOYuKmU4KIqydFSupgjG0awc0ZV1qwjyEwEWgopwXvrhWoFveGSrG4XO+cbxnb8ek1sRKrUVIQV2zhE6S0QT6PCl01Jr+Zd8kW91EWV/PtZn74rJcH1oBJ34WBzBrU6ARXutBfxoYgwTsOhRxH9Z0StbMSRAsBff55cOYxwuxQQCXsOWXwoK8uE2WHAG18b3DNuTm+jluNkgfUxgWZ6B8gMlFQ4hdgQ0gfWknq4+ZH0xR5TTAOBegel8C/z1sqT+hvdutBMih4uXJLeZO', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Jul 11 23:23:12 CEST 2009' + } + } + };}(), + '2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf': function () { return { + data: 'OjA3UmHDbGw95QFBZ0LMQVUgqwpWy+BM7a4eZ4FY6mb/B+fCl31PadGg6+Xp5E4zk7V4GEwnxl39aCQzmNQOsxWszVZ/7eAIFK+mm0EwmpC26hIrrEZ+8yHW21Oj/K9FBpfPZ42768cWh+K+dLQw0833n5b6UTmrOswJtzQiMyCoZ8cidw==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:16 CEST 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: '9FchrEXmKOmFxcCcGHhOQRhDf+OWFABlBt+Y7FoQWvmjILdmlZeCNEK8tBrVQDQH+SuJ0s3EHfaW2dQ3TRoe35E9P16lJiGclRj59e5f6tngE0wD4gLyRQnF9TZJTFIM3dYlwjhAewdonyh0uEnAtdZfNaeCF5xVjDKzfcUVyxXIJLa1+wdJde6ycsgTaPvsaJZ0YU+ZfCSRAiL2ACnVcjWjT7hFMQMGnCFQOMJz3OsA6+UWvhvXebdDWqVg4j1h9Y/FDllCYtvIg35ARlaJERioe7+PZiN+jki/XmoEDzd19BkK/AKB2DLC8dPEj9uu7p5r4WAxuA6iRbXDVO8HlkoywstDAKtUj0XmAfHoX2OJkHQjfYyuqabkFCQO0227Pk3vFTFnv6dXecBMLbevAVoL3EKvHpJWICL+mqpIGNJUqgDCGJEB4rob2xBNRLyExgkEmbCKoN9ikFO/JXhDT2JOSR0fmvfcEFor7exicL4HX8zgaokA3oXwZptc2Q7wTtKJ5ipen0E/2uv2rjCgTAK6vFHxgW5Fk3AGG+a2YpDedekRAWNEJdVucimepL8LPEe/GOgf2kGZqb3L', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:16 CEST 2009' + } + } + };}(), + '350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Mon Aug 10 00:39:08 CEST 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: '8TVTh0Tz2AUS6OmJ43Gp1a5ZYHhryqoDcESx/EfyefERs+AWtMg/57XKIEi1GPCA+jllOVmaJ3rnRaEN0VDiT2lST6PReON+IFR7WtZKpPOMit+cF+7WHXM9RbYsJnf00yyzRzF5xKPk/OiP0QwNOnhRrn0UUzJ0akSJS6WLJrIDF/WENBu0szn6I5g4m9v3nUIjJcpsM99BOHS7iQJmakUUQuIp5MPbALEUHmTWLcjmK+BVOctdfE1uPor1GAwgJTQ7epQX6PSPKsyPJEHgf1C5OvCN8/X0IzXdoXdTdyBCh1RaSiI+5Qjp+XHa/RK7oRjVy5aMcpKT8v3bDBlTMa1RmALqJCMDW0lVgjtNrDlQ8mxDOF+gTrDOsLiBv3oHG1H5035E6cU4TRu2xLDqpGKzJ2uPSkVwvc40o9+Qk+Zi6iAx0b+0OLF+Yy1KoXP1ltznmufLBng50lZSueYLrCfEmBfr6e+gc4VZItfGrd5sTT7IilRs7gn5+gL5Xhe5sQ==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Mon Aug 10 00:39:08 CEST 2009' + } + } + };}(), + '42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828': function () { return { + data: '5P3FrjzLuEW/pVXRA+eGyKmcmD45HXgsMFS2S5SVnKDSA5mH7FLnCPsR6BGClUNZQlB3iU9vG8IK6iIY1v0m0m9CTM1Ubk3dnDOTSrCi4BTH0vknRvBNZK7vJaChSjH6QgYrRzp85hdNPEIqjZzL+An66dFmWzphjAhCwh33s3QHA/gLlqLaxexPqcTORsyrbSzZKlpRBAF7Hb0gDHKs7YAPUBt+dlW7ZYrxBtNIGYZeh0twjza02AnOhOypsIgJrchYXzJ+wXhU7PPPPwcRKrUjPPlCzG/0+l7E6DREf72yUzIEV6IVyM3Bo9Aii10gRpxeU7XwuONfQExBjxJ3QsK1+IK8k67WzAYYUO5gu+jV3M4NivCpoYK18DrU88teIRgoGry1y/x3gzrHKZOuu8w31/UrcGw1e7lliYxYbEg3eje/znRYKCjFSVZ4ZHHKqXshGPLkip+dAXiKmmdqmn8hLQPrbxTGAPTrVXdM/WyU1NMYtJJOzsEDNTKMxIfBXnb1fRVjOPDtEpuU4Okf/FiQ3fOWkjFWh7IiyFoeKIVG58t7juvwiwERaw4gfJNWtdMAiTvh/o1o6qRAtnmH90+OWc/V0no/fr2xN/NWSBQqv3e6/dj56V8b6wmvu6O7geXF9+n46LfzMDlHoBqS/8tGy7qDnZo29TaGbPoXUkvteX7689FdOYFd66WmSAuoNddvrqogWBCMJSwiuaFpv2JAzFtWNmQAk/nN81TFjnTeiK1rl0drxwPR94Z8MiiiogzMUIkbmkGciUtMfWpUgDNPryx9gXRCCZQZXLh6EfspgahFykUXG6BwviD7jRa/1TFg4xRp9VWuul2djQRUMEQnZQ4q7hu8ZBpBvIcgvC4CxqOfcQrYMAD180UbdxQ2xJEPA3DCDQpZNWzLgJ0m6FrOx87x4/1Jyd0LaaS52SxtQCwqnusNut4dmPFKHTiPGXSuDADrlxeL/enOAXt+j7fjE5SXy4bVIGqeDv2mT8yPUam+b8tb5SNr+CD0HsUB2hsunUxjXVwcJ8Z0JBrwvvVtQAu17rEv3EcfuxFLYB/HwqUdjeCfu14/RvblCxBaX6+lAeJ4rCA8dJWbl/ckr6GkbQmGnLno8uxPrq4j7E7Ia+itowZSeJ/eLlyV+owhbILoVjwNeTqi6pkiH4ejM/+e2n4r9wB7duOiFPKnpEt/SqF1YWUZfzLoDikdzoGIERePNKzlSEa1m0IvXDxJtADiXcEzGrRXS6mnbIt+yG0xX4EsCmDt', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:32 CEST 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'cMMqKK7G+t292j0PUNh4gtooVZqEkAoY9B/vKa6FEJWXCp2IfLOSH9sU5xKnlX10NGYV4xZwgidPI8USmCM2WUIcv+ffm+6OYmEQKC1TdptcyAh32+dF2VS01V1Hb/HmtQiHT7nh1IUaV6qn34rTICtLKIfei+AoGEjQm8kwKNzNxeX5SnQfafKCmKHH8ag6SxKPggv+ucO/ECz++n30nGpjwG/tWCyMd291HfAQkseloFTPedEgEmfRfGrNmsq2iwtwKLddZJ4xvY56H8Ppxo483KZj85AuE/g8vS5Qc961YtFjA9xbE/BSchXYobLH9DAoKYtiREyfNCqHYh1cxhqE0Tk1f0+9IvGcsB9d6fahhTfQERnUAd+f+C+hsx7rMfmub2z1TTjt1CnvCEI=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:32 CEST 2009' + } + } + };}(), + '5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394': function () { return { + data: 'Yr0K3VCx9pWKSjRuk0JTO8kyYKqqYBb2xz0nP4h/WSx3is3bSy/jb5dWJhI2WKNdpK42eP0jfboITWX/4Wdg7HZoLv/usE8ld3MGKfxxzUNZDIkW25y7Chq08wFxvv4O0fHM6QyFmHQx2KRQ67e++pm3Fuc5CBl4Cgnqe9GPtMnAVJdaei/eDK2icOJ6EldBb0NGIaX2TWE84efJPVNIZjQ2OXZmLse0baim7TtS4HXljZSBNHob2v1KJ/sKh8xvw6dY8zQBAalo17Vxhb7Gd9/Vd2A03GNixS7WZAYP+ybd3lZFMMBuNXTG5bVRaMZv/hnjw+CLak+tOyNRG+ara7GivBAXjgfd0oN9qBvvM7aSm3iFV1xQkxBXhv0/GceSZNE/uPdJkUCQutikv0kpsDxWBHvPI85+8mBmzgF+aT0aKRTTnQfYSBLvPspopEv7PxhwIdjDBJPrfkAMUFuTSnZ+hriDMHoYM62Kh5anX3jYXIPmrRRuH1NN39FihR4uBNacZPEiFKmFQu2js6ruCNzaLkUFQIhu2hzdnQt1kOIG2nngruI7SEt/b3YwHIh41udtve7qKWrGaO8IjIaR8jgCtxvavH6NaRWIr6Vx4cgvqiyMAZUewzsCgY49BOWWYBR1FwcXzk0itWH0ZzGc8htlbVJ50I58Iu6Nfv2IGQvHY87arTAbx+sUNxou6Ht03KkqaONFEr1/VkAaxTNsTcuWFArAKaC25oY1EkriGUC9frwvJyHIRBSHyIzpbbtO2/mnBG7gJZUxAtEDZ3Bb3AqP6v/3k3N03pP0Y5HL199iLeKTz3pK7sgohrr8IVM1XvcsaVyTBZ3di1E4UZVbyxbrMIyR/+NMu1ZqlwGI0wjq/emTvtDEI2/l4WMxMIfQLCwdSjDYi4/HVZJvcyGNugS2gUf9hwavz+BUnV1iSI1JuxQihby5LY4Em4Hr1st7hqElfZLgq64iCVvBSzOidM1SE3lm2l2/Xx0SvLKmVxt32vO7brNSrBB1fQyq/BSOwlp6TbhnPKbh8aF+MIjexwPLU0wfs8rj+5X9j5djBKVtlCqDFtlvng043oC83lvOdbyAeppNXcloRWH8gB0+orKD0VCMMt3NTCJ6xlrDeIWqKjn67ucXub1LB35B4mJDbUT4zYWi+YWAp7QdFbZbWJUa04BzZOY9ggtbdrznLzQOXnek1gqEwrNSytvVPaWoqz25KuMpb7niKwQNe4d20f9GUMyjFcwjwlfyfwv8B8FujQ/3bCi+v4R01UirsVxmRd5ESOYi9C945ErgQZX41x18n7a4Es35Bnl743w4ZdVQw8/BpwRZ0pKe0275eDw5CJv4gFdsnTVvAhP1SqG53sREsIVE2STr0/B9cANQMjFI270JKKVG5ckYTueak3QlcqW4DXQE0wkcU59wODSBiiItFDKtZAk1pKll0s2jnuWlW/WP4yWddry6uMtTnj+j3uLNcV9O0Vp2+v9rRAEdHCymEPkEbR01Nz7FE6xRXnxnfn2xQP0N5KVZvzXMf3evbN0bEGnV9kH/gIHkiMr1CgYJeQDGcxZgKtlxqD75OV7XUSIAd9b3+j2aDmjf7a3cZrvGjkSHNBVTyPSwsIw8/09Es295fGLKRu5ZfwgZD8xjUfErluT3QAkx242RkhayNPn3yRNAGzmBZ3t70N8dgVG096lZ790eDDT1fUdusaIxAGlPebT1zZWS', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Fri Jul 10 23:26:41 CEST 2009', + accessDate: 'Wed Sep 30 17:58:49 CEST 2009', + currentVersion: 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f', + versions: { + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: 'Q3Z7AjwPFzFuRm7BJSRnd8Y1/tEqXiLdCxG2JCurixClv8uvQPQkCECmE7mn0OqMRzlMStD9UojsRK+cxsaNbQn3OstaOgm1OuZe1WLg/oSM/UfcQqfBRmCtHwKX2zjRTSzCjNamwV4n/l1/92/JOBeydVWe9pNe/WvjjfNYRRhTWViNnOaOAipfLR3uSbehgUlQ1NX1y4nrC/yEDge+73BtJNJhb9FOkKGG9ySf7vax0fEo6jVVfyV8KKFmXLL+ea0D7CoiyR91eeTKZ3bGzU1MD3KGXfPorpCoaoRK7OKrHGHGfAmNK2yAGhJ7rFnTbkna02tMSbdwHaEXVyLHejub5L4LUaqTSnAGdmSpiVEpkNbD+K2mLW8loZcMUetxFqDh5ta7/IEnPMicmpSOAVlYTW2ytpLppvU6fFKAtGdJ71GaLwQzgfKE8ZJOueJ5WBx990K0MjSXZcsqEzFzGjiyXpIBMYwFDuRwTyoxowgtlL4W8DTtrxW/XA2j1esrMXS3Bf2g6ujdSPzlve/8nimW18OkRAgPuL4seEySvs6GKgF4CyR/TsIsche2kWJ7XM3eO7Bh/Wxu6WmNBjUUVbjvOTF8pPyDkAfEIhXhTliHf6lDkW7zQs36BrGEPfOC9MKjSlX7v6jgwX9gy1ToSiht5OB77G5luThsGQhEBkydw1QGZvcKkblrzaGFznM10RXbuVyfw9HnMQQO9h3aBIgq/yynJAc+uBUtfPsGIfXbotTZ+bN/y9mNl1gng/gyy0732IS46Qikov/7KRpOv5RrosTCYaU+WrAn1ehbMzd2xFlNcKRpQSGQkVundl3A2BqYtRElJCd32FUPSfxo6gZZosI8s0+GBiRjIVihPpglE5uXk5vjbsCEpahm3XEMEpqGdyXct/blQqEsa5o2NrvIlNVCbsDIKYZ/S31b1BjVO/auWGILqzbG8RA0IGZEJhyRTx60dJEHZSayGlunkgU=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Fri Jul 10 23:24:14 CEST 2009' + }, + 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f': { + header: '####', + data: 'ITaQ5yMCeVUO2140QTcV0Fy8ucHd3zRohhgU0F9AdvWxwVm3yjZrwjZWmnOS82bZ3y/ZSrz+HGhuxuk7+yYOXR/Gp8I45UTrxFzeqJNJdWurpH6SbBGtd2CH7wHM4Bi7fUBGR9B/JmUbrTO7iT71N5MqZ2nRxr2vvCBXMcOPlFg7SSMDw6eFqDAAn6iMyaQSJvntLvM+WmOXB0S3OgUdhudUihK+Eb5tHPAy2hZKpqjavjxdGUiBEJoegUwBiv6SbCjTCDZWNXeFviw9wBJoIhSUegokGr0lNGQqMq1BpNHQ58m+VvIF2+qhwGq3UGd6qfyb75DwXQus+XezIQNOPFwPYW5uARY91KBgyIzB3Qj7ATpDVqPiW8lMs3wHXg7h6em0/FEFWonzVnoAx2HWfU278op1XQTgSTLn2DxFfM0vFeHRfb7tSwSNG9RNb2hi/cKaz5GJEQ83MO9MwGznSFHwGfn5fFW6ZZLf2cn0l1Y4VO2JjGDwy2HD0z+K7LdH+lefW/CyMmOKERnltHnMIDpEOB+jwhBj81wbU8bO9C8vc47myNtXu5hROIB7SDcV29Ufg4kXU48gXlaPuyiS4TYiM3kjC/F+6+iWkJbyFtKirRibGBIKvitkBIYkSJeD81b9IN3Y032bpZkS4uT1oELFxi1ZPWeqayEYSV6ZezqprT+t1PLvtLokKkVerbGhC0FXKkTQg27YHUNOZ3qJCXeSFEXEIWKRrHAlFvavvdIFZDUrly3nRW2H+hEbSVlD9UC6nzfgJbjh0AMS3qSgZrbf/asya3QqjM30r1gF+yn7yceyY2rEdVZnNc0x2siie4rXCa6CbBuf/OA560g0O24H51dSsrxVcgIzwvFMXWZlTuHzU9tKjGqO9sLITGy2Ap1FiLRJ+58PXtBYSixB/ADrEJFQLzbOFjALRqo6CtVzo+FUVEh744+dNPpsVLQ2dERKbrdSUxfedCyanpuW1js=', + version: '0.3', + previousVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + previousVersionKey: 'PD0gxj542sNjh49y13zXStCGpXNRRLeJpGJIal1KoFm7HlR/BbXNo8mJPFvGT7Ye2u/FQG2L7OH5RFD8QSZrDkyG2kthr1vTosT3TkDerCLeyQ==', + creationDate: 'Fri Jul 10 23:26:41 CEST 2009', + updateDate: 'Fri Jul 10 23:26:41 CEST 2009', + accessDate: 'Wed Sep 30 17:58:49 CEST 2009' + } + } + };}(), + '5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69': function () { return { + data: '47feWxZIAZlVAXvXRvAZkVgOzfklaI/tJVT/5/TXfM38kA3UIkm2L4kpfybLlJolAL+ia+3NbeDI2qqftV8nMU9VSQONuu0UGybzCYNBRm7jK+GrI4dLQs4j/slm9oDPSlNxH4DuM5Td8pae6UUdZN9nPFF3eOQTm8sqv05plhw7bElInA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:27 CEST 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: 'TJGyQDdjUyqLTS3hlbfYNbwaQ1/LvuAtNwE/8ccsxWKK07eHHshnFBN2j3D01X9nGgWKHnC3C5UZ/RIbJmmqx+Dp4xYSF0Qbrxp4WMtx6BUib0zwXOiopeZ+XaVyvcaz3OASav+Ayp1VEVoXiM70caQ125Ljmp17EYCWUrgk4gSKIy92d33Ia9GBT03x+uuVZ69y4sctTK6UsEEtrKpU3s6XzvQO/xZKtR5c1RglgRjjy+9DlFgt0+naBlpYkofS50lYsn5TjuAw+2+sc6wA3e7euzWOCHBmQjvnP3gx9nxgv34mxyuyj6ej4gSKyayee7tAKM98//2+MVJlQszfD0DAr+EdwT7EtJsjEz7jTAXmGAWSEh7yWkcWcaq2nuJhHDzocidXTuXX273ki7WxTXE2X0pZB97133iY1GKGwY1Wm+xjN+1Kkxt/UElkp9mk997BdT6ZTb8G5iLawtp4XWkRcNExFP2x66YHEhl2vzkxvwXIre/mBILJzfj29iXks59rmhxglo49J48roMZ8vMV2mMqGUFQjbchT59btyBHJSFiNpO7eqTExGdgUlE9/UIEBXSPLw1He5uANApPnuf4dPOPDJb0loYTCI+n7iMYdVJto/0s/wE1FsHQC5QfHMBlXncyIoq9PH9+aje28HRQFJlCtqs3cNr4sVbcg8h6UKi+5Wn9PD6xyYmOKeMdLKhrC65ugYMTAK/OaJnnEioWFklO1OOzSeY+4naKq8v4J89Catw7/t91+jmZeakudvQ37PXpFkbgyetL4m7rbBPb24noT6tyKcxX2xlPZwDavsRVdWKJsBXBewqsTpshIjuAE5qUPHNBfqAPzhNc1jvPjgTMYyiAo5ibVJe4C9N0N1AbR1Zqsy+ifwbSTB/9SHVSWEPjDmV+XdolPCWSifSGDhUdq7kk+nJ4Nt4dD+OcfGZlSPNH/976KttkrvezGrz0il5ssd6f+DVJU7QAwWsNax/lODSaRytwzg+5RxfO0K/tP3VQpi84RYwiJZ3T/hZqD6+9fcLJ2w3avPFyzJsGtwE5FrFOXbBHh0jHs59cBkuAfD0DNYbKB6e3M4byde8kM3MH7rEop2fDAdPclP/yClV51PMoNcMtduTc+xv7Ywf+tvBbfXs4k+UAc5sE++Ed3d1fooDwSSIB5xmHQZhlbcwmOlObnrOk=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:27 CEST 2009' + } + } + };}(), + '63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc': function () { return { + data: 'lhtfrtBUKfNoG3TCgqmbvvdfpFUUGIk3NvD197Rqb0kxJWllLFbCvOJxQfplhuIhIEciS8fIdFDPnhXJxCT6QwMf3VxKc5HM7EpN0Pm3Kmui2lKPsBpduSu1GVy5N8Q3/FE41IZ8Jz+Ht0+z9wZxjSg4ptBAlh1HHiJEsDTN5gixN0J2/g==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:22 CEST 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'e5Tfxy8NhcOTKqnnyhaONWkAYgCwgEh7DMlhOpZHwIFIKp+NUAvD52nNwkpJk1jKyoU5M69MsIGpN/HWFa+Gz/pybmR1iTLUxLE5AtB+Cu6LgiPunH4OrLIl9wbWKiQEs8XGG1Qr3Q/JamLPHitPJi7R4vs9mzoaAGoM2+Q8FSEw99vEwLb1QwhjvtkaYMsOemRCRTLWkZvLgzp94D0QVMqZfpDBhoK/j9lFYVT00EuUEQI3eP0=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:22 CEST 2009' + } + } + };}(), + '7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf': function () { return { + data: 'Q79Uv28nlmk8O5i46/0qkpbJangQTW+U8zhkme5OsgEYpFyc0dtb3YR4CooaH2f55QVSVdny4kzcBm0/JQyrmcItgEIXpbaFeZ7U/ZIZUYAZMvK10JPw0b1EVDfOuychdeOEf4GHbV9sU599v/yiobKTo5FkJYnX7bVOtYuvM0ASBf690GkszmGzHRsdD28QYNUaWLbdufy1X1ovckyDupPGmSz/Sl7SJrJLU/K4+QqKDpg3G9DJbNR+UnAIDWrl1Bt7KJzeHHdCiQ2hw290iHkncnc9h4HsxSEYXavHaSfbKviyV9arPQxRP5B4fPAqO66XwHGoCMzA/SDNfkutXxSInY2iUMfHm7B3k/6zjH79mYvwIP71YY3vGoCrZRTKE4FoKzpDhxNLUn2XYUXFNDKzwSycGSeROWnyE2njcLbMnHhqd/aneNIsDSPCAr2b4GdNdpUPyUp5idfnJ+WyX/F5v/ijrt2XHaK5Jhla7kfGyO1GcWf0e+b+3g5CUXhUgyZ7zz0v2TPG1wCtqwhj44/Q4LORD4zeatSED8nLJkjj+0x7sD6aXvDSKZIphe1/kgpWzeDlUrPJZoM6MxNjvj5OWLdwEDP/h67T7FAeHsVJyEx93GNTsWLjsNAnQEOoTs9r+ru1m17EvtGl+oWq3+qRqpg97HG5+QK0jnz77evslTpotnoSKULq7yXZBycmzmzc6TFuTVrD8FYq2E7hzZ5fQO+D1J+7MB+abPuoR3uKZDdJo+7o1nIvT0fOj5fOhZeDqLokvkhERwdivLR3EKjqnvzHT/bym6psXEA/5ktJASfowR/vyOAhVdXtzMyqakdcFiIQVYmcpE2KUpHybZtCa/52wHU0LyE9xjxIZ0M/XQzbASoVfpqbrQCW/fLI7rKLL/TdlofkxeWDHbt3dPPPNw4opjg+56pPY9hHOk2apE7bWGxcqrg/g+CwCy/7wdhahIHIjyS4rI2kqQ9IFTZse5qrVMeKHpfEQydm7tg5fX18Geh9coGpzGqoKF5VOyEk0DNk1fLvb1p1rItxw46qfK1unjAIB6ftIRHDgvDG2h5uuHnviQjHVg89Yp/+C/cCFSCfIBl78k4QzbHiPtz0x++1HujcMLqYP1+yLtOP5orV8yu8lBspaK0XVJRbob7JvR6wkg2Z4JIW0cGEyUKCOA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:42:55 CEST 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: '84khhUlnVlkWRw4txUcWD5WAGoOmHVY+HxNSlssYiGWOJErHmz3ASdkRCWq4epGjOOxC1sEUezDOOTyDSkCFs3HApOl5k80WLXSCXcjcXPoCiQSX6czufZUfR/OGCmYgeThAbKjnN//GauOEOCdB0AvXYMv1tnK9xTXoDRmOS9PxN6eUPDQdxJ9mKsFBBRRu+LEhANE7jjhu7IqMRmMxt662uo/52rt85GGChYk6qprzbmf1dRViZ4mIccXD6RpYjHsqxS02V9pC5l8u4i08DWRTbghu8fm3FRTgvr/xOZTRFZrGL57Vxps2/D4klKQ8io63uAjxSC//yeU7LHCXm84f9Uh99q+wYNwVcCQ6Fyrz91K9aa8hwHgXq5WJZa50vduwKpeLNZchEbGqLCS9eVT6', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:42:55 CEST 2009' + } + } + };}(), + '91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sat Sep 26 22:06:53 CEST 2009', + accessDate: 'Wed Sep 30 17:59:38 CEST 2009', + currentVersion: '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af', + versions: { + '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c': { + header: '####', + data: '9ZWZoxsnhlLjlSulSykBQr+WpToHUzdQ5Q3tcB/l9SePIhgQuHFP4PkA6dZGtLKazPj7EkJ0Slu3Y9TclBjggZVaA0hPpbxPm20hjS2RgFCboIWWOp8ib+xjy796TKGVGMz1RG5di8YUuSH2cc+YoWy9KI8+jJjiT28qT84fdazGag6ZamzQErDsPzMdCvxwF7W1Hd3QEA7AEU3dxvKC1LFuW4tsISrtoza/yBl3g+Vr4Ojcix3c3RnEZrhCQXxX6i9k2ASSlZytDg5dj4KAV4ZM6LZAt7hQS5Ff6IkF+5opTyM3Ahfg/t1FcAAyST74SOVI/+a/CcbQ7uGIFDYCfFWxkYwpo6fw/ezWKcqs88naHp2YVvsyfDI5OWoLCa3Kfhz1hvihX9tMFNoFi/9G', + version: '0.3', + previousVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + previousVersionKey: 'nR7icOODtT2RF4o9EMxZTH4+qZAigTLp62lvjx+t9KZvpz0+JbFnmkbsp/X3tqswLKeOyQ2wCkBIKIuvc5ot6IJNx2QTVf+Nyibw4JGWiU8qoQ==', + creationDate: 'Fri Sep 25 12:16:12 CEST 2009', + updateDate: 'Fri Sep 25 12:16:12 CEST 2009', + accessDate: 'Fri Sep 25 12:17:17 CEST 2009' + }, + '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af': { + header: '####', + data: 'i2axYBOEjs54cYL/YuYRbYVWTi9AVokVcgYboJ4A8il9yQOqev59Veb9+/B4yI5IjRHsz1wISAKmcLvMaE3ON79P6hLvGmf61aDEeyRzWnfcGTBJ3Tf5o2SBsOeVjPIHYAQF3gcSHk/vyFAKq9FUMcytgqMs36V6euMMYT3p2n3diF/wMti0nnNaA3dEGHDCZO8KAm/VWMySWH1zMkjkQ7R/Fu8KMKMnsNBJcjX0wFarVZWbuo9xJODg6vEsz5+WakY8UN6YhG//JsyFJA1F/0eynpWhAtKalhyh0JlCBo2y57iDIIT3acCxg05UMog/GpyxMiak3/iz7LEzMcVqkU7M8PGpUpHE4JM8fyl0IvOgHULKS4jcoPCQKmRAUuFbbouKwCE6sEnv2TjD9FxM', + version: '0.3', + previousVersion: '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763', + previousVersionKey: '8zvslkM62Woa4lFVxpxDCHteoFi8nAK0eC+/C70zuOkqmyKe/2Mu8YN1/hhd7TvJBW5JjzFElYm5cNv7KITHSmCe9ocwa23Bz/Txl/Yk84KC3Q==', + creationDate: 'Sat Sep 26 22:06:53 CEST 2009', + updateDate: 'Sat Sep 26 22:06:53 CEST 2009', + accessDate: 'Wed Sep 30 17:59:38 CEST 2009' + }, + '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763': { + header: '####', + data: 'dDjbpH7b47K/OR3x8DFAr8317ojvn2XU9UeW9XCXNDI8ilFYvhDh2YdKiaHnoFe9c5nwqHH78g+V/U8xmbv9ojvuAw8EAqhOlen2W3QSi4oh3eAWXGJMc7QHMDhP38l2a6NG/fLCYE20aKof0thHYAZtCA9xh3Xj8P0URjPvzPEuPxSgxxtku6wrpuUJVmE9L8iM6GMxdtBg9ohnhknnwUQl4eWYEIWmANTkVOG+85DscW8AWzSCnGlBxSn2B0nYiYcVIbv3pIh3UwUK/VOnCg3J3zqFx5pL4T2pMBFhXMSH4Wg9KglSLPb2N1aR3+1l2W1mRWy2TmqBRmis6SKz8VhXlU73wPiL1xpdSXVXGdNTIkDLkP9MYugdF7vu/u2+DgPmbFZXNcEWaZP0UwWS', + version: '0.3', + previousVersion: '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c', + previousVersionKey: 'Dq/81arpQSERdDNvvERMt5uVHxOzjUBKZ3bxe/CRZI6zdf06G19iT5L5Z7I0ZKUoKEoJNRTiB5Lh7PjDNibtY4oYRmmKXpUEPbiJKp351W23NA==', + creationDate: 'Fri Sep 25 12:17:31 CEST 2009', + updateDate: 'Fri Sep 25 12:17:31 CEST 2009', + accessDate: 'Sat Sep 26 22:06:28 CEST 2009' + }, + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: 'osJ+5cwMZ/4Gq8WSNeRGwEJ/On/jDfUapgeyDYyGzkIznGaBIs74iT7TCv/i/EfJjqJQWKT5CAMtGngGjyrSC2wlhTB29VrCagyhYVZe85FHHLqxShwXVXMlCTPqxnJ+tUWAme94Lq54W8U+/zsFBqRhxteWYcfsAT1eGxMZbHTGU74OLLYCemh4jcvV55PGg7u55MTwzUebPlJvrFOg2KIqsqUYWuRzY9TjEWTb582rihGBJmj6SrPYcBN7e5j19mKtestLFMOw05oEEFNTPWaN50GD/8IuwHc2wZyk+VNxV3NDRwwqnGiKIkQTs/ddmKe4Ny6efvBXH8a4eDvDxlDCa5UHbYAT77RTg9jFS/pNeoHp7ZATy26/P5C0WqI3YfKfvuf8H1yRMzhDTtU9', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Fri Sep 25 12:15:47 CEST 2009' + } + } + };}(), + '983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378': function () { return { + data: 'NUhdggGXc0aw9EgLWE1zCX4yTNZo5rxAvXy1e/i4IFQfromU3ARkbjBkVOui/VLrCmiExe81XqujgJHOqVp9HrgGuNxeo8ODqbD2p+/1YfxCzconrCggYf2eSvsIXuBuYJc5bGVdG/Mcp0DPedM5Gw8MvU4ix3EwVvIaoUdRi3RJYlsO7W0fPQjcWTt3rhLI0lkGTFvEbaK3b5Q0xv5mBup3w+SISIqDAvbmzNhc2DO9BzbcW158sv/+hBe9IHEtj5MoX/gY6pBdg9Dlnblql0jn/Mrfd6SR+1FAv5mS+NLqt6NHejs+8n1xnx3fOv1Tp2JoR+WbHBhL9wOlbMUjbzhM6XXB292Mb+KsqAzDdtNe/3sc1krIaSxYS6GwhPhesZOY3L84iUhAay60qdB1AQa1PDGPM+lkFEI3uqUZu32uWqnuudFAOTsgKcWVSTktk8AMD43zGbBhYKu+9cW2Ye8U1lL7E3+iI8fm8HnRiuWxGB8zKoqUZQ+FDnwiSFSsBYlCa7iLH7F1Cz1AjhCec8QsdlIA3TvbiKzzLCTmGZhezEJP8JiGifV8CDmWnrsRxgBcGj2CXAzksn0tuMGyBA1WwzK2DVtKI9utb9TV8CASn2uyzrr+OB5D7KPD0fuRDHSK2SEVPFkP7xXyLEZkFWy9W3I5bYyt7j9eUhHX+uk3WdT1onYAzogr3AhVIcMQSAeoyrxds81WaIyy3hEs8h+QzWVKhc021Xw7S1z1j5v413RLBSolwYaXrR0WjcA9VDnn+vOxsurR4y+Eca9T0+Fjt5Apzs5+nSarvi5rQbr6ggJVQ66qRv3SPIs/c5niiIVEK83xrY1fsEnjcJf836P10Ho35URQzqMlggICI/uBc7zgzPdkMBIvySqrCk1gzZi9PcHZoyNZO0i49mpGWnqDk2V24R27T9FwGkvRunOGw4nFS59NE3ixYz5SWZgIAayPBNJ5V2sSM3hUJAqXUl2vDlyXlqhhW9n5j+7nXhlwgibQ0Rk65QchlAXbmwm6QrSOX617DYhcBH12aUQMB8cQgURWmyysHV3pqvuLANvhjV1u9wkxfzuOdDJJCE4in8W2VUCTcdDtWg2L+RDAjvNGHFeLNmYD94JWdbtYRAGnH6oQWE8G+z1fgdnY6u8GNx8WsIH1thxHcle9UA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Aug 08 16:29:34 CEST 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'K1a+K0TdDtLXo6e4ayBuwGN6XSjub5Xgy5ogA6HWVqe7tiSoi4Lo7qMloK4TF29YPB2KpHOyxodkXL0YpqztESCrBK+F1Np/t/uThl7iXEFNSXSIz4l/Eo54UX/PZEmKZ+4nMiuYFgMq1rV3VLQmciexJkic9rABwnGMreJfKyDt2fEDxdVUwZXnA/l1PPPGFVSJmkNRjW/WLRByOMwJxHDK1ElbIFHdkFRzg916aPTTjcV+KpUkSligoNlxi9CgmfeBweLuDRJL75Osw3ha9WjQXrjTlr7o4sSVud3gbivYmJGgbOTzgge3K0A6ztS9+8dvvQleR9NETiWDDhJ1+3Y00jXc9jgOEyAQklD1dQ2dew23fvIVXSofVpr5lp88X6gc0OnD90BbxrTxjL0QYIMlklgTq40vNck=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Aug 08 16:29:34 CEST 2009' + } + } + };}(), + 'a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a': function () { return { + data: 'dIOpF0FJxZCaFDj1XeU1L9/CcnHDffBgeOxN30sAH+++Dv0+skIYibSLkbc5SFOFKkZtKGeXFq1fZW1Uynj3ogRJ3Qqb8+4eyBiwViLXTFefYv/g0LcHqUYBrRwYpsATZg5VcZpIvXzwIT0N5dtQoh8IskMovV8QgBICHDAJImB64c8bDjVpSn9GWMSiSqsSOu+j1IG/C2/Qxxt5smKD6iINfJS8Y36iovV9vRocW1crj6mHatJxut/EhWbKrXA7U148q2/08EZPfAS3q+Onv0VUaKxgB2+nhsUSYjP3tvVlc4LS17Q9CnbA+eNYz/DfsaMtnYKTcSh/91ViA8Kv1AGzEbWIMo6On8shuf691bzKBdRG9Fcpm5Hhb+DziJ0Go7W99yu4n6exHAxJerXpcA9t5fpsTH4T3lGhbWI5HRWoU0jDqwdE2J5jyZaUVf78CjfgESRdJuOKIuV4QX7xxwRJP9vcDHgyhr1LcscVi96XQHnii/tl+BAUYdwgvv2vtTmuoR0ydtweQbDjgLXtk/zmyYmP4dTIYbU/Qec1m4E96jZdTalWU9K8AtnopuqfLdTlFG5mGtHrRpRpmu2o7b7P0v5V/WpUpPWzk75sv2AsFD7oiTHuZ5GKUfDs8pbp3LcMNk3nSour1NyiDWFB022hwbEk66aQaNxJfCKOWwWimc4TfxhVG0imjtdlp3MdcWcAY+tJMWklDm/q5QkuHy+JxfNzHFRI63+c5+/KSFHVUfZNoIRNdDIlnTiX8zKojU2X0QRzxEc/LYkIpon5OGRnJy9Rb/HotYbovBC8yS6610ttGohDp9v+zVO1uST2COV8j8p5iBJT+YVgQvLGXg/Y6ZQw1X8nGeQClBZnPZVhHcnTtQV3tyBdsc/ZkttJ5tLW+FF9hAt48IBnI1um28Fhh4y55rznF2W4U1PyJvsmVk9eMK6ccHCXFNvzCN6XUDY862pm4atKSbIMQVuT9nOC4G2cSl2/Pte2W/s9A0RqeU3kpZg6inXYNknhTAufQc8MBHuNPkMJGTOjOA/MUKHM73+b5Iaz3pBXKiw0qlgkfsGoRZ4LVI3oU10geEqNoYeeseDU1o/UDDC1wobRxy6mrob/EstC3zoIMvM651k2h0Pj5KbjE0+I4d2mmObIN3R/OF+hdeVAtZYwuv9aa18nTlYCx7Wo7mGwzPhFVThaZT1jgNfHVFa7lxvcdi3zo5ihhPUXjC11RrcKcdINMxdvQpa/xfwV5VNagXN0D7aXaxVQj+HTlttXx2v7ElkhpLpTA632ggWBdL+HZNdWMPjE9pZO3KhU0Zg7x77wfrj3tN2QC3uDUSOJOCp4qM4=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:43:56 CEST 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'vWUk4EzThQjfNp/Ji11ZI/fO3n2sp8iUr2Fahuz7Cl7uOCNnXXFoHlbbvZNgZsrVVmK3+YV5WxblVxQYlH2IRwdXsvkfzV7S8aqJ4V11tgst31kZ03vQ+pfPV+26Nhv32sLWLK6t/h+Ap701KpPsng6rrWd9YgSRzN0gQt80aHZtxVknZcpAUmh1thx/VaehNWEwLPFOvcGr6H0Ku7U6v/GNFyBmkgPYMh2Bo0VIhns0s20mgA9L6TxwLcMYikU19WqxX9GO1n11ii3WAWA10gfFjAwYagnQiwpl5REU73I5raYI9XU0XjouhRtkMMBtCJjeIDb3GCQQQZwTcVFXeokjtAlP4JHdMy5Hrl0LvjpDI77OU/rDHKPc5TqZngvFk06TjoQ7pg2cm7c8y34=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:43:56 CEST 2009' + } + } + };}(), + 'b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e': function () { return { + data: 'bJdzIqpYsh6++iVT/jTS6bj5SgXkW5alx19H2laFERykhmkA0hxjOTaz2Sizlcsg+NKEQIASIjrVrLxcoIVnCFeJjDv4FOEACpMxNEzAiWTppWx4h6hepKT+h8gtkF4k6QvvVXHBXxRahQT2tqsbJWmOgmxdIBEeNETZb0u7gD7TjI8ATetaQ+TnhKlNbObUd/LsuJsZuWwpeZllEtNTrwNOrlHQJAUe3u+xI9O0lVBvH+/KHX4L7QyY98O/aI5wosDWPUZyv811PKOCMCsL/+2qBrH/D00YA+gCPy24riBrrK6RJWC0BdpSAUhPZA3OJSm1miqHNC7/JCUfH/alVMaoTzrI+A76LouteQmwZrXE/taTPY8zLD+TCgMOGhgxErVcw6278PQSfuERIJuXlCiXX1z011JrRE1k6JX6Ual8gwENvYlbXE2/iv/xzXK3WtI5vD+x0kRqa9LAClyhSqY4o5QXlEBJ663j9PxH/+vC25tluAtupL0nnm4sEtFmVMiZ3S3cRRZ6ZzquPD6rQjzdPpAJe0S8anC4Pf7F86Z+Ag3lbsrmV9Y5uDhx1T9pyWaydL6NzyJBw1gjgobSOw1wNMAzn+kGLqH9dP2c+Jv9zp60vR5Ljdf73jPxWcVTQxHZzXuWfb0MpYTwRDmpjqEsIKkyaYu1e7YHYaD9RNro7Aek00n4DOkPJ+lQHdeGLioNYraYwhQq7Y0HAKFsUYxv3o8vI6X8YXk6GgbhLXjBIyly9oyVMbGMShCuDE2dt+skM5Y1Wd1AcENJ+YzQrRwc0QWrYoABy/MlZbhgh4LpuQG6WajXw2kgS1Rme1tMviR+qqtnthsdWClKp0y7GZEA5ycBKABBX4RDrwIudiitswMkvBCrSLAxT3KYGxjlPwhGShf+zGiJ2vS6mMh2KS5rrcKaFtYsOSfBoNDpPaK9w9QS2W1EtwuUY4zZbUO6V1K/URx5PkZrSAcIRLw2CjLad9CbyhOZ7H1mW6ovHYXHwDPAVU4wYEqO0213w50QyBOM', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Jul 19 01:09:10 CEST 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'fUzxKwUtvtyjL1kIN6jfxjZq9CWEH9nlvSbND8x9sn7cAhmyuvmYR99cl3e8GJ23uzxHn9uKn5hTG0uUHXBMrqIpCw/QHzu4FDXWS9RrR3iGJba4DIBJPY20VpFJzWr9xbtnC8R/TDt0FXryE/V2ibiiF7dXNucbhlO+dPmyDXQpNDQf9QRRpPILCyfd01DSUVlvr+91DWgtGk19ZTAGB3Cl9WuUtRHUnBH9JhKLEohzou5p/1KcfEFwMZ2SOyiZPwwBP1NqE5fqHXqzPNzvvQL6bDxH8czkAfMlw3URJfhnlSuSKa/o15bdwMLyFaNrTjod3Erw7uvPxpyFg8Sw2yCOM4xJ1Bn88vttklNQF1ut5SkAwDYi0wUbbyP6CnE0ItVvc3MKZx+0r5RHzasJpQY=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Jul 19 01:09:10 CEST 2009' + } + } + };}(), + 'd8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530': function () { return { + data: 'PKAlMlebOZaZDdwgP/Y5cZBzXYLpBdppooxzQn7kzWNg3ut1o+M+bpfjadwdM07MTtU9PpdanlG4GfDPf1uPn/XYN4msUo2V68J/tliU7M0q2t2PKqA2YUDl3UIxMlffhvyYBpwsdary+4t41pKkPjFt3/WSthLyn+E44BbjAKRbpp5w1y//GscTXDlQzdDGoSNdSjpu8hx8Zs4tqf/9UnlwH5kh6Wzq7+Uf+eqiC7S4fPfZ7G0OZ7+N2oKHiV7EBRSX4s7vcrs5t1S+v9HUhk6SkZ7mMZBjSg1x8sB3ZZB2sLAx+QCJPyKv9+/uZLrSMe8uFHBI2H0dx73mWXE/dHK8IjG9mZs2riA+KYutHT4jV6ja5JZeLWWuZhKzooJoSk4A7cbd2zxvkyaqLkscgVBWYWf212EvGZN0ardI1fW1+RTE8QchyX6ty1AyjbU2T15HKwLvdlL0v5aPscZPQJwptOMCrjYOwkbMTvxe8YRKZb1Z1VzyCn0m7ODxz0iXV2H6pj2hierKuqeOuK3HWV4rk584ctE2KBIHh7WJnkqRYKCCQ1s90T8SNkqQiEow4Bz509seQ8ZRROy9F8GSCOeIQS9DVbQkRjgEOMo8DFSTNT1HzBiGhcaQkweh7+V7oAx21v7F+UYEIIvHlSvKXTEA6rK+eHunF1EHRvoGGTD61btaaqpfn/Z53DKd0AMGK4Uh3eSGkqKM5IW0mgebs52//xQI/BUrEimvSu5u2UYLh6V9sa/kT9yNv2BfnRckGuNvaNvQBrw5LFOfK59UXeO9h6DcWs4AErrj9afu29xHFI/h+HdaixEzsmrboBqEn0g3EghL+de7N8z4CGGQ/CzhIKmAlR5f/u0YC0xebVNLSKUzTi1m3nOhreywKCO4C0kzwbduEX/bJ34SXuYOpkjS4W+Y1mdd6tnsAPsY1Ku22pjPQz8/aKRlDvIUKi7R+6Sk6Q1pIpcwh3hvEkN1OSBea1BUho4udaulPolefLv/kqNwQZeReztukD7sfgpZr3GEocBwnui+cCLj6WpVu2qlZpxGvnitmfJbaEEw2HM3RgzibGtsybeXwWK3orcEnPqquApWtnTXP8rhP9TBW8svHA1NjCgSrvDbjmSUPsRAHkV/zlXhH+JJZMv7tg4BYNuukJuiBFn/EewEIA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:35:14 CEST 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'wuvj0q69S3FdDA0x+DniTe4no4vW6EF/xMiRD5GoDdNYxx6Npyxf6h/FiIjujncc7GK5W+p09Bqh4mHdsyBAwe/Y9c5mshB9VpPgsF9YctR6iLnOs7TGOWUJ/ScgskhagSGZme+huFkFjEe57yx2FiiswUW2XVI1SPtzHNx+sAGoL+XcB8B568zTyU50IpJfXlXR+10OTRMekaTUyNmNF+hT4FnRXQKY4XL6NKSvSH/7gafKf960kQhJ1HWI62OFYER04ANTFLiOdhfZE7YcEIG9W3G4UFPRI7NyZRewah+ETOLSrTdbhItY0kb+FrMrhNSrHLBjg2t3xmuaptDV7BoPYtTfOaD5zgwPgUCj7KnnbamgQiABGjKJnl9GMC3bej4KpKqlgMrHqUqu9AGVCtUc', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:35:14 CEST 2009' + } + } + };}(), + 'f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17': function () { return { + data: '6xoQmnyFcq066ExiktwoyXTDnu5+d7+7PwMtvUVX8AjU/1jJJpG0tN4FnVWaKIngm4cdyh9Em3F9iZ2wDJgQ4+IlqVAal5pFgA3gvsw8awqsOkQoibFcmlatSO4H3vExZ9P4vHFherBMIqo9u3zwqUClgAFEyw0UlVIJ6VIsE1qSQFksBlnxV3sKu9kjigYVWd/KodpNqiOiX3CEgQGmX8bHTh77VWXNFkYGRaGhZvXN7gx9qLSZwSLn2fzgxzBbjOlX9Wj5tQQ5pxev5pJd19pPAmbzJZcdZVFtaiWh5A8wwROX44P4X6qfcNWZt/rx8DRdtLGKlJy0GWTQMZXVeKqmE15I02EYeOPPbPvE81psZfCu+zToehQa86l270wbLKu8Cv+8Bfx8XJBLsYLL9asv6XzAoLMG2lWX/TkAPavJb8Doqpi+SEeK1YmYg7YE1hyIEjDrsHoUY1hVxruYfygahBDEoa4pyjQovhq5d0e1Arnzfo+LD0jcFuxFj6zcLjoTx8ugs0X4A0PeP5BG7VYuGYx/mBIWsu+0ksjGlkmC4EIHJpHbSeMUqfTxoMALmdg1Y8oGnHfCKhlr7ztjOBo+nE95iMQI+L8Hwnjto0hcotY/ualKzwDXf/BvlxlNov+Z9DWvMe6q+8yqyiVZE9HD7O7goienh51Pa+wV6K5jdnzCUTrK5ygk6rfbA6tLdjc1kAzCU9oJguLSwtM4z7WMel2V48kOMD7FaWZHPCatweKPaanV2WCeYhtc9X6OvIJWvv5O9j7fNd7xFByZNORQYaHFN+5xONOVJ6T28TtDn/VdVc8u71kfAYWLEG0Au+b1GY9doAxHwNN5hcP1uGHEsc5uR93qgiQLa+zZbUc8to1OylcLZY+yWdyiyUEXM01nZH6ZYuDdRUSiS6WkM8KPYLwy3NpX1Q3ZEC3uM1yi8589scPl4JhCd2XBdn5+iu231Uzu4O/fLTmN/8kNNV00x9Xa1Rj+0+Srht2WDgJVcTBoODikoh4733txmOl03KFCQd/HrRIS1DE1hrGAQNexh0Om7/WO+rzaSPmzFdyskqF1bXek0f3V1YROWxKIfHF8jz/wvqVgsGEtxgtCmXqyT3dRZlKUxNXn/ajgbulsensAQxUEpeB3OeVxNPl0SExb96oLSvMrLJO02E7hZLkB116ATnqN/GVtzHJzQLT0c1HPu9UuGQPv3D7qWpx1qMABuhaHbpyY3OcN6DOZTHuOzdVETIkYlPoja0TMyt6iHrlOM3dFtVDUos+TJyVSWjBSHVV3b7tbpGFulSan5J2BWbCNcSCMSfJFOX/U/JlovKAodr0Li85K6nej2XI4N8rVtV9ru4Ktq57/z6REvoBaIS2YXUOm9s2YhOA54CByVWvKXj0Pez6U7YVJvsviYtdp0IxJE6OrebzpVx1skZUFPTbcmuD5/GwOv6PmgciOJMY/nMQ3K+7F3A9AZgPFihLLPOh2NpNhoj5Zy6IlK3ObptD6I41HHlN3BsADzV2buAbcTDyYYZJ9VkBI2ZkkFhrcB1WM+qrkODiPxumXYGnGSHvbuZq0m5k8Kw+WUblmedHyMCLNEiwH2YQsaRd8s050wE4BcKnNU6wPn8HExn5b7CFjMJReiST08BMcszUTT677QQOcsbGvNPq1iYIrv0f2rrNHKhg2Kq42+jvHYxndfuxnTUjecCGtiGpuLdh/iehozSjuZfV7fZWhJsYOz/HAj639sJy+BMg7+gQv/yrujd1c0n8FixDryiogKLfxnnfWIUW90rRqcjRW5tn4mUfhf3eEP83PmKvafvRCyauY9Ho=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:57:12 CEST 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'IQcdAD6W2pehgomwdoNVtFe+Aq4PAiHM8lngNDSesbTPs7dzFL8DR9iR0VdPUfnpL2ddaWB1dkOI83hQ/vFZUeAHswU/6Gmg7KQPpciVsbNMAHkxidDQMncMvU79oi0QRUvgWCrVbpuNd0J9Ir1vZVU2UT8LNXi4RibORSLhFo1GIyy6Kss6GOvDDWnUzBV6VYqzcv/nrLDlL908CnbmQhCaoGd5j/TjC9Hx1UaJ/xfqOwPP0jgw5b8+ArB8tICkpLbEEXSzKG64hGyY5DToAo5FS7QvZBXhzhm1qc0VM0RCUcvU2+sCm5yvT/qV3LRPDHKcoqle2PzlumsxyuiAlI5y9UaT+6GBbTrJ+FeU1zm8fVAyg3Q+FZWN8A/YBj1qb38z8E1D+38f0hGv21QfYg==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:57:12 CEST 2009' + } + } + };}() + } + };}() + } + };}(), + + 'test_test_with_otps': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0":"0"},"data":"cllv5EtmluxBR3AWjet3jfZsJZDUXFddl1hIO4285PJOUymk5VP8nxLGSkYxkrbwIKHxxSERdwhcSVeuz+QJLFzx4hP/wngSNJT3edxh9pwM+fUs8nJunyK1LNS1JatoaWOIobTV1DbotfvxGUQI5QIxvKA="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"1FTEyUjZ/MS1Kp91l3j00WNnOel6EFQhAYyAhcr90ozYwu6UDqlKNKyp5f2ndVZS36ReoxXbzIUYUJoaQegdvic/aVfyU/drjqVA/Ta2S5ICR050ewTUBs5BebBQT2WAMzKhmhQoKvMNCJFpNhLhJ7sbevyAHX4lZbpBUz92hTQ9jtpTi2pZ7IBUFI3JPV71H0reIs8FFA+Ugx3UPVVq77famGm5mh4I0rjY68zVvqNvfB5APM9OKR+AM3jkSHUa1QEzCEObMndR8WfKEyXlYoEhnhr1UEra8v5INHpSacU8210="},"version":"0.1"}', + statistics: 'tmRcqihMK0YvsnFoMKH5F/rN', + userDetailsVersion: '0.3', + records: { + '3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0': { + data: 'nlihNmY5UjnGFxilT5LoDRvdp5WoHausCTiulBY9/Fm82ZJCEZ0mwH96WzsnQ6zMvrZPFHAr1zGAQPr82/MOr7xTVILjbEP6MKq9rOyEDRhY/3CVQgJVWLPfwiL9ihw9jKkd7ea3eU/RSj7V0UQB1zXzEXFqw0FwQcpSuCOl5hkYPecydA==', + version: '0.3', + creationDate: 'Thu Oct 01 16:21:50 PDT 2009', + updateDate: 'Tue Feb 09 08:57:03 PST 2010', + accessDate: 'Tue Feb 09 08:57:03 PST 2010', + currentVersion: 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479', + versions: { + 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a': { + header: '####', + data: '0xBSvvZ3EJhc/PmW+8PtpaLSAOmGo4i0sG9Uwe9RGbzDILvna447spjscE3IxIucj1EuBagtc2hvIT/tgkA5IIp4fq2dSvk3RF8h5+hXPy877tEZkiQFpigyUHd27smpYDSYc0Bzv0DWx+eR72TFIjwbU/CXxKR3qqyzma+q1pqIf1GiaZWlM+Qv4xmKEkJnRd6NdOyTwuAQoZ9q0O9pHtkDQ5eKQlwvuZuL+8Tdhn/Mvr5HzIset+4wo5HNvmkLNAtonChJpWWnj6Gc8LTI+ImSjM5PVku/O/pJKuCYtMovzzEoNuFWrtdn9XESKF3yjtpKzuDxsNPrfX5Mz0iBZCefbWEtmqeABn3o5IgkpW/rhSmsyu8UcCoq91O+Yb9+8qlcsJyjcLECd+wgkpN926vcg/LMTWUW6Oq8x1a6mM8Bw1u9kT0eZGgKvu0CZpv3bpgVAWbfGW3aTM/0moWjHa3amJaL0DPjF8Pe9ujUDlqVEiPHznzfS+aVB+M3DtjfNEMysab77imICRs39cm6N/XAz+CNnSuP+W4WPfbZZ+3xWU4BgS7YXd/AM5rlI9sXNQQgzVmQttNo', + version: '0.3', + creationDate: 'Thu Oct 01 16:21:50 PDT 2009', + updateDate: 'Thu Oct 01 16:21:50 PDT 2009', + accessDate: 'Tue Feb 09 08:56:46 PST 2010' + }, + 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479': { + header: '####', + data: 'DGvb5Ur86eYxzJrqITEX5XqtGQT3QiaR66B2vw5F+6fo6cxWwCztnoEFyLUPzZGWqYMIIwA2rKaNBW0PxO1ehu7kyyQ/Tj42g64JiI4sVtb47W5/En2blTtkPe1FjpBiVW9ZaTDo4ia2wMzrBxTpUJ/NCT/Hn/xAyhZrafL+SN8U94F/FX6n5x98fV9KwrtjPpqeDEtfwheiEzws4qoPy1arXgnaECxOFnri7KpjwE8WVzwbU/WFOGPewKY4bLcba4pp1KjjObhVcYyj3K+GkSHeXyBDQqZi1grKvGOGvoZkFr7CDndseaXZ8og3A+NpqPcOzbqNst97gsky2RWc7bD2MfyAJ+QHzw5uDFCoKnAv5VH1HxwkShLb2QswQFf9/AGT3IDFi6ssvELk8xSMTgICV9jUwcTwkjkBa1Zpf4GTr6qrzen4YzNeK6XxgAqueKFbJoC8p0l1dBGBoH5zP0bkh3QENEFk67FT3aXUtInP7ZDX9Fnbe6qPkoztgmG7TukNUs2pk1Z/iJTVrUdLTVtwFI56LaTfRT8Ica+yFJc+1zoKeEg9LKcnbgfPY6WK58o1vXlhYb8j', + version: '0.3', + previousVersion: 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a', + previousVersionKey: 'vy7sCLt6q3xaMngGjJxVLcYe60vW0LHXDVZGo7QWZCIOjK26Yn9JvpeAi4rKJ0/ggGGyYJncqHVr68u/VHuwJRUmlRb7JRk5k9gJOyuroyx5wg==', + creationDate: 'Tue Feb 09 08:57:03 PST 2010', + updateDate: 'Tue Feb 09 08:57:03 PST 2010', + accessDate: 'Tue Feb 09 08:57:03 PST 2010' + } + } + } + } + } + }, + 'onetimePasswords': { + // OTP: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg', + '7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102': { // reference + 'reference': "c3664af5744319c6d3b874895f803df19cb0492acf27cb51912110d023ba9b38", + 'user': "9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8", + 'status': 'ACTIVE', // 1: 'ACTIVE', 2: 'REQUESTED', 3: 'USED', 4: 'DISABLED' + 'creation_date': "2010-02-09 17:57:14", + 'request_date': "4001-01-01 09:00:00", + 'usage_date': "4001-01-01 09:00:00", +// 'key': "7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102", + "key_checksum": "53739910c97d74c80c6028eb3293ffbc652def811d9aa11725fefa3139dfcf29", + "data": "aN3rPl5rusBWXveUpjKqZNFLRPWJgH2Zs8HYQIaS65QObQFWFTZ8lRpBXFoPlvSOHcHQpEavZUuq31Y/2Y9sI/scvmZjQ8UEaT2GY9NiWJVswGq1W3AX8zs32jOgf1L5iBVxK54mfig2vXFoL8lG0JGGY1zHZXlkCvFPWuvwuCcH+uRE0oP3it0FvNFBV4+TiiGnGYgD9LPAVevzr/Doq5UXjn9VplVU+upeDTWY+7rlOdIOnZG/A9P9/dQtsyMb5c5zABD2FNpQQ40JDfG/nHt5WvfuWmPwUisW1181oBAd5BwF9LgVHdrhcSh8OuUL7rdbKTPTlWT826I6JNrFMzYGMY+NV6gllDvc6eCNrgI98ABhL1AoZNpAXXuCy4uQhEYmj+O71C/eXEDw+crMAXiCn6SZrbTM8GT5TQ5yF2NcxhudopO4qoILjnwEHZZ+i37kRDFg6oCBccCD67oHTPexUkSqnKIIYLli5CdmE7UdvX6LuVG/VYJKevOUgMf0UzHDPgvtlp3gsSo09TfNPOtoeAiogL6cAHb1seZwv+6E8Pz7WqkkOTsBQYeHIfPE0OnQPDtUjVRA5MTTX5zt6rCCNDKNbqfkPu8V4am26ykaWOSTXZYIcfnywkG0TfPzdAyQvyxdUyl/r1b36bclQFiXcRzkz9zS9xx14Il3QjYXRbIFWcwm/mEFltBFPdATKo5Zh+wcTLiFh56YEUVa9/h6oN8281X6zxH4DOw=", + 'version': "0.3" + } + } + };}(), + + //------------------------------------------------------------------------- + + 'otp_user_test': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + // username: 'otp_user', passphrase: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg' + '0faed660854b02a5eaa7140f58d9dfee875361b353609f638efdd013b95458c9': { + s: '61994a953b7c053abca196ecbdb76547c9936654a434972d3d1de84e927077e4', + v: '9250fc0a479f36b9aff3fc0c37e88169cfaecd25c2c6d59ea2f58271c2106265', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1":"0"},"data":"Yw3NlPSpFc3YQl9pMh2tvcVWHVwISUBoFGqlJBwxtuLb6vpyEg9AJs1LDjtLd+4Zh3rkBD8Hnxgc6R+DpNBrVAq/hENoMVtAtFm9FznEQO4YOe0jKGJei/jTRrG3vf4pWG92jUHd8JDZ482AzArp5leaQXC7Pg=="},"directLogins":{"index":{},"data":"a52Xx78tyoffHRu5J99fr3sH"},"preferences":{"data":"AFqk+zN3X8UzmWw7HI+p/BvL"},"oneTimePasswords":{"data":"9iwi/ScBH0o7SVZz5nLvu792"},"version":"0.1"}', + statistics: '68Nb/l04isS9JcTQf9bmwq5/', + userDetailsVersion: '0.3', + records: { + 'a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1': { + data: 'hNdplOo1+O6pW7HQ6ReYx5CBDzWL3oopwf/7dMH0RVMYHu1LbMRZDRZTpjnLX33UoCkthF4Br3xkLwg5gDMuR3unx7Eyyf35yZj3rcLr+ckj/z3rV2rlBgVahwV5xh1E3nVXiZueKG4qUqQisnrJWj3Cl88c0KlXtsMew2s93l8OuJJS0g==', + version: '0.3', + creationDate: 'Thu Feb 25 14:11:54 PST 2010', + updateDate: 'Thu Feb 25 14:11:54 PST 2010', + accessDate: 'Thu Feb 25 14:11:54 PST 2010', + currentVersion: '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72', + versions: { + '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72': { + header: '####', + data: 'QZgYCpbzVvTd4KNRZW25SMXSyv0PWt7oje3nokC7TWSi/bdxcS8vQyosyFWWa9r4lDpO8/y7FYaa4O8b0ksX3MCOiQeQNI1a5+Bod9sZHWGnILwUnm8jVnuLcOrG/a69/ElLXdObwTXBvYDgHul1gIGWaV7cxYZmYFU1TlgPm0lklPrWqvteurZ8EzdBa9wrUOdKEfEWncn83Mn0KGXnm8xARYu51X4HSWrzKO5fpYqk5o223esndY4X/nLG416HAdPTCOwigMcqHV41asoc0pZRacQbqEhK56xAVKmTnquMt3oZVc/oRuW16ZajXl3A0I1U6ZASOBIZzSDaPW2vKYyEzLT2jxL3fq/GDgs8V5Ctlk8/b0Z4KjB/00NaikyLaVnEvPy4gBbzPHWNEOXjdAGynL/Ez73mNIgBEEUSviN5D2usydJYHF2mTFqldAy3', + version: '0.3', + creationDate: 'Thu Feb 25 14:11:54 PST 2010', + updateDate: 'Thu Feb 25 14:11:54 PST 2010', + accessDate: 'Thu Feb 25 14:11:54 PST 2010' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- +/* + 'tt/tt_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { + s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', + v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528":"1"},"data":"WrCX6cVPslFMYTvGWv7PVwWicAlBqB1I3QX0TNfxM6jrPrObeV4hRrRezUn1rLbQgXYFiuZdQ9mN8n51wNFcQvAXi0TcqmhIu23t6LI360ITPIwq9vNNEndt66ma6W1ANYcx6w+4uKga4ci5NA5vRwXN+s9M2G78HKApu3tvg1aayXmcr7FhoQ=="},"directLogins":{"index":{},"data":"h0MTipBOXYKi5HWM7eAEMw60"},"preferences":{"data":"Ws8wpQlRPwzQCt5hRWrKUUz3"},"oneTimePasswords":{"data":"eclAiKZ8snvT4Rwe7fCyUYXl"},"version":"0.1"}', + statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', + userDetailsVersion: '0.3', + records: { + '77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528': { + data: '1DGumxvp+09fSbLxed0wnGW5kh31ORuA7xhVOA==', + version: '0.3', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009', + currentVersion: null +/ * versions: { + '': { + header: '####', + data: '', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } +* / + } + } + } + } + }, +*/ + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js new file mode 100644 index 0000000..1cb92c0 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js @@ -0,0 +1,172 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +MochiKit.Base.update(testData, { + + //------------------------------------------------------------------------- + + 'OLD_joe_clipperz_offline_copy_data': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23', + v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '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', + statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=', + userDetailsVersion: '0.2', + records: { +/* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { + data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: '.....', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + }, +/* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { + data: 'B7RNc32W4K53PWYWQ4aUkqSLV2O4bwExYXVPFT+50MHxrhYt4/yh2idYXAooF1ImaIlvyUsIbI4EnIoBQ33ed2wxuSA9HVC4+wTrE05EfjYOw66yJO6R6TbIazOs0Fob5PJCFEW6evmb6WWf5KsHwifOo+ACMHK799yZ1dxfaIEjRBmLCtnc8sTNvo8i6McAf7WCffA1vXbyVPEhxJjmrfIDqvkWsNR7jDV5xIA021WicOS0FxOnzU3FecU7EF/UPcYjTKfe8IKw4nDXSKIIgXqCdzNYsyZkw2OnMDVJoSwNdfiog3H4zFy2m9KZqPjwnHHj5BE8rdx0JuZoSnTFLR05p4KdWfOU4BrjehAWXZdudYqsovtDm9uMLgUfx4DV/JKVmGAZ49GWM1Tx7pY5PBbJRTO3674FGWYHTPEMiIpDk+zt1sYIR2YBbJTq4fFOIPsgmOfvYdTkSvdHLk0fbxoK12w+atgmXAiNgE6T7DlYT0IMZlEesw0Spchxoo7lTBUPXC93bl/JugyhoRLUof4dxFvsIvd18Gnop+h7aCVW1S3lqZ36TG/N+hlM4U54FkpHjJi2fN8M8EKF0N8n399m58RNfsX2FriUVHozdb5gpgUXnQnVaAUrtv177lz0sRO+9KqbhJ16dCDzMFLcarBvXGqWkj+ZfkpNIaoyl8KTeHTQTbSS2IwLTvs69fbMW6Mub3VD81CXyY3MXyF4hT0U3CFVD4jQg+xODNnqqrkl/LebWy/XP/HOoNTxjygEu1JcS7zCptRagNoucXVkWinyKGjR9fSEltsrXG2pm4w2qsovRB3vfYp7kx2m5I9qc11K+JKhgPUmpm0S4BnPdfpRMXq0w8kxu08Mwm1Debhrzrgjw1/s1ZtcpoFgJv4EWLboWbo+CKWYdq0AGl+b5UHREPnGOM9o9bOg3uvaOEKZyMq8wxECBjdas4wjRbMY83PcBfzCbOU+POrcbalmtwn4/ILkHPsUcaOHYcnKwkxSYIDRxQc69mHw1+vilSHUQ5dZYSWIRvV3yPe9eqZPWJsWrOyhPLCf18BoNdfbgHFL7b2KN9xLMz0tdHxVozH2TnwAavcNqAE0hVIgtyEDoT4rI7FVMSu5mCIN2KOxgXB8XREZokT1BQ8+rz6JraS3JYQNz+7Bd6iB6OaTStsFoaBkj50MszNdwhRViOCCUk4bUr45XRtyh4ZEXj/I4pyJUkhR5H8/qKKD', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { + data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { + data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { + data: 'YXBq1ZlFhoosb2Krnk0Tk8+LKyecTeZ3UdJujrryEgvMnhGJvSVVtN3uph9gts10Kw+tF5wvdAtBFdMUpvcP3mOlbnX7+HCz+JsJcLLVvuGBU9ciwok5kRKQuvWffmP7qFLuqO2VJUj2ozjcpVssStZOrfDXWrJwYfkd9IMnOJVmCwjFeXpPlkOeHNyhjPlfZhWWlTga6xLdEXaVeZyjDegzhlhh9U3e1CLupLTwdxXtNCPRXp8gU7e/I9HP/qdnj5BzgDxaKx29v/AUcgOt3jq5oWwePXZL9nVOp6rh/UqduM88tyxEbnBQxcGj9KxTVsIh6ywzQZgnPtfrPaqX4Fvb1P9cGN80/F+/JXVgL3fvrcxJDGxZj6VYFTA+cHM6sV+F4/7wMLUVlCcn78BB6/k3DC4mYUv+8LSxfZf22bWCcSyubPTRhmCm2/sgdOloDUKT4AjfZivlpJjkYNDtNmZn/rUpMr3uLiHeWDDNB+eGqk3lAFhihBPXqDJ3o+8c9jrznedMxQPkgYD0V9ryDauY2RYjQIhmXqQlnGxpGOO2lFDGYtkwsBplPy6LDkudzJVAqp5trBR8Ty87k65hbhinGCra/DgPqIxjaN5pvZbXkOLoaIoLnE9RRGdAwfUTMIg/maNRoDKaHO0hJ3ksCflu71H9tzPjGM7BBjWjQgUvwDJOgnEPyZv+noOiHfNIq3u8CfI8e867gnEbdtd3oPYex1aBYIQ1ELAxI8szUtSeMDHOouXrZKwy04xVdC90KHnVWl49scE2QfgqV4hqzFjtuQgZOqQ50bI+duWDm7YYTwKVlo5QKy40faW6dPIfDPRsxY6M3gcL2OPBm+WMopUC/o/AFSpxPaut1DOr3mXBip0Ejam9xmJhMOUwIJDoE2U+8S2s+UJjRunLb680vqbddF24aWxpLL1Fg+hlRZ/Jz1ZajonH9ktQhoQaTl+w/4uHhMZjKH7/FaRqge2WMMwVjOd7VXNByBPia6W7VbmDk8LFCeCsC1DchcDaMj/JmoGXucqzDO/sOIby2YCBsV72ReqTNtu6SLZe4G61DWA7j+6NiOSmAutYox6VsoRsKaJYkyBgmq5hWDZmWOJ/cC1pQa9EMoXzcaEPicmXx5YE4xF15VWpI8cKTM/StLtLcqTs78Z0fQAicz8YhhNdVCGp/zcjJRPyL6XCDhpvMxcIOnU7', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 10 */ 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 11 */ 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { + data: 'Ate/x8b4UWG3C+gZ7IzIfZrHSlh3eSANVYtd034pXi4V73+rc5OynELEiMxDgvcr+4r5YGNPKvTB83KzOBznmZsEJhNpCd2Ezyk1i3FEo+Wur/6EYBBvDfHSQNrRfYVcNlx6+i1d6a6lDYxOcxfEPuL2141KsCRxCId4FWvDU1Om48ekFNyeOl5ND+k4GLymYIjG7HC6VQZOwUQgzlTfZpjeJ1q3pdPWSEtX8a0b5pgmHVB9X56u+vjfYFcs2ieh3UcR4Vg8fIJQOth/pE2XoZfbALyT3pnEcW8vQrrmFcavt9bDGGzlEkGB9JEIyMzUqVndV9Sw5OsCMgOEpMKvELRnlyieUvcsYSL1s/m8GohguMrXDiRV/nCUhZbH/j/8jXEX4kfiaIT5uvPBymTyMTGGLoPBT7mOWLuV6NoU6ND0QwSEXNMpZDJDBhl37hR4kD3GgjCv9gjasADAmHPZF386LNxnOIMTfrOIwK3sXkfhEU9EKdC+QT+W85o6HQrWXsqNesxU2cs2uW7rmadUBoQdyYTtWH3cBWcwKH56vzlOG33JG1+DGH6MFEd4vn1I0aoluPuBom9ERgLXEoqw1tx4OAx8UCcev8dnZF1YcGhcUXyORjgjd6CTfMDz+f5YMkulGwPRcm1D7uof0a2ryV6+c5WuccUX+Pe/Vj3WOQXts7pdukLp+idnlpdSw4roJWU++1i7727MIWGUFcKMH6qyH2yZ1nxLNour/u6FYlxRvNkB+vCr+hko7iBlTw2GMVWUMgnFS0A+lQ1tGawAM9h8lpb75GCbiWNXdnbTx/GdQzKMJJXKGpOeuWOXlJSEJHjWzVwbP21ql1OaFLr9ihUJdLzSsjICW7pGH/iuhuIlx84N57ctV2BTAYJtPLG+f3rv709lOD/5pgdXTLijjX473Ymq0TgGBSI9am0Pwz7SB2k1LVkBVfAVxR6p8Vb0h3S1LUojoJS5dfGV7TtTu67CemoRNISdOVL9kxCoue1QMsd7GTnY3sy/P4eFHovCtU0suUYjHRojUz5B6xPlL92Jbdtq6fGv+V+p/HnKFXkf3BgPnSm2zexCAEgT8yuJ86UIIWIEhYN1UtzJVJ6BykCCGbZrCSEHyfCcRLreYYpNcMPWpLOLTMFpLiHtW6+x6/tVB07K2NDpYZUY4Ekym4bRrLUXtDjjcltL8qUPQf/uBU6tfpGrdZB5OAWnsxzR0x+4ycyz84Pq81NMUVKnvhUWrygtatZhFYhNWYCz4NRfqwnwSRQxTr/2NliO22BhGc6fjZWdXdqmyw1+UXVp692nsV2FCldz8+k6LMA0AKBuQXcK5v4mYQOWmSKlH/CpkPkOEIPrQVmgjMv1/qWaEIvRJUYpPsnFUD5a12NlBBxBvHpcXemHZZvdgnBnOyAjIbhxCAsQnw2Rc6SzF1z4yviZ8PSeh5+zavbI9rgO3UtsPBO+R+5kky3KxtnLSV9m6m6Lb1QmpwDKQ2ddTDXFLBasyE0WdrCDBTDpCLDRsLWdODzyeCH0yWx8tfKfKRI5dzBQz4xJ9swkC3LAr7XubkCw8RMzCUAC/WKMRIsoyXMP2Il38fSG1aO6kKyUvY6ai8a8IDx3Do5TQMgS53N4tQNls8ZcglYDydcXhxsH7ztEjis/2omJbwadtTRYv7fu5jbZAC21XcGhfbgPp8h3Zal0SwuN6s+Uyz8LSwnZgrN0N6d2cNE39628kZkAwI7piZG7VV0XocrGnIu+6oe0QmJsxiAMvaheh0K9Dkf98rS2OF3LDwosaSzxUBD06BD1C2BkleM9', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 12 */ 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { + data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 13 */ 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 14 */ 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { + data: '3sIazRfi2ps3Mh69YkIYFFyDRXU8cTRuBjCevCJHyJOfxLPOcJfUX+QuWv50QMRchAG1RYTwqTOFd4G4ixzmt9HjHlJSpFXva8TvNfUaoggUWWTzNraRxB0gJex3JGfQd4Nlve+wdISrn5vUJSWBYcFEFo9504TcDAkVjwFYrLhBDFv53d3B5WuanLzpRuB8lIj5r5ZBYszraRDeSjEKQ0OtTojxnkZOB7dDi2IYdorhxhOeBmi3ucAXeDLZbaZdPAXmo6CNEYxAr0z9/aCrvLxZEfNoBvBMOnHT20wljSGsjf6QG/KEm352ix/uGSrJNbRMMX9tVloeSmEkwxkAn4ZQwIVq/0IS970MkL+jOH/RFhO6UT6x5OPo+Yyf3EKmRWKKeZbv95C5WNRcfLjeNVo5Zihq4fAUEfwHtNTaEEpLoUdCbzgZqBKcbLk8jo44lznz41T4R9QM5ofRAexywqVlEzagztakcrgyAMGumqquuKscJmqxEyxZLwNWD706DCUkiG2a1m/umxNvVkCNE6VBxbZ1+SPrcsRVfdtAx3eee056xo+KYKLdf84j3DR27H/p3QYm25sdLhUU0QtUTDTP2aKUxEcsLy5MIZV7256AlRS23upmvtb+VfJCsT+FwedLNCzu4SEk8Iz5AHFJ2VZ0g/2A7DH7DiuaxSqEn6iSqVZRnTrhWsW/lTZ61Swji+wvzk+5RnY8wBFZeudUX6ERy9n0e4n8EkGXCObwSnyIe+Dxs32MQFXb7b6NUJEfbq4GxHUjJ6fzRuTqQysRKlQ+qj9Hl5+HvGhyliDpe+PQ3V6kFE52qVArAYzlR2sZJmxKPIgU6wPPuCMcg+97own4gSO6PWrnlSZs87ptZdZ1iiYPDajQjyLI9WV/IN3APbiRufdEjjmCkoxB1zwSHzyW50Wdl1pEW19/0j+KSFDeigXXVg0LAko4uuJIPTLR8L8gOrcNZvIqHB85XnsbO49+SUwcykXSlZSq3il7D/9FuGJK0ecKdEMf/UetsSaX7x3L92fzSIjqgFSHrCPrqLVWdI5Sema4vhx3aes+hF9oohC9jqb6vS/b/vXfVf2vs2hPelqk7UIRzPmaeapzF0RyjGoAljBIrPFmyAmXcpQ/NlJSI7UjMjoFWsOXshJiy+0/luVkzfoFSordVm2ZhR9zkVKKDHlrFXXkw1upVnf1xFV9Z4SEVAZKgWRr2vLbmD5tITmR7qxzNTXrikqujVvOeFCHkAW1c5IcOk/VjPO36CNL2EZbpRHc6z25gST8NYn+Ypee6FGliHGFbzJxTwHa67fRncf9H1Iunzl+x3J3/0973z5fILk4OtMq3MKUFjdj2r+hqwU893+Yaza7l06Jm+dODTXhPA0T+JL4gaWHE4Ci9SsX85uvpZR++Tfx3CB7uXvOKGATmVYkAMndNCOBCbHz1/zz/Fg4Awu4aAPap/DqWsoVXajuYBSBNpaxpFWeioX65PPEPgn+HHmtjn2c647vwdv3iBopTJJlipoW94vkTJe4tpO1e7DA5EPnzdxJoRyXGbipfCRlfblcurQP+hXZHobfqmzMuyEPp4t7b5oiYpwzNnM4/sh9NxTpj/a4urjnIwg8yzLNvdletAuME0oQu4DkcWpPKhyDpelAPtdhDka2YID/WhUfg+gHKpIjKU271eoUwhScCcW1cBY41htaSNftJq96r77piMYo6EAAuf4X++MIT5LiwsYs/qzjOrmQm5pdSeAmR9f1fkqsIAv/TDhgAgIC0zAmvUJfkxIEHOMn4y5i5qZqlDS/Nvd/ZWl0lMjPSJaxd1pm3echWZ8/+gPKMib5sSO2eYYOMq/DR6k2ILThbHJp1G6gqcyD/LymNO7BrCIDfGEgp+fCBFXYBjC6+Otkukcvxs1uJsirwWbYLaoC25iYChdhwmoOys8=', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 15 */ 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': { + data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + } + } + }, + + //------------------------------------------------------------------------- + 'syntaxFix': "" +}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html new file mode 100644 index 0000000..f77bcb6 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html @@ -0,0 +1,106 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.User - test</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> + + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> + <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> + + <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> +<script> + Clipperz_IEisBroken = false; +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +Clipperz_normalizedNewLine = '\x0d\x0a'; +</script><![endif]--> + +</head> +<body> + +<pre id="test"> +<script> + Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); +</script> +<script type="text/javascript" src="User.data.js"></script> +<script type="text/javascript" src="User.data.old.js"></script> +<script type="text/javascript" src="User.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js new file mode 100644 index 0000000..4e7a21f --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js @@ -0,0 +1,2082 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'invertIndex_test': function (someTestArgs) { + var testIndex; + var invertedIndex; + + testIndex = { + 'key1': 'value1', + 'key2': 'value2', + 'key3': 'value3', + 'key4': 'value4', + 'key5': 'value5' + }; + + invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex); + + SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index"); + SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted"); + SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted"); + SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted"); + SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted"); + SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted"); + return MochiKit.Async.succeed('done'); + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_test': function(someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + is(someRecords.length, 20, "joe_clipperz_offline_copy_test - joe has 20 records"); + }); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 20, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct"); + SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct"); + SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct"); + SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct"); + SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct"); + SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct"); + SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 22, "joe has 22 direct logins"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 22, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct"); + SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct"); + SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct"); + SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct"); + SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct"); + SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct"); + SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct"); + SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct"); + SimpleTest.is(someSortedLabels[19], "The New York Times", "The 20th label is correct"); + SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct"); + SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getCredentials_test': function (someTestArgs) { + var deferredResult; + var user; + + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs); + deferredResult.addMethod(user, 'getCredentials'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct"); + SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginWithOfflineData_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function(someRecords) { + SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records"); + }); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 15, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Google Account", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct"); + }); +/* +*/ + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function(someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins"); + }); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 17, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct"); + SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct"); + SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct"); + SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "The New York Times", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'sortRecords_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var caseInsensitiveCompare; + + caseInsensitiveCompare = function (aValue, bValue) { + return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase()); + }; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('0')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('5')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('19')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'"); + + + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('3')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('19')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessToSingleRecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessToSingleRecordContent_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someRecordFields) { + SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches"); + return someRecordFields; + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }) + deferredResult.addCallback(function (someValues) { + SimpleTest.is(someValues['label'], 'email', "the first field label matches"); + SimpleTest.is(someValues['value'], 'joe@clipperz.com', "the first field value matches"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordLabelAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "This is the record the test was expecting"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "setting a label on one of the user's record, trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("New label", "once set the new label value, I can still get back its value"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "The label of the record is restored to its initial value"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordFieldsAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordFieldsAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@clipperz.com", "The value of the record field is correct"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', 'joe@example.com')); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@example.com", "The record field correctly returns the newly updated value"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a record's field trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@clipperz.com", "The original value of the record field is returned after reverting the changes"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("A new note text", "The value of the record note has been updated"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(true, "also the record should flat its pending changes on the note field"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadUser_withoutPreferences_andTryToAccessThem_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("loadUser_withoutPreferences_andTryToAccessThem_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + deferredResult.addCallback(function (someValues) { + SimpleTest.is(Clipperz.Base.serializeJSON(someValues['preferences']), '{}', "The preferences are empty"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordTitleAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Edited card 1", "The value of the record label has been updated"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); +// deferredResult.addTest(true, "also the record should flag its pending changes on the label - 1"); + deferredResult.addTest(false, "changing just the label (or any other attribute stored on the header) should not trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordTitleAndCheckForPendingChanges_take2_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_take2_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); +// deferredResult.addTest(true, "also the record should flag its pending changes on the label - 2"); + deferredResult.addTest(false, "only the label has changed, and this should not trigger the 'hasPendingChanges' flag on the record as it is stored in the header"); + +// deferredResult.addCallback(Clipperz.log, "======================================================="); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Card 1")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "Setting the old value back should void all pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "also the record should not flag any pending changes, as the original value has been restored"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndThanResetOriginalValue_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndThanResetOriginalValue_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "setting the field to its original value basically reset the change, like 'revertChanges' would have done"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndCommitChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newNoteText; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + newNoteText = "A new note text"; + + deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCommitChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("", "This is the original value of the notes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', newNoteText)); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag also on the record itself"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 1"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest(newNoteText, "It looks like the data edited was correctly stored and reloaded here"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'multipleModificationToRecordTitleAndCommitChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var user3; + var newRecordTitle; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user3 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + newRecordTitle = "A nice new title here"; + + deferredResult = new Clipperz.Async.Deferred("multipleModificationToRecordTitleAndCommitChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the original value of the label"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle)); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 2"); // FAIL + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest(newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); + + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle + "-" + newRecordTitle)); + deferredResult.addMethod(user2, 'hasPendingChanges'); + deferredResult.addTest(true, "changing again the value of record's label trigger the 'hasPendingChanges' flag also on the new user"); + + deferredResult.addMethod(user2, 'saveChanges'); + deferredResult.addMethod(user2, 'hasPendingChanges'); + deferredResult.addTest(false, "after committing the changes, the user has no pending changes"); // FAIL + + deferredResult.addMethod(user3, 'login'); + deferredResult.addMethod(user3, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest(newRecordTitle + "-" + newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'saveChangesWithADeletedRecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("saveChangesWithADeletedRecord_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has oly a single card"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); + SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); + SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); + SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); + return aResult; + }) + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); + return aResult; + }) + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); + + deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); + deferredResult.shouldFail("accessing a fake record reference should raise an exception"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(0, "after deleting the only record, there should be no records bound to the user"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'revertingChangesAfterDeletingACard_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); + SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); + SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); + SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); + return aResult; + }) + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); + return aResult; + }) + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); + + deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); + deferredResult.shouldFail("accessing a fake record reference should raise an exception"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(SimpleTest.ok, true, "after reverting all changes, the deleted card is restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lockUnlockAccountAfterDeletingACard_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var recordID; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + recordID = 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'; +// recordID = '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'; + + deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "Initially the user has 20 cards"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "Initially the user has 22 direct logins"); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "There should be also 22 direct login references"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "The selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); + + deferredResult.addMethod(user, 'deleteAllCleanTextData'); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "after deleting all clean text data, hasAnyCleanTextData should be true"); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((20 - 1), "After deleting a card, only 19 are left"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((22 - 4), "Initially the user has 18 direct logins"); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((22 - 4), "Once deleted the card, there should be just 18 direct login references left"); + + deferredResult.addCallback(function () { + SimpleTest.ok(true, "nothing wrong had happen 'till here"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lockUnlockAccountAfterDeletingACard_2_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_2_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 20, "Initially the user has 20 cards"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 22, "Initially the user has 42 direct logins"); + }); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLoginReferences) { + SimpleTest.is(someDirectLoginReferences.length, 22, "There should be also 22 direct login references - 2"); + }); + + deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 1, "The selected record has 4 direct logins"); + }); + + + deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'deleteAllCleanTextData'); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, (20 -1), "After deleting a card, only 19 are left - 2"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, (22 - 1), "Initially the user has 21 direct logins - 2"); + }); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLoginReferences) { + SimpleTest.is(someDirectLoginReferences.length, (22 - 1), "Once deleted the card, there should be just 21 direct login references left"); + }); + + deferredResult.addCallback(function () { + SimpleTest.ok(true, "nothing wrong had happen 'till here - 2"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label for Card 1")); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "Setting just the label would not trigger the update of the record data and nothing will end up in the 'updated' list")); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult['updated'].length, 1, "The updadated record should be listed in the changes getting ready for commit"); + return aResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'saveChangesAndDataCaching_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var record_1; + var record_2; + + record_1 = '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'; + record_2 = '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("saveChangesAndDataCaching_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "The card data should have not been loaded yet"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Also the other card data should have not been loaded yet"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('setLabel', "New title"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Changing just the label should not trigger the full loading of the card"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('setNotes', "New note text"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(true, "Changing the notes should trigger the loading of the card"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Changing record_1 should not trigger the loading of record_2"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 3"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(true, "After saving the changes, record_1 sould not have the remote data"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "After saving, record_2 should still be NOT loaded"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordFieldAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); + +//deferredResult.addCallback(function (aValue) { console.log(">>> #################################################"); return aValue}); + deferredResult.addMethod(user, 'deleteAllCleanTextData'); +//deferredResult.addCallback(function (aValue) { console.log("<<< #################################################"); return aValue}); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "after deleting all clean text, hasAnyCleanTextData should be false"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deleteRecordFieldAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); + }); + + deferredResult.collectResults({ + 'record': MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), + 'field': [ + MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), + MochiKit.Base.methodcaller('fields'), + MochiKit.Base.values, + MochiKit.Base.itemgetter('0') + ] + }) + deferredResult.addCallback(function (someValues) { + someValues['record'].removeField(someValues['field']); + }); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "The record has now 2 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 5"); + + //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "Once saved, the record is left with just two fields"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadDirectLogin_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("loadDirectLogin_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(1, MochiKit.Base.keys(someDirectLogins).length, "the Amazon.com card has just one direct login"); + }); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "initially the record does not have any pending changes"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); + deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c')); +// deferredResult.addCallback(MochiKit.Base.methodcaller('runDirectLogin', true)); + deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('getFieldsValues')); + deferredResult.addCallback(function (someFieldsValues) { + SimpleTest.is(MochiKit.Base.keys(someFieldsValues).length, 2, "the Amazon.com card has just two fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "accessing fields values should not trigger the 'hasPendingChanges' flag"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'readingVeryOldCards_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("readingVeryOldCards_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('Card encoded with an old algorithm', 'the label of the selected record is the expected one'); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(6, MochiKit.Base.keys(someFields).length, "the 'Card encoded with an old algorithm' card has six fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "accessing the card fields should not trigger the hasPendingChanges flag"); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(7, MochiKit.Base.keys(someFields).length, "adding a field shoult bring the total field count to 7"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes - 2"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addingNewEmptyRecordAndSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var newRecordReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addingNewEmptyRecordAndSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addMethodcaller('reference'); + deferredResult.addCallback(function (aNewRecordReference) { + newRecordReference = aNewRecordReference; + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "Reloading the data, just one record is available, as a brand new record without any changes should not be saved"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test <internal>", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'label'); + innerDeferredResult.addTest('', "The label of a brand new record should be the empty string"); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record label"); + innerDeferredResult.addMethod(aNewRecord, 'setNotes', "New record notes"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addCallback(function () { + var recordData + var recordVersionData; + + recordData = MochiKit.Base.values(proxy.dataStore().data()['users']['9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8']['records'])[1]; + recordVersionData = MochiKit.Base.values(recordData['versions'])[0]; + + SimpleTest.is(recordVersionData['previousVersionKey'], Clipperz.PM.Crypto.nullValue, "The previous version key on the first version of a newly created record is equal to Clipperz.PM.Crypto.nullValue"); + }); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 2, "Reloading the data, two records are available."); + return someRecords; + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('1')); + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.methodcaller('label'), + Clipperz.Async.Test.is("New record label", "The label is correct") + ], + 'notes': [ + MochiKit.Base.methodcaller('notes'), + Clipperz.Async.Test.is("New record notes", "The note is correct") + ], + 'fields': [ + MochiKit.Base.methodcaller('fields'), + function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The fields are 4, as expected"); + return someFields; + } + ] + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndTestNewRecordIndex_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 20, "The user has initially 20 records"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test <internal>", {trace:false}); + + innerDeferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + innerDeferredResult.addMethodcaller('recordsIndex'); + innerDeferredResult.addCallback(MochiKit.Base.itemgetter(aNewRecord.reference())); + innerDeferredResult.addTest(20, "The index of the new record should be 20"); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editRecordAndTestForChangesInPreferencesAndOTP_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user_2; + var originalPreferences; + var originalOTPs; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user_2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editRecordAndTestForChangesInPreferencesAndOTP_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getServerData'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + + deferredResult.addCallback(function (someValues) { +//console.log("SOME VALUES", someValues); + originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); + originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); + + SimpleTest.is(originalPreferences['preferredLanguage'], 'en-US', "Preference.language is ok"); + SimpleTest.is(originalPreferences['shouldShowDonationPanel'], false, "Preference.shouldShowDonationPanel is ok"); + + SimpleTest.is(MochiKit.Base.keys(originalOTPs).length, 6, "the number of OTPs is as expected"); + }); + + deferredResult.addMethod(user, 'getRecord', '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "NEW LABEL")); + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user_2, 'login'); + deferredResult.addMethod(user_2, 'getServerData'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user_2, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user_2, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + + deferredResult.addCallback(function (someValues) { +//console.log("SOME VALUES", someValues); +// originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); +// originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); + + SimpleTest.is(someValues['preferences']['preferredLanguage'], originalPreferences['preferredLanguage'], "Preference.language is preserved"); + SimpleTest.is(someValues['preferences']['shouldShowDonationPanel'], originalPreferences['shouldShowDonationPanel'], "Preference.shouldShowDonationPanel is preserved"); + + SimpleTest.is(MochiKit.Base.keys(someValues['oneTimePasswords']).length, MochiKit.Base.keys(originalOTPs).length, "the number of OTPs is preserved"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addRecordAndSaveChangesMultipleTimes_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "The user has one record stored in its account"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "After loading records, the user should have no pending changes"); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [1]>", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "Before saving, the user has pending changes"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "After saving, the user has no pending changes"); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [2]>", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 2"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"record number", 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "After having created two new records, the total should be updated accordingly"); + + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "Reloading the data, three records are available"); + + deferredResult.addMethod(user2, 'recordWithLabel', 'New record 1'); +//deferredResult.addCallback(function (aValue) { console.log("RECORD with Label", aValue); return aValue; }); + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.methodcaller('label'), + MochiKit.Base.partial(Clipperz.Async.Test.is, 'New record label', "The label is correct") + ], + 'notes': [ + MochiKit.Base.methodcaller('notes'), + Clipperz.Async.Test.is('', "The note of the new created record is empty") + ], + 'fields': [ + MochiKit.Base.methodcaller('fields'), + MochiKit.Base.values, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new record has just one field, as expected") + ], + 'fieldValues_1': [ + MochiKit.Base.methodcaller('fieldWithLabel', 'record number'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is('1', "The field value is as expected") + ], + 'fieldValues_2': [ + MochiKit.Base.methodcaller('fieldWithLabel', 'field count'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is('2', "Also the second field value is as expected") + ] + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndRevertChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndRevertChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + return Clipperz.Async.callbacks("addNewRecordAndRevertChanges_test <internal>", [ + MochiKit.Base.method(aNewRecord, 'setLabel', "New record label"), + MochiKit.Base.method(aNewRecord, 'setNotes', "New record notes"), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}) + ], {trace:false}); + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes shoud restore the previous state on the user"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 1, "Reloading the data, just one record is available."); + return someRecords; + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'logout_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("logout_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); + }); + + deferredResult.addMethod(user, 'logout'); + deferredResult.shouldSucceed("Logging out should not trigger an exception"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lock_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var returnPassword = function () { return MochiKit.Async.succeed('clipperz'); }; + var failPassword = function () { throw "Unexpected access to the password"; }; + var currentPasswordFunction = returnPassword; + var passwordFunction = function () { return currentPasswordFunction(); }; + + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:passwordFunction}); + + deferredResult = new Clipperz.Async.Deferred("lock_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 22, "The user has 22 direct logins"); + }); + + deferredResult.addMethod(proxy, 'shouldNotReceiveAnyFurtherRequest'); + deferredResult.addCallback(function () { currentPasswordFunction = failPassword; }); + + deferredResult.addMethod(user, 'lock'); + deferredResult.shouldSucceed("Locking out should not trigger an exception"); + + deferredResult.addMethod(proxy, 'unexpectedRequests'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(0, "The proxy should have not received any extra request"); +//deferredResult.addCallback(function (aValue) { console.log("PROXY.unexpectedRequests", Clipperz.Base.serializeJSON(proxy.unexpectedRequests())); return aValue; }); + deferredResult.addMethod(proxy, 'mayReceiveMoreRequests'); + deferredResult.addCallback(function () { currentPasswordFunction = returnPassword; }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'registerNewUser_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "new"; + passphrase = "user"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); +// user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return MochiKit.Async.succeed(passphrase);}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("registerNewUser_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); + deferredResult.setValue('user'); + + deferredResult.addMethodcaller('getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); + }); + deferredResult.getValue('user'); + deferredResult.addMethodcaller('logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 0, "The user has no direct logins"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'registerNewUserAndAddARecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "new"; + passphrase = "user"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("registerNewUserAndAddARecord_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); + deferredResult.setValue('user'); + + deferredResult.addMethodcaller('getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); + }); + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [1]>", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('saveChanges'); + deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); + + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 1, "The user - even after a brand new login - has the newly created record"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'changePassphrase_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newPassphrase; + + newPassphrase = 'zreppilc'; + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return newPassphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("changePassphrase_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "This account has oly a single card"); + + deferredResult.addMethod(user, 'changePassphrase', newPassphrase); + deferredResult.addMethod(user, 'logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "This account has oly a single card"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'rearrangeRecordFieldOrderAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + var fields; + + fields = MochiKit.Base.values(someFields); + SimpleTest.is(fields.length, 3, "The record has initially 3 fields"); + SimpleTest.is(fields[0].reference(), '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', "the first field is the expected one"); + SimpleTest.is(fields[1].reference(), 'fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2', "the second field is the expected one"); + SimpleTest.is(fields[2].reference(), 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', "the third field is the expected one"); + }); + +// "6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b": { +// "label":"Label 1","value":"Value 1","type":"TXT","hidden":false +// }, +// "fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2": { +// "label":"Label 2","value":"Value 2","type":"PWD","hidden":true +// }, +// "bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410": { +// "label":"Label 3","value":"http://www.example.com","type":"URL","hidden":false +// } + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('sortFieldReference', [ + 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', + '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', + 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410' + ])); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.User", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html new file mode 100644 index 0000000..d762093 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html @@ -0,0 +1,47 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.DataModel.* - tests</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( + 'EncryptedRemoteObject.html', + 'Record.html', + 'DirectLogin.html', + 'User.html', + 'OneTimePassword.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.html b/frontend/gamma/tests/tests/Clipperz/PM/Date.html new file mode 100644 index 0000000..106774b --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html @@ -0,0 +1,59 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Date - test</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <!-- script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script --> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> + <script type="text/javascript" src="Date.test.js"></script> +</pre> + +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js new file mode 100644 index 0000000..df271f1 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js @@ -0,0 +1,90 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'offlineDataParsing_test': function () { + var value; + var parsedValue; + var expectedValue; + + value = 'Tue Mar 27 06:41:37 PDT 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 03 - 1, 27); + expectedValue.setUTCHours(13, 41, 37); +// SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [1]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [1]"); + + value = 'Thu May 10 15:01:21 PDT 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 05 - 1, 10); + expectedValue.setUTCHours(22, 01, 21); +// SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 00:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); + + value = 'Thu May 10 15:01:21 PST 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 05 - 1, 10); + expectedValue.setUTCHours(23, 01, 21); +// SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 01:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); + }, + + //------------------------------------------------------------------------- + + 'onlineDataParsing_test': function () { + var value; + var parsedValue; + var expectedValue; + + value = 'Tue, 27 March 2007 06:41:37 PDT'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 03 - 1, 27); + expectedValue.setUTCHours(13, 41, 37); + +// SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format returned by the server is processed correctly"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format returned by the server is processed correctly"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +Clipperz.PM.Strings.Languages.initSetup(); +SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false}); + + + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html new file mode 100644 index 0000000..573dac8 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html @@ -0,0 +1,65 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Proxy - TEST</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> + <script type="text/javascript" src="Proxy.test.js"></script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js new file mode 100644 index 0000000..8a16a5b --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js @@ -0,0 +1,117 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var proxy; + + proxy = new Clipperz.PM.Proxy(); + ok(proxy != null, "can create instances of the Proxy class"); + is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleTestsWithTolls_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var proxy; + + proxy = new Clipperz.PM.Proxy({shouldPayTolls:true}); + is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +runTests = function(aClassName) { + try { + var deferredTests; + var aTestName; + + deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false}); + + aTestName = window.location.href.match(/#.*/); + if (aTestName && (aTestName != '#')) { + aTestName = aTestName[0].slice(1); + if (aTestName in tests) { + //Clipperz.log("single test execution, via fragment identifier", aTestName); + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } else { + deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); + } + } else { + for (aTestName in tests) { + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } + deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); + } + deferredTests.addBoth(SimpleTest.finish); + deferredTests.callback(); + + SimpleTest.waitForExplicitFinish(); + } catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); + } +}("Clipperz.PM.Proxy"); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html new file mode 100644 index 0000000..7937380 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html @@ -0,0 +1,62 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.Toll - test</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> + <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> + <script type="text/javascript" src="Toll.test.js"></script> +</pre> + +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js new file mode 100644 index 0000000..b54996f --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js @@ -0,0 +1,202 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- +/* + 'simple_test': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var tollTargetValue; + var toll; + var price; + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue); + + price = 1; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 5; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 6; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 7; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 7; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + }); + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + + 'deferredPay_test': function() { + var deferredResult; + var tollTargetValue; + var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16; + +// tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32)); + + + + deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false}); + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1}); + + deferredResult.addMethod(toll_1, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5}); + + deferredResult.addMethod(toll_5, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6}); + + deferredResult.addMethod(toll_6, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7}); + + deferredResult.addMethod(toll_7, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 7), "Payed a toll of cost 7"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_10 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:10}); + + deferredResult.addMethod(toll_10, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 10), "Payed a toll of cost 10"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + +/* + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_16 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:16}); + + deferredResult.addMethod(toll_16, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 16), "Payed a toll of cost 16"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); +*/ + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +runTests = function() { + try { + var deferredTests; + var aTestName; + + deferredTests = new Clipperz.Async.Deferred("Clipperz.PM.Toll.test", {trace:false}); + + aTestName = window.location.href.match(/#.*/); + if (aTestName && (aTestName != '#')) { + aTestName = aTestName[0].slice(1); + if (aTestName in tests) { + //Clipperz.log("single test execution, via fragment identifier", aTestName); + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } else { + deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); + } + } else { + for (aTestName in tests) { + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } + deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); + } + deferredTests.addBoth(SimpleTest.finish); + deferredTests.callback(); + + SimpleTest.waitForExplicitFinish(); + } catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); + } +}(); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html new file mode 100644 index 0000000..6fbdcd6 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html @@ -0,0 +1,64 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.UI.Web.MainController - test</title> + + <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script> + + <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> + <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script> + +</head> +<body> +<pre id="test"> + <script type="text/javascript" src="MainController.test.js"></script> +</pre> + +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js new file mode 100644 index 0000000..3953558 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js @@ -0,0 +1,90 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) { + return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [ + function () { + var mainController; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization') + }]); + }, + + //------------------------------------------------------------------------- + + 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) { + var deferredResult; + var mainController; + var delegateFunction; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + delegateFunction = function () { return "clipperz";}; + + MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction)); + + return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[ + MochiKit.Base.method(mainController, 'getPassphrase'), + function (aResult) { + SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getPassphraseWithSetDelegate_test': function (someTestArgs) { + var deferredResult; + var mainController; + var delegateFunction; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + delegateFunction = function () {return "clipperz";}; + + return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[ + MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction), + MochiKit.Base.method(mainController, 'getPassphrase'), + function (aResult) { + SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html new file mode 100644 index 0000000..f3283b6 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html @@ -0,0 +1,46 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.UI.Web.Controllers.* - tests</title> + + <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( +// +// This is still a complete mess. +// + 'MainController.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html new file mode 100644 index 0000000..9afa73d --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html @@ -0,0 +1,45 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.UI.Web* - tests</title> + + <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( +// +// This is still a complete mess. +// +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html new file mode 100644 index 0000000..867362b --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html @@ -0,0 +1,45 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.UI.* - tests</title> + + <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( +// +// This is still a complete mess. +// +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/index.html b/frontend/gamma/tests/tests/Clipperz/PM/index.html new file mode 100644 index 0000000..acc45f7 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html @@ -0,0 +1,56 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.PM.* - tests</title> + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( +// +// This is still a complete mess. +// +// 'BookmarkletProcessor.html', + 'Connection.html', + 'Crypto.html', +// 'Crypto_other_implementation_comparison.html', + 'Crypto_performanceEvaluation.html', +// 'CryptoPerformance_ByteArrayArray.html', +// 'CryptoPerformance_ByteArrayHex.html', +// 'CryptoPerformance_ByteArrayString.html', + 'Date.html', + 'Proxy.html', + 'Toll.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html new file mode 100644 index 0000000..7fe9a84 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html @@ -0,0 +1,210 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../js/JSLog/jslog.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> +<pre id="test"> +<script type="text/javascript"> +try { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new MochiKit.Async.Deferred(); + + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); + deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + + + deferredResult.addBoth(SimpleTest.finish); + deferredResult.callback(); + +/* + var set; + var object1; + var object2; + var object3; + + set = new Clipperz.Set(); + + object1 = new Object(); + object2 = new Object(); + object3 = new Object(); + + object1.label = "object 1"; + object2.label = "object 2"; + object3.label = "object 3"; + + is(set.size(), 0, "A new set should be empty"); + + set.add(object1); + is(set.size(), 1); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object1); + is(set.size(), 1, "Adding the same object twice does not change the set content"); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object2); + is(set.size(), 2); + is(set.contains(object1), true); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Size check after removing an object"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Removing twice the same object does not change the set content"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.empty(); + is(set.size(), 0); + + { + var items; + var populatedSet; + + items = ["item1", "item2", "item3"]; + + populatedSet = new Clipperz.Set({'items': items}); + is(populatedSet.size(), 3); + is(populatedSet.contains("item1"), true); + is(populatedSet.contains("item4"), false); + + items.splice(0, items.length); + is(populatedSet.size(), 3); + } + + { + var items; + var deletedItems; + + items = ["item1", "item2", "item3"]; + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1"]; + set.remove(deletedItems); + is(set.size(), 2, "here I am"); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item2"]; + set.remove(deletedItems); + is(set.size(), 1); + is(set.contains("item1"), false); + is(set.contains("item2"), false); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item4"]; + set.remove(deletedItems); + is(set.size(), 2); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + } + + { + var items; + var poppedItem; + + items = ["item1", "item2", "item3"]; + set = new Clipperz.Set({'items': items}); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 1"); + is(set.size(), 2, "test popAnItem - 2"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 3"); + is(set.size(), 1, "test popAnItem - 4"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 5"); + is(set.size(), 0, "test popAnItem - 6"); + + poppedItem = set.popAnItem(); + ok(poppedItem == null, "test popAnItem - 7"); + } +*/ + + SimpleTest.waitForExplicitFinish(); + +} catch (err) { + + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} + +</script> +</pre> +</body> +</html> diff --git a/frontend/gamma/tests/tests/Clipperz/Set.html b/frontend/gamma/tests/tests/Clipperz/Set.html new file mode 100644 index 0000000..e5814bc --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Set.html @@ -0,0 +1,54 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.Set - test</title> + + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> + + <script type='text/javascript' src='../../../js/JSON/json2.js'></script> + + <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> + + <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> +</head> +<body> + +<pre id="test"> +<script type="text/javascript" src="Set.test.js"></script> +</pre> +</body> +</html> + diff --git a/frontend/gamma/tests/tests/Clipperz/Set.test.js b/frontend/gamma/tests/tests/Clipperz/Set.test.js new file mode 100644 index 0000000..8122b07 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Set.test.js @@ -0,0 +1,165 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'set_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs); + deferredResult.addCallback(function () { + var set; + var object1; + var object2; + var object3; + + set = new Clipperz.Set(); + + object1 = new Object(); + object2 = new Object(); + object3 = new Object(); + + object1.label = "object 1"; + object2.label = "object 2"; + object3.label = "object 3"; + + is(set.size(), 0, "A new set should be empty"); + + set.add(object1); + is(set.size(), 1); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object1); + is(set.size(), 1, "Adding the same object twice does not change the set content"); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object2); + is(set.size(), 2); + is(set.contains(object1), true); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Size check after removing an object"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Removing twice the same object does not change the set content"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.empty(); + is(set.size(), 0); + + { + var items; + var populatedSet; + + items = ["item1", "item2", "item3"]; + + populatedSet = new Clipperz.Set({'items': items}); + is(populatedSet.size(), 3); + is(populatedSet.contains("item1"), true); + is(populatedSet.contains("item4"), false); + + items.splice(0, items.length); + is(populatedSet.size(), 3); + } + + { + var items; + var deletedItems; + + items = ["item1", "item2", "item3"]; + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1"]; + set.remove(deletedItems); + is(set.size(), 2, "here I am"); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item2"]; + set.remove(deletedItems); + is(set.size(), 1); + is(set.contains("item1"), false); + is(set.contains("item2"), false); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item4"]; + set.remove(deletedItems); + is(set.size(), 2); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + } + + { + var items; + var poppedItem; + + items = ["item1", "item2", "item3"]; + set = new Clipperz.Set({'items': items}); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 1"); + is(set.size(), 2, "test popAnItem - 2"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 3"); + is(set.size(), 1, "test popAnItem - 4"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 5"); + is(set.size(), 0, "test popAnItem - 6"); + + poppedItem = set.popAnItem(); + ok(poppedItem == null, "test popAnItem - 7"); + } + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.Set", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/index.html b/frontend/gamma/tests/tests/Clipperz/index.html new file mode 100644 index 0000000..b4c4992 --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index.html @@ -0,0 +1,49 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <title>Clipperz.* - tests</title> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( + 'Async.html', + 'Base.html', + 'ByteArray.html', + 'Date.html', + 'DOM.html', + 'KeePassExportProcessor.html', + 'RoboFormExportProcessor.html', + 'Set.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html new file mode 100644 index 0000000..6e3249c --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html @@ -0,0 +1,50 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( + 'Base.html', + 'ByteArray.html', + 'NotificationCenter.html', + 'Set.html', + 'Crypto/AES.html', + 'Crypto/BigInt.html', + 'Crypto/PRNG.html', + 'Crypto/SHA.html', + 'Crypto/ECC.html', + 'Crypto/SRP.html' +); +</script> +</body> +</html>
\ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/index_testECC.html b/frontend/gamma/tests/tests/Clipperz/index_testECC.html new file mode 100644 index 0000000..46572ab --- a/dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index_testECC.html @@ -0,0 +1,50 @@ +<!-- + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +--> + +<html> +<head> + <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> +</head> +<body> +<script> +TestRunner.runTests( +// 'Base.html', + 'ByteArray.html', +// 'Crypto/AES.html', + 'Crypto/BigInt.html', +// 'Crypto/PRNG.html', +// 'Crypto/SHA.html', +// 'Crypto/SRP.html', +// 'Crypto/ECC.html', + 'Crypto/ECC.BinaryField.FiniteField.html', + 'Crypto/ECC.BinaryField.Value.html' +); +</script> +</body> +</html>
\ No newline at end of file |