aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-05-11 17:28:34 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2015-05-11 17:28:34 +0200
commit20a6c5ce8a0484cc0ef8f4c5ca1405f60e646e1f (patch)
tree258667acf6ea0c995b47195492d453c7459b31ca
parent92ac2ded10548756922a4c22ebae0a19b8862426 (diff)
parent5c44f8400970de5943fd6c5e804dfa394f3deb01 (diff)
downloadopen-keychain-20a6c5ce8a0484cc0ef8f4c5ca1405f60e646e1f.tar.gz
open-keychain-20a6c5ce8a0484cc0ef8f4c5ca1405f60e646e1f.tar.bz2
open-keychain-20a6c5ce8a0484cc0ef8f4c5ca1405f60e646e1f.zip
Merge tag 'v3.2.1' into linked-identities
Version 3.2.1 Conflicts: OpenKeychain/build.gradle OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml OpenKeychain/src/main/res/values/strings.xml
-rw-r--r--.gitmodules3
-rw-r--r--Graphics/drawables/function.pngbin97519 -> 64253 bytes
-rw-r--r--Graphics/drawables/function.svg680
-rw-r--r--Graphics/screenshots/device-2015-05-06-140816.pngbin0 -> 125976 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-141500.pngbin0 -> 71827 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-141508.pngbin0 -> 117383 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-141517.pngbin0 -> 192906 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-141527.pngbin0 -> 64936 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-141552.pngbin0 -> 65007 bytes
-rw-r--r--Graphics/screenshots/device-2015-05-06-142026.pngbin0 -> 296680 bytes
-rw-r--r--OpenKeychain-Test/build.gradle3
-rw-r--r--OpenKeychain/build.gradle46
-rw-r--r--OpenKeychain/proguard-rules.pro27
-rw-r--r--OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/CreateKeyActivityTest.java194
-rw-r--r--OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java74
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml86
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/linked/resources/TwitterResource.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java30
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java39
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java48
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java75
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectAllowedKeysActivity.java115
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java140
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java83
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java)4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java)2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java16
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java77
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java33
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java126
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java53
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java49
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_select_allowed_keys.xml38
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml3
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml99
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_files_activity.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_files_fragment.xml149
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml8
-rw-r--r--OpenKeychain/src/main/res/layout/main_activity.xml17
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_changelog.md4
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_certification.md28
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_changelog.md182
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_start.md22
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_about.md10
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_certification.md18
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_about.md4
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md18
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/raw/help_changelog.md2
-rw-r--r--OpenKeychain/src/main/res/values-ru/strings.xml6
-rw-r--r--OpenKeychain/src/main/res/values-zh-rTW/strings.xml16
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml19
-rw-r--r--OpenKeychain/src/main/res/values/themes.xml7
-rw-r--r--README.md46
-rw-r--r--build.gradle2
m---------extern/openkeychain-api-lib0
m---------extern/openpgp-api-lib0
m---------extern/snackbar0
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin52141 -> 53323 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties1
-rw-r--r--settings.gradle5
104 files changed, 1597 insertions, 1338 deletions
diff --git a/.gitmodules b/.gitmodules
index db9342d20..9d4e0f9dd 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -22,6 +22,3 @@
path = extern/safeslinger-exchange
url = https://github.com/open-keychain/exchange-android
ignore = dirty
-[submodule "extern/snackbar"]
- path = extern/snackbar
- url = https://github.com/open-keychain/snackbar
diff --git a/Graphics/drawables/function.png b/Graphics/drawables/function.png
index 9b8983c48..2dd483bef 100644
--- a/Graphics/drawables/function.png
+++ b/Graphics/drawables/function.png
Binary files differ
diff --git a/Graphics/drawables/function.svg b/Graphics/drawables/function.svg
index 97bc936ba..d5eb4a2fb 100644
--- a/Graphics/drawables/function.svg
+++ b/Graphics/drawables/function.svg
@@ -16,12 +16,12 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:version="0.48.3.1 r9886"
+ inkscape:version="0.48.5 r10040"
sodipodi:version="0.32"
width="1024"
version="1.1"
sodipodi:docname="function.svg"
- inkscape:export-filename="/home/schuerm/Projekte/OpenKeychain/Resources/graphics/function.png">
+ inkscape:export-filename="/home/schuerm/Projekte/OpenKeychain/Graphics/drawables/function.png">
<defs
id="defs4">
<linearGradient
@@ -339,142 +339,6 @@
xlink:href="#linearGradient4263"
inkscape:collect="always" />
<linearGradient
- y2="91.103127"
- x2="-20.653816"
- y1="22.707912"
- x1="132.77945"
- gradientTransform="matrix(4.2214605,0,0,4.2214605,-26.211835,128.44564)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3643"
- xlink:href="#linearGradient3225-63-131"
- inkscape:collect="always" />
- <linearGradient
- y2="6.8746934"
- x2="34.981007"
- y1="89.296867"
- x1="34.981007"
- gradientTransform="matrix(3.8779407,0,0,3.8779407,16.777433,146.82857)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3639"
- xlink:href="#linearGradient3160-677-734"
- inkscape:collect="always" />
- <linearGradient
- y2="49.15625"
- x2="124.625"
- y1="49.15625"
- x1="63.498344"
- gradientTransform="matrix(4.2214605,0,0,4.2214605,-26.211835,128.44564)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3636"
- xlink:href="#linearGradient2890-912-711"
- inkscape:collect="always" />
- <linearGradient
- y2="63.796875"
- x2="127.31514"
- y1="63.796875"
- x1="64.15625"
- gradientTransform="matrix(4.2214605,0,0,4.2214605,-26.211835,128.44564)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3633"
- xlink:href="#linearGradient2890-724-115"
- inkscape:collect="always" />
- <linearGradient
- y2="64.642754"
- x2="94.478127"
- y1="67.146591"
- x1="94.478127"
- gradientTransform="matrix(4.2214605,0,0,4.2214605,-26.211835,128.44564)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3630"
- xlink:href="#linearGradient2917-764-482"
- inkscape:collect="always" />
- <linearGradient
- y2="50.607132"
- x2="94.15625"
- y1="58.84375"
- x1="94.15625"
- gradientTransform="matrix(4.2214605,0,0,4.2214605,-26.211835,128.44564)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3627"
- xlink:href="#linearGradient2930-979-212"
- inkscape:collect="always" />
- <linearGradient
- y2="85.991692"
- x2="27.73057"
- y1="35.675571"
- x1="34.760506"
- gradientTransform="matrix(3.5340916,0,0,3.5340916,19.715902,169.46364)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3624"
- xlink:href="#linearGradient3092-76-338"
- inkscape:collect="always" />
- <radialGradient
- r="63.893539"
- fy="44.293781"
- fx="98.227898"
- cy="44.293781"
- cx="98.227898"
- gradientTransform="matrix(3.6038982,0,5.1275102e-7,0.60616867,6.0482945,311.92061)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3621"
- xlink:href="#linearGradient3146-499-197"
- inkscape:collect="always" />
- <radialGradient
- r="63.893539"
- fy="44.293781"
- fx="98.227898"
- cy="44.293781"
- cx="98.227898"
- gradientTransform="matrix(3.6038982,0,5.1275102e-7,0.60616867,6.0482945,311.92061)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3618"
- xlink:href="#linearGradient3146-470-849"
- inkscape:collect="always" />
- <radialGradient
- r="63.893539"
- fy="3.6800315"
- fx="40.082912"
- cy="3.6800315"
- cx="40.082912"
- gradientTransform="matrix(3.2495166,0.62823028,-0.11505962,0.59514756,42.389829,253.51642)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3615"
- xlink:href="#linearGradient3146-197-371"
- inkscape:collect="always" />
- <radialGradient
- r="29.344931"
- fy="64.119919"
- fx="109.07122"
- cy="71.239235"
- cx="92.454208"
- gradientTransform="matrix(5.6635815,0,0,0.67404041,-148.31259,401.08137)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3612"
- xlink:href="#linearGradient3146-699-272"
- inkscape:collect="always" />
- <radialGradient
- r="30.94986"
- fy="62.475086"
- fx="96.094643"
- cy="62.475086"
- cx="96.094643"
- gradientTransform="matrix(3.8779407,0,0,0.01340682,16.777433,388.26567)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3609"
- xlink:href="#linearGradient3205-564-694"
- inkscape:collect="always" />
- <radialGradient
- r="31.649858"
- fy="66.806999"
- fx="96.350143"
- cy="66.806999"
- cx="96.350143"
- gradientTransform="matrix(3.8779407,0,0,0.03426138,16.232078,404.54243)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient3606"
- xlink:href="#linearGradient3146-26-348"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3146-26-348">
<stop
id="stop11130"
@@ -796,29 +660,6 @@
xlink:href="#linearGradient3160-677-734"
inkscape:collect="always" />
<linearGradient
- id="linearGradient3189-338-471"
- inkscape:collect="always">
- <stop
- id="stop11032"
- offset="0"
- style="stop-color:#bababa;stop-opacity:1;" />
- <stop
- id="stop11034"
- offset="1"
- style="stop-color:#bababa;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- r="29"
- fy="89.5"
- fx="39"
- cy="89.5"
- cx="39"
- gradientTransform="matrix(1,0,0,0.534483,0,41.66379)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9409-380-91"
- xlink:href="#linearGradient3189-338-471"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3225-63-131">
<stop
id="stop11026"
@@ -877,16 +718,6 @@
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="17.5625"
- fy="58.75"
- fx="10.25"
- cy="58.75"
- cx="10.25"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9403-685-582"
- xlink:href="#linearGradient3529-86-282"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3541-845-38">
<stop
@@ -903,15 +734,6 @@
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
- y2="41.896976"
- x2="47.853844"
- y1="72.396973"
- x1="45.155617"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9401-82-291"
- xlink:href="#linearGradient3541-845-38"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3146-187-642">
<stop
id="stop10994"
@@ -930,40 +752,6 @@
offset="1"
style="stop-color:#bababa;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="31.649858"
- fy="66.806999"
- fx="96.350143"
- cy="66.806999"
- cx="96.350143"
- gradientTransform="matrix(0.965926,-0.258819,0.00228665,0.0085339,3.472771,75.68491)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9399-429-605"
- xlink:href="#linearGradient3146-187-642"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient3205-337-363"
- inkscape:collect="always">
- <stop
- id="stop10988"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop10990"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- r="30.94986"
- fy="62.475086"
- fx="96.094643"
- cy="62.475086"
- cx="96.094643"
- gradientTransform="matrix(0.965926,-0.258819,8.947905e-4,0.0033394,2.522271,71.59426)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9397-309-349"
- xlink:href="#linearGradient3205-337-363"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3146-503-96">
<stop
@@ -983,17 +771,6 @@
offset="1"
style="stop-color:#bababa;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="29.344931"
- fy="64.119919"
- fx="109.07122"
- cy="71.239235"
- cx="92.454208"
- gradientTransform="matrix(1.410697,-0.377995,0.04498637,0.167891,-37.74338,85.8047)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9395-67-109"
- xlink:href="#linearGradient3146-503-96"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3146-267-346">
<stop
@@ -1013,17 +790,6 @@
offset="1"
style="stop-color:#bababa;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="63.893539"
- fy="3.6800315"
- fx="40.082912"
- cy="3.6800315"
- cx="40.082912"
- gradientTransform="matrix(0.851326,-0.06039621,0.01106166,0.15592,-0.091478,36.32122)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9393-641-971"
- xlink:href="#linearGradient3146-267-346"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3146-507-607">
<stop
@@ -1043,17 +809,6 @@
offset="1"
style="stop-color:#bababa;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="63.893539"
- fy="44.293781"
- fx="98.227898"
- cy="44.293781"
- cx="98.227898"
- gradientTransform="matrix(0.897667,-0.240529,0.04045665,0.150986,-5.245533,53.29415)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9391-502-67"
- xlink:href="#linearGradient3146-507-607"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3146-885-515">
<stop
@@ -1073,17 +828,6 @@
offset="1"
style="stop-color:#bababa;stop-opacity:0;" />
</linearGradient>
- <radialGradient
- r="63.893539"
- fy="44.293781"
- fx="98.227898"
- cy="44.293781"
- cx="98.227898"
- gradientTransform="matrix(0.897667,-0.240529,0.04045665,0.150986,-5.245533,53.29415)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9389-453-398"
- xlink:href="#linearGradient3146-885-515"
- inkscape:collect="always" />
<linearGradient
id="linearGradient3160-199-324">
<stop
@@ -1096,16 +840,6 @@
style="stop-color:#797979;stop-opacity:1;" />
</linearGradient>
<linearGradient
- y2="6.8746934"
- x2="34.981007"
- y1="89.296867"
- x1="34.981007"
- gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-13.59157,11.45659)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9387-409-257"
- xlink:href="#linearGradient3160-199-324"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3160-812-595">
<stop
id="stop10936"
@@ -1160,28 +894,6 @@
xlink:href="#linearGradient3134-744-219"
inkscape:collect="always" />
<linearGradient
- id="linearGradient3092-216-126"
- inkscape:collect="always">
- <stop
- id="stop10912"
- offset="0"
- style="stop-color:#bababa;stop-opacity:1;" />
- <stop
- id="stop10914"
- offset="1"
- style="stop-color:#bababa;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- y2="85.991692"
- x2="27.73057"
- y1="35.675571"
- x1="34.760506"
- gradientTransform="matrix(0.880279,-0.23587,0.23587,0.880279,-11.34895,16.89844)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9381-884-21"
- xlink:href="#linearGradient3092-216-126"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient2930-16-32">
<stop
id="stop10900"
@@ -1205,38 +917,6 @@
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
- y2="50.607132"
- x2="94.15625"
- y1="58.84375"
- x1="94.15625"
- gradientTransform="matrix(1.05149,-0.281746,0.281746,1.05149,-25.52633,9.74688)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9379-390-804"
- xlink:href="#linearGradient2930-16-32"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient2917-549-212"
- inkscape:collect="always">
- <stop
- id="stop10894"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop10896"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- y2="64.642754"
- x2="94.478127"
- y1="67.146591"
- x1="94.478127"
- gradientTransform="matrix(1.05149,-0.281746,0.281746,1.05149,-25.52633,9.74688)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9377-120-159"
- xlink:href="#linearGradient2917-549-212"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient2890-958-479">
<stop
id="stop10886"
@@ -1252,16 +932,6 @@
style="stop-color:#bababa;stop-opacity:1;" />
</linearGradient>
<linearGradient
- y2="63.796875"
- x2="127.31514"
- y1="63.796875"
- x1="64.15625"
- gradientTransform="matrix(1.05149,-0.281746,0.281746,1.05149,-25.52633,9.74688)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9375-440-939"
- xlink:href="#linearGradient2890-958-479"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient2890-40-207">
<stop
id="stop10878"
@@ -1277,39 +947,6 @@
style="stop-color:#bababa;stop-opacity:1;" />
</linearGradient>
<linearGradient
- y2="49.15625"
- x2="124.625"
- y1="49.15625"
- x1="63.498344"
- gradientTransform="matrix(1.05149,-0.281746,0.281746,1.05149,-25.52633,9.74688)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9373-355-87"
- xlink:href="#linearGradient2890-40-207"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient3189-669-875"
- inkscape:collect="always">
- <stop
- id="stop10872"
- offset="0"
- style="stop-color:#bababa;stop-opacity:1;" />
- <stop
- id="stop10874"
- offset="1"
- style="stop-color:#bababa;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- r="29"
- fy="89.5"
- fx="39"
- cy="89.5"
- cx="39"
- gradientTransform="matrix(1,0,0,0.534483,0,41.66379)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient9371-19-996"
- xlink:href="#linearGradient3189-669-875"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3225-256-509">
<stop
id="stop10866"
@@ -1321,16 +958,6 @@
style="stop-color:#7f7f7f;stop-opacity:1;" />
</linearGradient>
<linearGradient
- y2="91.103127"
- x2="-20.653816"
- y1="22.707912"
- x1="132.77945"
- gradientTransform="matrix(1.05149,-0.281746,0.281746,1.05149,-25.52633,9.74688)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient9369-160-178"
- xlink:href="#linearGradient3225-256-509"
- inkscape:collect="always" />
- <linearGradient
id="linearGradient3146-26">
<stop
id="stop9945"
@@ -3709,7 +3336,7 @@
borderopacity="1.0"
id="base"
inkscape:current-layer="layer1"
- inkscape:cx="94.604748"
+ inkscape:cx="-19.954423"
inkscape:cy="148.47211"
inkscape:document-units="px"
inkscape:guide-bbox="true"
@@ -3736,7 +3363,7 @@
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
- <dc:title />
+ <dc:title></dc:title>
<dc:date />
<dc:creator>
<cc:Agent>
@@ -3797,205 +3424,6 @@
style="fill:none;stroke:none"
id="rect2383"
height="193.63591" />
- <g
- transform="matrix(0.70341159,0,0,0.70341159,326.23974,460.30412)"
- id="layer1-0"
- inkscape:label="Layer 1">
- <g
- transform="translate(-1.3638622,6.7536828)"
- id="g4431">
- <g
- transform="matrix(3.8779408,0,0,3.8779408,15.807953,70.239303)"
- id="g3462">
- <path
- sodipodi:nodetypes="cssssscccccccccccccsssccsccccccccccccccscccsssc"
- id="path3398"
- d="M 24.181711,34.829499 C 8.3491555,39.071819 -1.0696913,55.385741 3.1726293,71.218296 7.4149504,87.05085 23.719868,96.4361 39.552423,92.19378 c 7.139562,-1.91304 12.970506,-6.2726 16.829626,-11.92921 0.02791,-0.04092 0.04609,-0.08679 0.0738,-0.127838 0.04438,-0.08645 0.103958,-0.168818 0.147605,-0.255654 0.982551,-1.954801 1.764428,-3.990666 2.361504,-6.10751 L 114.58176,58.871092 c 0.44818,-0.12009 0.88922,-0.274388 1.27459,-0.485595 1.2698,-0.347821 2.43319,-1.213112 3.18156,-2.509333 l 6.55941,-11.410429 c 1.42099,-2.461247 0.78707,-5.482553 -1.45585,-6.777501 l -8.42774,-4.837355 c -0.19377,0.335622 -0.48546,0.598313 -0.89111,0.707007 l -1.27699,0.342169 -3.66445,-2.115667 c -0.72741,-0.419968 -1.66357,-0.169123 -2.08354,0.558283 l -1.50723,2.709017 -4.04793,-2.337077 c -0.20325,-0.117339 -0.44281,-0.165733 -0.66134,-0.182974 -0.0746,-0.0103 -0.14303,-0.01426 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10071,0.0061 -0.17642,0.01125 -0.27784,0.03843 l -3.831004,1.026515 c -0.05689,0.01525 -0.10553,0.05759 -0.159019,0.07863 -0.431007,0.07151 -0.831501,0.308563 -1.068135,0.718423 l -2.844687,4.976346 -6.922696,1.854931 -4.985351,-2.878294 c -0.727392,-0.41996 -1.663564,-0.169113 -2.083529,0.55828 L 77.473785,41.764576 73.6389,39.550505 c -0.727393,-0.419959 -1.663575,-0.169111 -2.08353,0.55828 l -3.410506,5.956373 -3.427743,0.91846 c -0.811293,0.21739 -1.62384,-0.28014 -1.841227,-1.091439 L 62.245557,43.539808 C 61.89324,42.224935 60.867705,42.000045 59.920026,42.253975 L 53.4342,43.991847 c -1.020929,-1.373074 -2.138582,-2.665496 -3.339338,-3.859613 -0.0411,-0.04087 -0.09554,-0.06675 -0.136832,-0.107408 -7.075365,-5.443729 -16.493832,-7.682563 -25.776319,-5.195327 z m -5.308547,10.715083 c 4.491338,-1.203447 9.099126,1.428453 10.302575,5.919788 1.20345,4.491335 -1.453052,9.141735 -5.944389,10.345185 -4.491335,1.203446 -9.117134,-1.495664 -10.320584,-5.986999 -1.203448,-4.491332 1.471063,-9.074525 5.962398,-10.277974 z"
- style="fill:url(#linearGradient9369-160-178);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(0.728608,-0.19523,0.19523,0.728608,-7.441788,31.19368)"
- d="m 68,65.25 c 0,16.016258 -12.983742,29 -29,29 -16.016258,0 -29,-12.983742 -29,-29 0,-16.016258 12.983742,-29 29,-29 16.016258,0 29,12.983742 29,29 z"
- sodipodi:ry="29"
- sodipodi:rx="29"
- sodipodi:cy="65.25"
- sodipodi:cx="39"
- id="path3400"
- style="opacity:0.41393445;fill:url(#radialGradient9371-19-996);fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc" />
- <path
- style="fill:url(#linearGradient9373-355-87);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 55.322941,43.481722 c 0.0061,0.100715 0.01921,0.20312 0.04638,0.304536 l 2.25397,8.411927 c 0.217391,0.811316 1.03069,1.308651 1.842005,1.091259 L 122.09473,36.507937 115.729,32.860453 c -0.19377,0.335622 -0.49854,0.59142 -0.90418,0.700111 l -1.28151,0.343381 -3.6664,-2.1168 c -0.7274,-0.419969 -1.65016,-0.172716 -2.07011,0.554686 l -1.53069,2.699333 -4.04138,-2.333288 c -0.20324,-0.117342 -0.42813,-0.16167 -0.64666,-0.178911 -0.0746,-0.0103 -0.13814,-0.01396 -0.21474,-0.01289 -0.0239,0.0017 -0.042,0.01482 -0.0657,0.01762 -0.10071,0.0061 -0.2031,0.0192 -0.30453,0.04638 l -3.811645,1.021328 c -0.0569,0.01525 -0.10201,0.05585 -0.155499,0.07689 -0.431007,0.07151 -0.840633,0.30141 -1.077267,0.711271 l -2.853687,4.990835 -6.900411,1.84896 -4.999639,-2.886543 c -0.727393,-0.419961 -1.650158,-0.172704 -2.070123,0.554688 L 77.475028,41.77228 73.64197,39.559265 c -0.72739,-0.41996 -1.650167,-0.172704 -2.070122,0.554687 l -3.439798,5.957903 -3.417345,0.915675 c -0.811297,0.217388 -1.624619,-0.279958 -1.842006,-1.091258 L 62.23877,43.530417 c -0.352319,-1.314873 -1.367875,-1.535265 -2.315555,-1.281335 l -4.600274,1.23264 z"
- id="path3402"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path3404"
- d="m 64.294339,55.270805 c -0.811315,0.217392 -4.962468,1.332335 -4.481761,3.126357 l 0.159724,0.596098 c 0.450205,1.680187 4.579365,0.822187 5.39068,0.604796 L 125.99908,43.350662 c 0.49401,-1.574706 0.22433,-3.219095 -0.66053,-4.436605 L 64.294339,55.270805 z"
- style="fill:url(#linearGradient9375-440-939);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient9377-120-159);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 64.857832,57.373787 c -0.811316,0.217391 -5.342172,-0.08474 -4.954414,1.362394 l 0.06888,0.257079 c 0.444491,1.658864 4.579365,0.822187 5.39068,0.604796 L 126.10423,43.322487 c 0.49401,-1.574707 0.22433,-3.219095 -0.66052,-4.436605 L 64.857832,57.373787 z"
- id="path3406"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path3408"
- d="m 55.322941,43.481722 c 0.0061,0.100715 0.01921,0.20312 0.04638,0.304536 l 2.25397,8.411927 c 0.217391,0.811316 1.03069,1.308651 1.842005,1.091259 L 122.09473,36.507937 115.729,32.860453 c -0.19377,0.335622 -0.49854,0.59142 -0.90418,0.700111 l -1.28151,0.343381 -3.6664,-2.1168 c -0.7274,-0.419969 -1.65016,-0.172716 -2.07011,0.554686 l -1.53069,2.699333 -4.04138,-2.333288 c -0.20324,-0.117342 -0.42813,-0.16167 -0.64666,-0.178911 -0.0746,-0.0103 -0.13814,-0.01396 -0.21474,-0.01289 -0.0239,0.0017 -0.042,0.01482 -0.0657,0.01762 -0.10071,0.0061 -0.2031,0.0192 -0.30453,0.04638 l -3.811645,1.021328 c -0.0569,0.01525 -0.10201,0.05585 -0.155499,0.07689 -0.431007,0.07151 -0.840633,0.30141 -1.077267,0.711271 l -2.853687,4.990835 -6.900411,1.84896 -4.999639,-2.886543 c -0.727393,-0.419961 -1.650158,-0.172704 -2.070123,0.554688 L 77.475028,41.77228 73.64197,39.559265 c -0.72739,-0.41996 -1.650167,-0.172704 -2.070122,0.554687 l -3.439798,5.957903 -3.417345,0.915675 c -0.811297,0.217388 -1.624619,-0.279958 -1.842006,-1.091258 L 62.23877,43.530417 c -0.352319,-1.314873 -1.367875,-1.535265 -2.315555,-1.281335 l -4.600274,1.23264 z"
- style="fill:url(#linearGradient9379-390-804);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path3410"
- d="m 24.453487,40.951785 c -0.278503,0.0893 -0.539938,0.227781 -0.81312,0.325928 l 0.1981,0.739317 1.195316,-1.184717 -0.009,-0.03361 c -0.188236,0.05559 -0.385377,0.09346 -0.571291,0.153077 z m 1.814688,-0.486244 -0.539453,0.540744 0.522263,1.949109 1.428138,-1.391176 -0.351176,-1.310607 c -0.353713,0.06954 -0.70601,0.126491 -1.059772,0.21193 z m 1.682677,-0.306801 0.234117,0.873739 1.078904,-1.081489 c -0.444796,0.05158 -0.866983,0.13148 -1.313021,0.20775 z m -4.897371,1.348266 c -0.284754,0.110431 -0.566288,0.210126 -0.846725,0.334933 0.333398,0.03079 0.654403,0.111242 0.981793,0.169147 l -0.135068,-0.50408 z m 7.196364,-1.640116 -0.17462,0.154843 0.432217,1.613055 1.419136,-1.42478 -0.108054,-0.403263 c -0.521384,0.0068 -1.043367,0.01983 -1.568679,0.06014 z m -5.026967,1.671134 -0.772277,0.747203 C 24.813169,42.390423 25.17,42.509101 25.520027,42.647 l -0.297149,-1.108976 z m 4.346501,-0.984552 -1.204319,1.151112 0.441221,1.646661 1.186311,-1.218322 -0.423213,-1.579451 z m 3.649798,-0.76185 -0.597659,0.592358 0.531267,1.982714 1.161709,-1.175713 -0.36018,-1.344213 c -0.249836,-0.01881 -0.48382,-0.04396 -0.735137,-0.05515 z m 1.394059,0.0947 0.207104,0.772923 0.655864,-0.643973 c -0.283232,-0.03902 -0.577362,-0.09978 -0.862968,-0.12895 z m -2.497563,1.029401 -1.419136,1.42478 0.522262,1.949109 1.419136,-1.424781 -0.522262,-1.949108 z m -4.256459,1.320605 -1.020695,1.029874 c 0.434477,0.233862 0.850384,0.49579 1.253693,0.780634 l 0.199219,-0.197453 -0.432217,-1.613055 z m 8.403743,-2.107704 -1.253522,1.236332 0.432217,1.613055 1.419135,-1.42478 -0.369186,-1.377818 c -0.08434,-0.01531 -0.144054,-0.03236 -0.228644,-0.04679 z m 0.914582,0.187155 0.198099,0.739317 0.564051,-0.583354 c -0.249905,-0.06107 -0.509667,-0.102698 -0.76215,-0.155963 z m -6.995853,2.522859 -1.195314,1.184717 0.234117,0.873738 c 0.239867,0.215264 0.463772,0.445851 0.686583,0.680464 l 0.805881,-0.756206 -0.531267,-1.982713 z m 8.48655,-2.201928 -1.112508,1.090493 0.522262,1.949108 1.204319,-1.151112 -0.495249,-1.848292 c -0.04572,-0.01294 -0.07301,-0.02753 -0.118824,-0.0402 z m -4.173651,1.22638 -1.16171,1.175713 0.432217,1.613056 1.16171,-1.175713 -0.432217,-1.613056 z m 5.005426,-0.945001 0.288145,1.075371 0.73867,-0.738198 c -0.331899,-0.121338 -0.688782,-0.230193 -1.026815,-0.337173 z m -2.450129,1.340854 -1.42814,1.391175 0.531267,1.982713 1.419135,-1.42478 -0.522262,-1.949108 z m -4.222852,1.3116 -1.428141,1.391174 0.441222,1.646662 1.410131,-1.458387 -0.423212,-1.579449 z m 8.31193,-2.047085 -1.170714,1.142107 0.441222,1.646661 1.41013,-1.458385 -0.324163,-1.209792 c -0.118639,-0.04937 -0.236932,-0.07308 -0.356475,-0.120591 z m 1.096438,0.46259 0.09905,0.369659 0.22382,-0.240063 c -0.11157,-0.05308 -0.210394,-0.07821 -0.32287,-0.129596 z m -7.119502,2.195809 -1.161709,1.175713 0.522262,1.949108 1.16171,-1.175712 -0.522263,-1.949109 z m -4.222853,1.311601 -0.573056,0.549749 c 0.314089,0.36607 0.584652,0.770104 0.855256,1.175539 l 0.141013,-0.145838 -0.423213,-1.57945 z m 8.569356,-2.296152 -1.195314,1.184717 0.432217,1.613054 1.18631,-1.218321 -0.423213,-1.57945 z m 3.683403,-0.770856 -0.622259,0.634968 0.522262,1.949108 1.18631,-1.218322 -0.252126,-0.940949 C 43.714301,42.702794 43.417501,42.564812 43.145802,42.42645 z m -9.706465,3.429255 -1.419136,1.42478 0.522262,1.949108 1.42814,-1.391174 -0.531266,-1.982714 z m 8.569356,-2.296152 -1.419135,1.42478 0.522262,1.949108 1.428139,-1.391174 -0.531266,-1.982714 z m -4.256459,1.320605 -1.419135,1.424779 0.432217,1.613057 1.419135,-1.424782 -0.432217,-1.613054 z m 7.524058,-1.223668 -0.340231,0.34329 0.432217,1.613057 1.137109,-1.133103 C 46.107003,44.18387 45.693405,43.926727 45.276292,43.656487 z m -5.192581,1.859582 -1.204319,1.151112 0.531267,1.982714 1.195314,-1.184717 -0.522262,-1.949109 z m 4.337499,-1.018157 -1.195315,1.184719 0.441221,1.646659 1.186311,-1.218322 -0.432217,-1.613056 z m -8.593956,2.338763 -1.170714,1.142108 0.441221,1.646659 1.152705,-1.209318 -0.423212,-1.579449 z m 11.140248,-1.976516 -1.41013,1.458385 0.522262,1.949109 1.41013,-1.458386 -0.522262,-1.949108 z m -8.593956,2.338763 -1.419135,1.424779 0.522262,1.949109 1.419135,-1.42478 -0.522262,-1.949108 z m -4.222852,1.3116 -1.419136,1.424779 0.432217,1.613056 1.419135,-1.424781 -0.432216,-1.613054 z m 8.569355,-2.296152 -1.419134,1.424779 0.432217,1.613056 1.419134,-1.424781 -0.432217,-1.613054 z m 5.059454,-0.74337 0.234117,0.873738 0.331227,-0.376895 C 48.159743,45.798299 47.970076,45.634344 47.779503,45.471 z m -11.339943,3.650835 -1.161709,1.175714 0.522262,1.949108 1.170714,-1.142108 -0.531267,-1.982714 z m 8.602962,-2.305156 -1.195315,1.184718 0.522262,1.949108 1.195315,-1.184717 -0.522262,-1.949109 z M 8.7331833,56.617773 c -0.080856,0.257998 -0.185146,0.528328 -0.2567787,0.789166 L 8.8412374,57.021037 8.7331833,56.617773 z m 32.0528797,-8.480489 -1.195313,1.184718 0.432216,1.613055 1.195314,-1.184717 -0.432217,-1.613056 z m 8.005304,-1.712797 -0.597656,0.592359 0.432217,1.613054 1.195314,-1.184717 c -0.32357,-0.356241 -0.684705,-0.686305 -1.029875,-1.020696 z M 9.0303324,57.726749 8.1998504,58.525565 c -0.1251137,0.570603 -0.2112478,1.15432 -0.2915036,1.73494 l 0.2251128,0.840132 1.419135,-1.424779 -0.5222622,-1.949109 z m 25.7416726,-6.89746 -1.42814,1.391175 0.531267,1.982713 1.419135,-1.42478 -0.522262,-1.949108 z m 8.569356,-2.296152 -1.428139,1.391174 0.531266,1.982714 1.419135,-1.42478 -0.522262,-1.949108 z m 4.337498,-1.018157 -1.419134,1.42478 0.441221,1.64666 1.41013,-1.458386 -0.432217,-1.613054 z m -8.593956,2.338762 -1.42814,1.391174 0.441222,1.64666 1.41013,-1.458385 -0.423212,-1.579449 z m -29.1435218,8.853506 0.1170588,0.43687 0.05821,-0.05161 C 10.05758,58.966431 9.9963541,58.836017 9.9413812,58.707248 z m 40.0599508,-10.589959 -1.186309,1.218323 0.522261,1.949107 1.18631,-1.218321 -0.522262,-1.949109 z m -8.593957,2.338762 -1.195314,1.184718 0.522262,1.949107 1.195314,-1.184716 -0.522262,-1.949109 z m 4.337499,-1.018158 -1.18631,1.218323 0.432217,1.613056 1.18631,-1.218323 -0.432217,-1.613056 z m -8.593956,2.338763 -1.16171,1.175712 0.432217,1.613056 1.152705,-1.209318 -0.423212,-1.57945 z m 13.635401,-3.149341 0.261131,0.974553 0.248421,-0.282672 C 51.124502,49.08394 50.966383,48.85514 50.786319,48.627315 z m -40.364165,11.067671 -0.174619,0.154843 0.432217,1.613056 0.505846,-0.531741 c -0.279386,-0.394934 -0.53067,-0.804288 -0.763444,-1.236158 z m 29.275056,-7.556083 -1.419135,1.42478 0.522262,1.949108 1.428139,-1.391174 -0.531266,-1.982714 z m 8.602961,-2.305157 -1.41013,1.458385 0.513257,1.915503 1.419135,-1.424779 -0.522262,-1.949109 z M 9.7326848,60.347964 8.3135497,61.772743 8.7457669,63.385799 10.173906,61.994625 9.7326848,60.347964 z m 25.7416732,-6.897461 -1.419136,1.42478 0.432217,1.613056 1.419135,-1.424781 -0.432216,-1.613055 z m 8.569355,-2.296152 -1.419134,1.424779 0.432217,1.613057 1.428139,-1.391175 -0.441222,-1.646661 z m -10.827504,3.009276 c -0.0046,0.245127 -0.0022,0.483366 -0.02154,0.726133 l 0.165613,-0.188448 -0.144072,-0.537685 z m 18.458971,-4.369778 -0.44764,0.480125 0.432217,1.613056 0.787871,-0.823417 C 52.194092,50.635328 51.955417,50.201646 51.67518,49.793849 z m -13.902951,4.301574 -1.161709,1.175712 0.522262,1.949108 1.161709,-1.175712 -0.522262,-1.949108 z m 8.602962,-2.305156 -1.195316,1.184716 0.522262,1.949108 1.186311,-1.218322 -0.513257,-1.915502 z m 4.337498,-1.018158 -1.195314,1.184718 0.441221,1.646659 1.18631,-1.218322 -0.432217,-1.613055 z m -42.9049849,11.532375 -0.125417,0.06962 c -0.027907,0.674826 0.00787,1.360371 0.042783,2.041566 L 8.2399208,63.917539 7.8077041,62.304484 z m 25.7416719,-6.89746 -0.456644,0.44652 c -0.10047,0.621903 -0.256883,1.220038 -0.450526,1.813566 l 0.144072,0.537685 1.18631,-1.218322 -0.423212,-1.579449 z m 8.569356,-2.296152 -1.204318,1.151112 0.441221,1.646659 1.195314,-1.184717 -0.432217,-1.613054 z m -30.54482,8.328532 -0.705065,0.729192 0.522261,1.949108 1.16171,-1.175712 -0.153077,-0.57129 c -0.284683,-0.293438 -0.570662,-0.608229 -0.825829,-0.931298 z m -1.219916,1.227326 -1.4191343,1.424781 0.5222619,1.949108 1.4191354,-1.42478 -0.522263,-1.949109 z m 25.741673,-6.89746 -1.419135,1.42478 0.522262,1.949108 1.419135,-1.424779 -0.522262,-1.949109 z m 8.569356,-2.296152 -1.41013,1.458386 0.513257,1.915502 1.419135,-1.424779 -0.522262,-1.949109 z m 4.337498,-1.018157 -1.41013,1.458385 0.432217,1.613056 1.419135,-1.42478 -0.441222,-1.646661 z m -8.593956,2.338762 -1.419135,1.424779 0.432217,1.613057 1.419134,-1.424781 -0.432216,-1.613055 z m 12.378174,-3.136631 -0.928885,0.969255 0.513258,1.915502 1.25352,-1.23633 c -0.249728,-0.558508 -0.545759,-1.118305 -0.837893,-1.648427 z m -39.520973,11.526083 0.414208,1.545844 0.714071,-0.695587 c -0.390445,-0.258687 -0.769263,-0.547599 -1.128279,-0.850257 z m -4.8457568,1.40647 -0.646859,0.677579 c 0.064396,0.720367 0.1518557,1.433511 0.2894373,2.155565 l 0.8886882,-0.85043 -0.5312665,-1.982714 z m 25.7416718,-6.89746 -1.195315,1.184718 0.522262,1.949107 1.20432,-1.151112 -0.531267,-1.982713 z m 8.569356,-2.296152 -1.186309,1.218322 0.513257,1.915503 1.204319,-1.151112 -0.531267,-1.982713 z m 8.602962,-2.305157 -1.18631,1.218322 0.513258,1.915504 1.204318,-1.151112 -0.531266,-1.982714 z m -38.601093,10.523222 -1.161709,1.175713 0.432217,1.613055 1.170714,-1.142108 -0.441222,-1.64666 z m 25.741674,-6.89746 -1.16171,1.175713 0.432217,1.613054 1.170714,-1.142107 -0.441221,-1.64666 z m 8.602961,-2.305157 -1.195315,1.184718 0.432217,1.613054 1.195315,-1.184717 -0.432217,-1.613055 z m -14.824125,4.224238 c -0.01593,0.03765 -0.02389,0.08134 -0.0402,0.118826 l 0.05821,-0.05161 -0.01801,-0.06721 z m 0.207104,0.772923 -1.25352,1.236332 c -0.04927,0.07437 -0.105705,0.14876 -0.15661,0.222053 l 0.513258,1.915503 1.419135,-1.424779 -0.522263,-1.949109 z m 8.569356,-2.296152 -1.419135,1.424779 0.522263,1.949109 1.419134,-1.424779 -0.522262,-1.949109 z m 8.602962,-2.305157 -1.419135,1.424779 0.522262,1.949109 1.419135,-1.424779 -0.522262,-1.949109 z m -38.567487,10.514217 -1.428139,1.391175 0.441221,1.64666 1.419135,-1.424779 -0.432217,-1.613056 z m 25.741673,-6.89746 -1.42814,1.391175 0.441221,1.64666 1.419136,-1.42478 -0.432217,-1.613055 z m 8.569356,-2.296152 -1.428139,1.391175 0.441221,1.64666 1.419135,-1.424779 -0.432217,-1.613056 z m 8.477545,-2.235534 -1.302723,1.321552 0.441221,1.64666 1.419135,-1.424779 -0.144072,-0.537686 c -0.122462,-0.344034 -0.2754,-0.671033 -0.413561,-1.005747 z m -38.939559,10.469843 -1.054302,1.038878 0.531266,1.982713 1.419136,-1.424779 -0.342171,-1.277002 c -0.189223,-0.09925 -0.370192,-0.210796 -0.553929,-0.31981 z m 1.302896,0.695413 0.09905,0.369659 0.257425,-0.249068 c -0.116016,-0.04678 -0.242034,-0.0703 -0.356475,-0.120591 z m -2.863044,0.875205 -1.161709,1.175713 0.522262,1.949109 1.161709,-1.175714 -0.522262,-1.949108 z m 25.741673,-6.89746 -1.152705,1.209317 0.513258,1.915504 1.161709,-1.175714 -0.522262,-1.949107 z m 8.602962,-2.305157 -1.186311,1.218322 0.513258,1.915504 1.195315,-1.184718 -0.522262,-1.949108 z m 4.337498,-1.018157 -1.186309,1.218323 0.441221,1.64666 1.186309,-1.218323 -0.441221,-1.64666 z M 9.1313681,67.244465 8.2180792,68.137505 c 0.06532,0.289689 0.1475965,0.550838 0.2251128,0.840133 0.068354,0.255102 0.1303727,0.522294 0.2071039,0.772922 L 9.5635848,68.85752 9.1313681,67.244465 z M 30.571561,61.499583 c -0.356828,0.448638 -0.75809,0.855854 -1.177307,1.251928 l 0.459231,1.713872 1.195315,-1.184719 -0.477239,-1.781081 z m 4.301479,-1.152578 -1.195315,1.184718 0.432217,1.613054 1.195315,-1.184717 -0.432217,-1.613055 z m 8.569356,-2.296152 -1.195314,1.184717 0.432217,1.613055 1.195314,-1.184717 -0.432217,-1.613055 z m -26.222918,7.386591 -0.714069,0.695587 0.432217,1.613054 1.195315,-1.184717 -0.252127,-0.940949 c -0.22098,-0.06106 -0.444699,-0.109715 -0.661336,-0.182975 z m -5.541818,2.169268 -1.419134,1.42478 0.522262,1.949109 1.428139,-1.391175 -0.531267,-1.982714 z m 25.741673,-6.897461 -1.410131,1.458386 0.513258,1.915504 1.42814,-1.391175 -0.531267,-1.982715 z m 17.172317,-4.601308 -1.410129,1.458385 0.513257,1.915504 1.428139,-1.391175 -0.531267,-1.982714 z m -36.015895,9.686448 0.07204,0.268842 0.19922,-0.197453 c -0.09261,-0.0175 -0.179227,-0.05176 -0.271256,-0.07139 z m 27.421939,-7.347686 -1.419135,1.42478 0.513258,1.915503 1.428139,-1.391174 -0.522262,-1.949109 z m -30.007136,8.18446 -1.419135,1.42478 0.432217,1.613056 1.42814,-1.391175 -0.441222,-1.646661 z m 17.172317,-4.601309 -1.419135,1.424781 0.432217,1.613055 1.428139,-1.391175 -0.441221,-1.646661 z m 8.569356,-2.296152 -1.419135,1.424781 0.432217,1.613055 1.428139,-1.391175 -0.441221,-1.646661 z m 8.602961,-2.305156 -1.419135,1.42478 0.441222,1.64666 1.419134,-1.424779 -0.441221,-1.646661 z m -21.455788,5.821097 c -0.362299,0.303527 -0.742129,0.584795 -1.141935,0.846252 l -0.340232,0.343291 0.522262,1.949109 1.42814,-1.391175 -0.468235,-1.747477 z m -9.312852,2.747497 -0.738671,0.738198 0.522263,1.949109 1.428139,-1.391175 -0.333167,-1.243397 c -0.285691,-0.01577 -0.596661,-0.01699 -0.878564,-0.05273 z m 1.528482,0.05868 0.189095,0.705712 0.738671,-0.738199 c -0.313681,0.0242 -0.616551,0.03276 -0.927766,0.03249 z m 4.810386,-1.000795 c -0.140151,0.06034 -0.266567,0.162508 -0.409855,0.217874 l 0.04502,0.168027 0.364833,-0.385901 z m -2.695018,0.830182 0.396199,1.478634 1.42814,-1.391175 -0.144072,-0.537685 c -0.218378,0.07192 -0.43826,0.153449 -0.663103,0.213696 -0.346732,0.09291 -0.670138,0.175199 -1.017164,0.23653 z m -13.4577222,3.678022 -0.8886882,0.85043 c 0.2083439,0.613006 0.4397248,1.210458 0.6968803,1.794265 L 10.274942,71.51234 9.7526798,69.563232 z m 8.5693562,-2.296152 -1.195315,1.184718 0.513257,1.915502 0.06721,-0.01801 1.13711,-1.133103 -0.522262,-1.949108 z m 8.569356,-2.296152 -1.16171,1.175713 0.513257,1.915502 0.06721,-0.01801 1.103503,-1.124099 -0.522261,-1.949108 z m 8.60296,-2.305156 -1.195315,1.184717 0.513257,1.915503 0.06721,-0.01801 1.137109,-1.133103 -0.522262,-1.949108 z m 17.172317,-4.601309 -1.195314,1.184718 0.522262,1.949107 1.195314,-1.184717 -0.522262,-1.949108 z m -8.593957,2.338762 -1.204318,1.151112 0.513257,1.915503 0.06721,-0.01801 1.137109,-1.133103 -0.513258,-1.915503 z m 4.328495,-1.051762 -1.195315,1.184717 0.450226,1.680266 1.18631,-1.218323 -0.441221,-1.64666 z m -34.33563,9.236222 -1.170714,1.142108 0.441222,1.646661 1.161709,-1.175714 -0.432217,-1.613055 z m 8.602961,-2.305156 -1.204319,1.151112 0.441221,1.646661 1.195315,-1.184719 -0.432217,-1.613054 z m 8.569357,-2.296153 -1.20432,1.151113 0.441221,1.646661 1.195316,-1.184719 -0.432217,-1.613055 z m 8.569355,-2.296151 -1.170714,1.142107 0.441222,1.646661 1.161709,-1.175714 -0.432217,-1.613054 z m -23.19538,7.259706 -1.419135,1.424781 0.162081,0.604895 c 0.100985,-0.05316 0.220969,-0.05921 0.336053,-0.09005 l 1.344213,-0.360181 -0.423212,-1.57945 z m 8.602961,-2.305156 -1.419135,1.42478 0.162081,0.604896 1.680267,-0.450226 -0.423213,-1.57945 z m 8.569355,-2.296152 -1.41013,1.458386 0.153077,0.57129 1.680266,-0.450226 -0.423213,-1.57945 z m 17.172318,-4.601309 -1.41013,1.458386 0.153076,0.57129 0.806528,-0.216108 c 0.342878,-0.09187 0.651309,-0.05658 0.954779,0.06833 l -0.504253,-1.881898 z m -8.593957,2.338763 -1.419135,1.42478 0.153077,0.57129 1.680266,-0.450226 -0.414208,-1.545844 z m -29.97353,8.175455 -1.419134,1.424781 0.432217,1.613055 1.419134,-1.424781 -0.432217,-1.613055 z m 8.569356,-2.296152 -1.419134,1.424781 0.117058,0.436868 1.680266,-0.450226 -0.37819,-1.411423 z m 8.569356,-2.296152 -1.419135,1.424781 0.117059,0.436868 1.680266,-0.450226 -0.37819,-1.411423 z m 8.602961,-2.305157 -1.419135,1.424782 0.117058,0.436868 1.680267,-0.450226 -0.37819,-1.411424 z m 8.569356,-2.296152 -1.419134,1.424782 0.117058,0.436867 1.680266,-0.450225 -0.37819,-1.411424 z m 8.544755,-2.253542 -1.360928,1.373167 0.441221,1.646659 1.152705,-1.209317 c -0.04622,-0.610934 -0.134328,-1.197792 -0.232998,-1.810509 z m -40.566917,12.058469 -1.161709,1.175713 0.522262,1.949109 0.68947,-0.652978 -0.153077,-0.57129 c -0.126204,-0.471001 7.12e-4,-0.930958 0.265136,-1.295657 l -0.162082,-0.604897 z m 8.602962,-2.305156 -0.398439,0.394905 0.470475,-0.126063 -0.07204,-0.268842 z m 8.569356,-2.296152 -0.364833,0.385901 0.436869,-0.117059 -0.07204,-0.268842 z m 17.172317,-4.601309 -0.364833,0.385901 0.436869,-0.117058 -0.07204,-0.268843 z m -8.593957,2.338762 -0.340233,0.343292 0.403264,-0.108055 -0.06303,-0.235237 z m -29.97353,8.175456 -0.622258,0.634969 c 0.217477,0.456 0.434455,0.894051 0.680637,1.330382 l 0.382842,-0.318691 -0.441221,-1.64666 z m 8.569356,-2.296152 -0.141013,0.145838 0.168026,-0.04502 -0.02701,-0.100815 z m 8.569356,-2.296152 -0.141013,0.145838 0.168026,-0.04502 -0.02701,-0.100815 z m 8.60296,-2.305157 -0.141013,0.145839 0.168027,-0.04502 -0.02701,-0.100816 z m 8.569356,-2.296152 -0.141012,0.145838 0.168026,-0.04502 -0.02701,-0.100816 z m 8.602961,-2.305156 -1.195313,1.184717 0.207103,0.772922 0.234118,0.873738 1.195314,-1.184717 -0.441222,-1.64666 z m -40.358692,11.89462 -1.428139,1.391175 0.531265,1.982709 1.419136,-1.424775 -0.522262,-1.949109 z m 42.515552,-11.103862 -1.020696,1.029875 0.52226,1.949102 0.456646,-0.446513 c 0.06462,-0.834666 0.07352,-1.686628 0.04179,-2.532464 z M 11.076344,74.503212 10.843519,74.70967 c 0.139763,0.231452 0.319261,0.441865 0.466942,0.66728 l -0.234117,-0.873738 z m 42.913989,-11.498768 -1.186309,1.218321 0.522261,1.949106 1.186309,-1.218322 -0.522261,-1.949105 z m -39.082336,11.012351 -0.680465,0.686583 0.432217,1.613057 0.680466,-0.686582 -0.432218,-1.613058 z m -1.195315,1.184719 -1.419136,1.424777 0.06303,0.235242 c 0.255635,0.328728 0.485738,0.636179 0.758618,0.949302 l 1.038707,-0.962659 -0.441222,-1.646662 z m 41.644872,-10.186223 -0.141013,0.145836 0.09005,0.336055 c 0.0241,-0.16474 0.03055,-0.31645 0.05097,-0.481891 z m -0.655864,0.643973 -1.195314,1.184718 0.441222,1.646662 0.987089,-1.020873 c 0.03721,-0.155386 0.09327,-0.310064 0.127183,-0.466296 l -0.36018,-1.344211 z m -39.172382,10.676294 -0.680466,0.686582 0.522263,1.949113 1.103504,-1.1241 C 16.102003,77.653875 15.80009,77.34613 15.682386,76.906856 l -0.153078,-0.571297 z m -1.195315,1.184719 -0.763272,0.780804 c 0.39765,0.431059 0.798073,0.82161 1.227328,1.219922 l 0.05821,-0.05161 -0.522263,-1.949113 z m 38.864634,-9.405244 c -0.200355,0.259912 -0.449818,0.444695 -0.792696,0.536568 l -0.806528,0.216109 0.414209,1.545848 1.410128,-1.458391 -0.225113,-0.840134 z m -35.943858,9.955294 0.405204,1.512244 1.419134,-1.424788 -0.144072,-0.537682 -1.344213,0.360181 c -0.115084,0.03084 -0.222019,0.08559 -0.336053,0.09005 z m 2.285162,-0.612307 0.05403,0.201637 0.282025,-0.291683 -0.336053,0.09005 z m 2.016319,-0.540272 0.450226,1.680267 1.419135,-1.424777 -0.189096,-0.705715 -1.680265,0.450225 z m 2.285161,-0.612307 0.09905,0.36966 0.539451,-0.540746 -0.638501,0.171086 z m 2.016319,-0.540271 0.405205,1.512244 1.419133,-1.424787 -0.144071,-0.537683 -1.680267,0.450226 z m 2.285162,-0.612307 0.05403,0.201637 0.282025,-0.291682 -0.336054,0.09004 z m 1.982714,-0.531267 0.450226,1.680267 1.419135,-1.424777 -0.189096,-0.705715 -1.680265,0.450225 z m 2.285161,-0.612307 0.09905,0.36966 0.539452,-0.540746 -0.638502,0.171086 z m 2.016319,-0.540271 0.414209,1.545849 1.419132,-1.424787 -0.153075,-0.571287 -1.680266,0.450225 z m 2.285161,-0.612307 0.06303,0.235242 0.340232,-0.343296 -0.403265,0.108054 z m 2.016319,-0.540271 0.450226,1.680267 1.419137,-1.424778 -0.189096,-0.705715 -1.680267,0.450226 z m 2.285162,-0.612307 0.09905,0.36966 0.53945,-0.540746 -0.6385,0.171086 z m 1.982714,-0.531267 0.414209,1.545849 1.419132,-1.424787 -0.153076,-0.571287 -1.680265,0.450225 z m 2.285162,-0.612307 0.06303,0.235242 0.340229,-0.343296 -0.403262,0.108054 z m 2.016319,-0.540271 0.45923,1.713871 1.419136,-1.424777 -0.1981,-0.73932 -1.680266,0.450226 z m 2.285161,-0.612307 0.09905,0.36966 0.539451,-0.540746 -0.638501,0.171086 z m -28.604717,7.772662 -1.195314,1.184719 0.513258,1.915508 1.204319,-1.151114 -0.522263,-1.949113 z m 8.569356,-2.296152 -1.161709,1.175714 0.513259,1.915509 1.170713,-1.14211 -0.522263,-1.949113 z m 8.60296,-2.305156 -1.195314,1.184719 0.513259,1.915508 1.204319,-1.151114 -0.522264,-1.949113 z m 8.569356,-2.296152 -1.186309,1.218323 0.513259,1.915508 1.195314,-1.184718 -0.522264,-1.949113 z m -30.007133,8.184467 -1.161709,1.175714 0.189093,0.705705 c 0.214273,0.178473 0.387276,0.35082 0.607956,0.52145 l 0.805882,-0.756207 -0.441222,-1.646662 z m 8.602961,-2.305157 -1.195314,1.184719 0.432214,1.613048 1.204322,-1.151105 -0.441222,-1.646662 z m 8.569357,-2.296152 -1.195316,1.184719 0.44122,1.646652 1.204322,-1.151104 -0.450226,-1.680267 z m 8.569355,-2.296152 -1.161709,1.175714 0.441219,1.646653 1.170716,-1.1421 -0.450226,-1.680267 z m 8.602961,-2.305156 -1.18631,1.218323 0.432215,1.613048 1.195317,-1.184709 -0.441222,-1.646662 z m 3.517786,-0.582416 -0.447639,0.480128 0.144074,0.537692 c 0.116139,-0.330894 0.202775,-0.681866 0.303565,-1.01782 z m -0.96249,0.978265 -1.419135,1.424777 0.522263,1.949113 0.141014,-0.145837 c 0.382886,-0.719825 0.730277,-1.432221 1.034997,-2.186293 l -0.279139,-1.04176 z m -34.335629,9.236221 -1.428141,1.391173 0.522264,1.949113 1.419136,-1.42478 -0.513259,-1.915506 z m 8.602961,-2.305157 -1.42814,1.391174 0.522263,1.949112 1.419136,-1.424777 -0.513259,-1.915509 z m 8.569355,-2.296151 -1.428139,1.391173 0.522263,1.949112 1.419135,-1.424777 -0.513259,-1.915508 z m 8.569356,-2.296152 -1.419135,1.424777 0.513259,1.915508 1.428139,-1.391172 -0.522263,-1.949113 z m -21.404175,5.8793 -1.428137,1.391183 0.44122,1.646653 1.419135,-1.424778 -0.432218,-1.613058 z m 8.569356,-2.296152 -1.428137,1.391183 0.450226,1.680266 1.419133,-1.424787 -0.441222,-1.646662 z m 8.602962,-2.305156 -1.428138,1.391182 0.450226,1.680267 1.419133,-1.424787 -0.441221,-1.646662 z m 8.578362,-2.262538 -1.428139,1.391173 0.441222,1.646662 1.419132,-1.424787 -0.432215,-1.613048 z m 2.313467,0.568699 -1.18631,1.218323 0.522263,1.949112 1.18631,-1.218323 -0.522263,-1.949112 z m -34.33563,9.236223 -0.456643,0.44652 c 0.235943,0.17204 0.466314,0.33126 0.708769,0.49443 l -0.252126,-0.94095 z m 8.602961,-2.305158 -1.195314,1.184718 0.513258,1.91551 1.195315,-1.18472 -0.513259,-1.915508 z m 8.569357,-2.296153 -1.195316,1.184719 0.513259,1.915508 1.195316,-1.184718 -0.513259,-1.915509 z m 8.569355,-2.296151 -1.152705,1.209318 0.513259,1.915508 1.161709,-1.175714 -0.522263,-1.949112 z m -21.404175,5.8793 -1.195314,1.184722 0.432217,1.61305 1.195315,-1.18471 -0.432218,-1.613062 z m 8.569356,-2.296152 -1.161709,1.175714 0.441222,1.646662 1.161709,-1.175714 -0.441222,-1.646662 z m 8.602961,-2.305156 -1.195315,1.184718 0.441222,1.646662 1.195314,-1.184718 -0.441221,-1.646662 z m 8.578362,-2.262538 -1.195316,1.184709 0.432217,1.613057 1.195314,-1.184718 -0.432215,-1.613048 z m -23.19538,7.259705 -1.419136,1.424773 0.513259,1.91551 1.428137,-1.39118 -0.52226,-1.949103 z m 8.569356,-2.296152 -1.419136,1.424777 0.513259,1.915508 1.428137,-1.391182 -0.52226,-1.949103 z m 8.602961,-2.305157 -1.410132,1.458382 0.513259,1.915509 1.419134,-1.424788 -0.522261,-1.949103 z m 8.569356,-2.296152 -1.419136,1.424778 0.522264,1.949112 1.419132,-1.424787 -0.52226,-1.949103 z M 19.970555,81.48471 18.934262,82.5908 c 0.429888,0.24941 0.856871,0.47298 1.302895,0.69542 l 0.17462,-0.15484 -0.441222,-1.64667 z m 8.602961,-2.305153 -1.419136,1.424777 0.441222,1.646666 1.42814,-1.39118 -0.450226,-1.680263 z m 8.569355,-2.296152 -1.419135,1.424777 0.441221,1.646662 1.42814,-1.391173 -0.450226,-1.680266 z m 8.57836,-2.262548 -1.419135,1.424778 0.432217,1.613057 1.42814,-1.391173 -0.441222,-1.646662 z m -23.410194,7.533383 -1.204319,1.15111 0.117059,0.43687 c 0.444778,0.19669 0.91894,0.39769 1.376697,0.56758 l 0.223819,-0.24007 -0.513256,-1.91549 z m 8.569356,-2.296157 -1.170714,1.142107 0.522261,1.94911 1.161709,-1.17572 -0.513256,-1.915497 z m 8.60296,-2.305156 -1.195315,1.184718 0.513257,1.915499 1.204321,-1.151104 -0.522263,-1.949113 z m 8.569356,-2.296152 -1.204318,1.151114 0.522261,1.949103 1.20432,-1.151104 -0.522263,-1.949113 z m -21.404175,5.879305 -1.204319,1.15111 0.450226,1.68027 1.195315,-1.18472 -0.441222,-1.64666 z m 8.569357,-2.296157 -1.20432,1.151114 0.450226,1.680263 1.195316,-1.184715 -0.441222,-1.646662 z m 8.578359,-2.262547 -1.170713,1.142109 0.441222,1.646662 1.161709,-1.175714 -0.432218,-1.613057 z m 7.74788,-1.463724 -0.349237,0.309681 0.02701,0.100814 c 0.09969,-0.140033 0.225699,-0.268515 0.322224,-0.410495 z m -22.340296,6.418278 -1.419137,1.42478 0.513257,1.9155 1.419136,-1.42478 -0.513256,-1.9155 z m 8.569355,-2.296148 -1.419136,1.424777 0.522261,1.949101 1.419135,-1.42478 -0.52226,-1.949098 z m 8.569355,-2.296152 -1.419135,1.424777 0.522261,1.949103 1.419135,-1.424777 -0.522261,-1.949103 z m -21.404174,5.8793 -1.419136,1.42478 0.117059,0.43687 c 0.394597,0.12628 0.776933,0.26212 1.179247,0.36837 l 0.564052,-0.58336 -0.441222,-1.64666 z m 8.569356,-2.296152 -1.419136,1.424782 0.441222,1.64666 1.419135,-1.42478 -0.441221,-1.646662 z m 8.611965,-2.271552 -1.419136,1.424778 0.432217,1.613056 1.419137,-1.424776 -0.432218,-1.613058 z m 8.569356,-2.296152 -1.419135,1.424778 0.117059,0.436869 c 0.477746,-0.522483 0.928752,-1.10114 1.356102,-1.660019 l -0.05403,-0.201628 z m -23.419199,7.499776 -1.195315,1.18472 0.189093,0.7057 c 0.438297,0.08759 0.884162,0.19249 1.329264,0.25614 l 0.199218,-0.19746 -0.52226,-1.9491 z m 8.569356,-2.29615 -1.186311,1.21832 0.513256,1.9155 1.195316,-1.18472 -0.522261,-1.9491 z m 8.569355,-2.296156 -1.161709,1.175714 0.522261,1.949102 1.161709,-1.17571 -0.522261,-1.949106 z m -12.834819,3.583146 -1.161709,1.17572 0.441222,1.64666 1.170714,-1.14211 -0.450227,-1.68027 z m 8.611965,-2.27155 -1.195314,1.18472 0.432217,1.61306 1.204319,-1.15112 -0.441222,-1.64666 z m 8.569356,-2.296152 -1.195314,1.184719 0.108055,0.403264 c 0.406645,-0.365398 0.834514,-0.728004 1.213322,-1.117509 l -0.126063,-0.470474 z m -23.186376,7.293312 -0.05821,0.05161 c 0.02091,0.0049 0.04628,-0.02281 0.06721,-0.01801 l -0.009,-0.0336 z m 17.172317,-4.601311 -1.428138,1.391181 0.396198,1.47863 c 0.421481,-0.19782 0.832645,-0.40094 1.23857,-0.62002 l 0.315633,-0.30068 -0.522263,-1.949111 z m -8.593957,2.338761 -1.428137,1.39118 0.387193,1.44503 c 0.232467,-0.01947 0.466108,-0.05312 0.69912,-0.07928 l 0.855083,-0.84142 -0.513259,-1.91551 z m -4.240859,1.2444 -1.428141,1.39117 0.04502,0.16802 c 0.598027,0.06253 1.183809,0.07812 1.790735,0.09647 l 0.03361,-0.009 -0.441222,-1.64666 z m 8.578359,-2.26255 -1.42814,1.39117 0.441222,1.64666 1.419135,-1.42477 -0.432217,-1.61306 z m 8.569356,-2.296152 -1.42814,1.391172 0.03602,0.13442 c 0.512616,-0.370138 1.012852,-0.750913 1.491173,-1.155932 l -0.09905,-0.36966 z m -6.246885,2.898452 -1.195315,1.18472 0.153079,0.5713 c 0.462149,-0.17092 0.920198,-0.35074 1.366399,-0.54622 l -0.324163,-1.2098 z m -8.593954,2.33877 -1.029702,0.99627 c 0.424597,-0.0025 0.854389,-0.03061 1.281828,-0.05532 l -0.252126,-0.94095 z m 4.337499,-1.01816 -1.195316,1.18472 0.117059,0.43687 c 0.476116,-0.08601 0.943997,-0.22979 1.420428,-0.34458 l -0.342171,-1.27701 z m 2.54629,0.36225 -0.456643,0.44652 c 0.172308,-0.05482 0.367383,-0.08585 0.537685,-0.14407 l -0.08104,-0.30245 z"
- style="fill:url(#linearGradient9381-884-21);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient9387-409-257);stroke-width:0.98900002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- d="M 24.181711,34.829499 C 8.3491555,39.071819 -1.0696913,55.385741 3.1726293,71.218296 7.4149504,87.05085 23.719868,96.4361 39.552423,92.19378 c 7.139562,-1.91304 13.40581,-5.99898 16.829626,-11.92921 1.221572,-2.115832 1.910004,-4.262321 2.58291,-6.491002 L 114.58176,58.871092 c 0.44818,-0.12009 0.88922,-0.274388 1.27459,-0.485595 1.2698,-0.347821 2.43319,-1.213112 3.18156,-2.509333 l 6.55941,-11.410429 c 1.42099,-2.461247 0.78707,-5.482553 -1.45585,-6.777501 l -8.42774,-4.837355 c -0.19377,0.335622 -0.48546,0.598313 -0.89111,0.707007 l -1.27699,0.342169 -3.66445,-2.115667 c -0.72741,-0.419968 -1.66357,-0.169123 -2.08354,0.558283 l -1.50723,2.709017 -4.04793,-2.337077 c -0.20325,-0.117339 -0.44281,-0.165733 -0.66134,-0.182974 -0.0746,-0.0103 -0.14303,-0.01426 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10071,0.0061 -0.17642,0.01125 -0.27784,0.03843 l -3.831004,1.026515 c -0.05689,0.01525 -0.10553,0.05759 -0.159019,0.07863 -0.431007,0.07151 -0.831501,0.308563 -1.068135,0.718423 l -2.844687,4.976346 -6.922696,1.854931 -4.985351,-2.878294 c -0.727392,-0.41996 -1.663564,-0.169113 -2.083529,0.55828 L 77.473785,41.764576 73.6389,39.550505 c -0.727393,-0.419959 -1.663575,-0.169111 -2.08353,0.55828 l -3.410506,5.956373 -3.427743,0.91846 c -0.811293,0.21739 -1.62384,-0.28014 -1.841227,-1.091439 L 62.245557,43.539808 C 61.89324,42.224935 60.867705,42.000045 59.920026,42.253975 L 53.4342,43.991847 c -1.020929,-1.373074 -2.138582,-2.665496 -3.339338,-3.859613 -0.0411,-0.04087 -0.09554,-0.06675 -0.136832,-0.107408 -7.075365,-5.443729 -16.493832,-7.682563 -25.776319,-5.195327 z m -5.308547,10.715083 c 4.491338,-1.203447 9.099126,1.428453 10.302575,5.919788 1.20345,4.491335 -1.453052,9.141735 -5.944389,10.345185 -4.491335,1.203446 -9.117134,-1.495664 -10.320584,-5.986999 -1.203448,-4.491332 1.471063,-9.074525 5.962398,-10.277974 z"
- id="path3416"
- sodipodi:nodetypes="cssscccccccccccccsssccsccccccccccccccscccsssc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.65163933;fill:none;stroke:url(#radialGradient9389-453-398);stroke-width:1.48899996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- d="M 24.181711,34.829499 C 8.3491555,39.071819 -1.0696913,55.385741 3.1726293,71.218296 L 125.59732,44.465735 c 1.42099,-2.461247 0.91648,-4.99959 -1.32644,-6.294538 l -8.42774,-4.837355 c -0.19377,0.335622 -0.48546,0.598313 -0.89111,0.707007 l -1.27699,0.342169 -3.66445,-2.115668 c -0.72741,-0.419967 -1.66357,-0.169122 -2.08354,0.558283 l -1.50723,2.709017 -4.04793,-2.337076 c -0.20326,-0.117339 -0.44281,-0.165733 -0.66134,-0.182974 -0.0746,-0.0103 -0.14304,-0.01425 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10071,0.0061 -0.17642,0.01125 -0.27784,0.03843 l -3.831005,1.026515 c -0.05689,0.01525 -0.105529,0.05759 -0.159018,0.07863 -0.431007,0.07152 -0.831501,0.308563 -1.068136,0.718423 l -2.844687,4.976346 -6.922696,1.854931 -4.98535,-2.878294 c -0.727392,-0.41996 -1.663565,-0.169113 -2.08353,0.55828 l -1.648274,2.85486 -3.834884,-2.214071 c -0.727394,-0.419959 -1.663575,-0.169111 -2.08353,0.55828 l -3.410507,5.956372 -3.427742,0.918461 c -0.811294,0.21739 -1.623841,-0.28014 -1.841228,-1.091439 L 62.374967,44.022771 C 62.02265,42.707898 60.997115,42.483008 60.049435,42.736938 L 53.4342,43.991847 c -1.020929,-1.373074 -2.138582,-2.665496 -3.339338,-3.859613 -0.0411,-0.04087 -0.09554,-0.06675 -0.136832,-0.107408 -7.075365,-5.443729 -16.493832,-7.682563 -25.776319,-5.195327 z m -5.308547,10.715083 c 4.491338,-1.203447 9.099126,1.428453 10.302575,5.919788 1.20345,4.491335 -1.453052,9.141735 -5.944389,10.345185 -4.491335,1.203446 -9.117134,-1.495664 -10.320584,-5.986999 -1.203448,-4.491332 1.471063,-9.074525 5.962398,-10.277974 z"
- id="path3418"
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- id="path3420"
- d="M 24.181711,34.829499 C 8.3491555,39.071819 -1.0696913,55.385741 3.1726293,71.218296 L 125.59732,44.465735 c 1.42099,-2.461247 0.78707,-5.482553 -1.45585,-6.777501 l -8.42774,-4.837355 c -0.19377,0.335622 -0.48546,0.598313 -0.89111,0.707007 l -1.27699,0.342169 -3.66445,-2.115667 c -0.72741,-0.419968 -1.66357,-0.169123 -2.08354,0.558283 l -1.50723,2.709017 -4.04793,-2.337077 c -0.20325,-0.117339 -0.44281,-0.165733 -0.66134,-0.182974 -0.0746,-0.0103 -0.14303,-0.01426 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10071,0.0061 -0.17642,0.01125 -0.27784,0.03843 l -3.831004,1.026515 c -0.05689,0.01525 -0.10553,0.05759 -0.159019,0.07863 -0.431007,0.07151 -0.831501,0.308563 -1.068135,0.718423 l -2.844687,4.976346 -6.922696,1.854931 -4.985351,-2.878294 c -0.727392,-0.41996 -1.663564,-0.169113 -2.083529,0.55828 L 77.473785,41.764576 73.6389,39.550505 c -0.727393,-0.419959 -1.663575,-0.169111 -2.08353,0.55828 l -3.410506,5.956373 -3.427743,0.91846 c -0.811293,0.21739 -1.62384,-0.28014 -1.841227,-1.091439 L 62.245557,43.539808 C 61.89324,42.224935 60.867705,42.000045 59.920026,42.253975 L 53.4342,43.991847 c -1.020929,-1.373074 -2.138582,-2.665496 -3.339338,-3.859613 -0.0411,-0.04087 -0.09554,-0.06675 -0.136832,-0.107408 -7.075365,-5.443729 -16.493832,-7.682563 -25.776319,-5.195327 z m -5.308547,10.715083 c 4.491338,-1.203447 9.099126,1.428453 10.302575,5.919788 1.20345,4.491335 -1.453052,9.141735 -5.944389,10.345185 -4.491335,1.203446 -9.117134,-1.495664 -10.320584,-5.986999 -1.203448,-4.491332 1.471063,-9.074525 5.962398,-10.277974 z"
- style="opacity:0.84836067;fill:none;stroke:url(#radialGradient9391-502-67);stroke-width:0.58899999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- id="path3422"
- d="M 24.207593,34.926091 C 8.3750374,39.168412 -1.0438094,55.482333 3.1985112,71.314889 L 125.6232,44.562328 c 1.421,-2.461247 0.78707,-5.482554 -1.45585,-6.777502 l -8.42774,-4.837354 c -0.19376,0.335621 -0.48545,0.598313 -0.8911,0.707007 l -1.277,0.342169 -3.66444,-2.115668 c -0.72742,-0.419967 -1.66358,-0.169122 -2.08355,0.558283 l -1.50723,2.709017 -4.04793,-2.337077 c -0.20325,-0.117338 -0.44281,-0.165732 -0.66134,-0.182973 -0.0746,-0.0103 -0.14303,-0.01425 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10072,0.0061 -0.17642,0.01125 -0.27785,0.03843 L 97.211317,33.698 c -0.05689,0.01524 -0.105529,0.05759 -0.159018,0.07863 -0.431007,0.07152 -0.831501,0.308562 -1.068135,0.718422 l -2.844687,4.976347 -6.922696,1.85493 -4.985351,-2.878293 c -0.727392,-0.41996 -1.663564,-0.169114 -2.083529,0.558279 l -1.648254,2.854859 -3.834885,-2.214072 c -0.727393,-0.419958 -1.663575,-0.16911 -2.08353,0.558281 l -3.410506,5.956372 -3.427743,0.918461 c -0.811293,0.21739 -1.62384,-0.280141 -1.841227,-1.091439 l -0.630317,-2.352373 c -0.352317,-1.314873 -1.377852,-1.539763 -2.325531,-1.285833 l -6.485826,1.737872 C 52.439153,42.715369 51.3215,41.422947 50.120744,40.22883 50.079644,40.18796 50.025204,40.16208 49.983912,40.121422 42.908547,34.677692 33.49008,32.438858 24.207593,34.926094 z m -5.308548,10.715083 c 4.491339,-1.203446 9.099127,1.428453 10.302576,5.919788 1.20345,4.491336 -1.453052,9.141736 -5.944389,10.345186 -4.491335,1.203445 -9.117134,-1.495665 -10.320584,-5.986999 -1.203449,-4.491332 1.471063,-9.074525 5.962397,-10.277975 z"
- style="fill:none;stroke:url(#radialGradient9393-641-971);stroke-width:0.78899997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- inkscape:connector-curvature="0" />
- <path
- id="path3424"
- d="M 91.298643,57.955932 C 75.567573,62.171059 63.30463,68.559534 62.055745,72.941419 L 114.57796,58.868133 c 0.44818,-0.120089 0.91043,-0.26541 1.2958,-0.476617 1.2698,-0.347811 2.42308,-1.235901 3.17145,-2.532113 l 0.70711,-1.224744 c -6.01448,-0.956253 -16.69278,0.169949 -28.453677,3.321273 z"
- style="opacity:0.63934428;fill:url(#radialGradient9395-67-109);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path3426"
- d="M 65.606555,54.914486 125.19038,38.949047"
- style="fill:none;stroke:url(#radialGradient9397-309-349);stroke-width:0.214;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#radialGradient9399-429-605);stroke-width:0.65574688;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="M 66.900716,59.300518 126.48455,43.335079"
- id="path3428"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.20901639;fill:url(#linearGradient9401-82-291);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="M 24.181711,34.829499 C 8.3491555,39.071819 -1.0696913,55.385741 3.1726293,71.218296 7.4149504,87.05085 23.719868,96.4361 39.552423,92.19378 c 7.139562,-1.91304 12.970506,-6.2726 16.829626,-11.92921 0.02791,-0.04092 0.04609,-0.08679 0.0738,-0.127838 0.04438,-0.08645 0.103958,-0.168818 0.147605,-0.255654 0.982551,-1.954801 1.764428,-3.990666 2.361504,-6.10751 L 114.58176,58.871092 c 0.44818,-0.12009 0.88922,-0.274388 1.27459,-0.485595 1.2698,-0.347821 2.43319,-1.213112 3.18156,-2.509333 l 6.55941,-11.410429 c 1.42099,-2.461247 0.78707,-5.482553 -1.45585,-6.777501 l -8.42774,-4.837355 c -0.19377,0.335622 -0.48546,0.598313 -0.89111,0.707007 l -1.27699,0.342169 -3.66445,-2.115667 c -0.72741,-0.419968 -1.66357,-0.169123 -2.08354,0.558283 l -1.50723,2.709017 -4.04793,-2.337077 c -0.20325,-0.117339 -0.44281,-0.165733 -0.66134,-0.182974 -0.0746,-0.0103 -0.14303,-0.01426 -0.21964,-0.01319 -0.0239,0.0017 -0.0435,0.01522 -0.0672,0.01801 -0.10071,0.0061 -0.17642,0.01125 -0.27784,0.03843 l -3.831004,1.026515 c -0.05689,0.01525 -0.10553,0.05759 -0.159019,0.07863 -0.431007,0.07151 -0.831501,0.308563 -1.068135,0.718423 l -2.844687,4.976346 -6.922696,1.854931 -4.985351,-2.878294 c -0.727392,-0.41996 -1.663564,-0.169113 -2.083529,0.55828 L 77.473785,41.764576 73.6389,39.550505 c -0.727393,-0.419959 -1.663575,-0.169111 -2.08353,0.55828 l -3.410506,5.956373 -3.427743,0.91846 c -0.811293,0.21739 -1.62384,-0.28014 -1.841227,-1.091439 L 62.245557,43.539808 C 61.89324,42.224935 60.867705,42.000045 59.920026,42.253975 L 53.4342,43.991847 c -1.020929,-1.373074 -2.138582,-2.665496 -3.339338,-3.859613 -0.0411,-0.04087 -0.09554,-0.06675 -0.136832,-0.107408 -7.075365,-5.443729 -16.493832,-7.682563 -25.776319,-5.195327 z m -5.308547,10.715083 c 4.491338,-1.203447 9.099126,1.428453 10.302575,5.919788 1.20345,4.491335 -1.453052,9.141735 -5.944389,10.345185 -4.491335,1.203446 -9.117134,-1.495664 -10.320584,-5.986999 -1.203448,-4.491332 1.471063,-9.074525 5.962398,-10.277974 z"
- id="path3539"
- sodipodi:nodetypes="cssssscccccccccccccsssccsccccccccccccccscccsssc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="matrix(6.6950206,0,0,6.196426,74.186626,-7.802551)"
- d="m 27.75,58.75 c 0,9.664983 -7.835017,17.5 -17.5,17.5 -9.66498312,0 -17.5,-7.835017 -17.5,-17.5 0,-9.664983 7.83501688,-17.5 17.5,-17.5 9.664983,0 17.5,7.835017 17.5,17.5 z"
- sodipodi:ry="17.5"
- sodipodi:rx="17.5"
- sodipodi:cy="58.75"
- sodipodi:cx="10.25"
- id="path3527"
- style="opacity:0.32786889;fill:url(#radialGradient9403-685-582);fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc" />
- <path
- style="fill:#cfcfcf;fill-opacity:0.75688076;fill-rule:nonzero;stroke:none"
- d="m 214.13666,113.01803 0,-10.83772 0,10.83772 z"
- id="path2276"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssssscccccccccccccsssccsccccccccccccccscccsssc"
- id="path1969"
- d="m 134.80965,272.29143 c -63.563591,0 -115.218772,51.65518 -115.218772,115.21877 0,63.56361 51.655181,115.08388 115.218772,115.08388 28.6635,0 54.88066,-10.47761 75.01365,-27.79281 0.14542,-0.12527 0.25983,-0.27883 0.40475,-0.40478 0.25284,-0.27922 0.55885,-0.52803 0.80948,-0.80949 5.64244,-6.33613 10.61458,-13.17732 14.97575,-20.50732 l 223.28695,0 c 1.79933,0 3.60625,-0.13535 5.26175,-0.53966 5.10554,-0.0271 10.33184,-2.10192 14.4361,-6.20617 l 36.02273,-36.15766 c 7.79308,-7.79311 8.45097,-19.74659 1.34914,-26.84838 l -26.71347,-26.57859 c -1.06266,1.06271 -2.41894,1.75391 -4.04752,1.75391 l -5.12679,0 -11.60284,-11.6028 c -2.30322,-2.30322 -6.06169,-2.30322 -8.36487,0 l -8.3648,8.63463 -12.81706,-12.81706 c -0.64359,-0.64355 -1.49235,-1.06523 -2.29361,-1.34917 -0.26913,-0.11363 -0.52147,-0.19701 -0.80948,-0.26991 -0.0911,-0.0194 -0.17839,0.0116 -0.26991,0 -0.38352,-0.0779 -0.67212,-0.13496 -1.0793,-0.13496 l -15.3805,0 c -0.22841,0 -0.45309,0.10975 -0.67457,0.13496 -1.68624,-0.16481 -3.42433,0.32109 -4.72209,1.619 l -15.65032,15.78524 -27.79281,0 -15.78524,-15.78524 c -2.30315,-2.30315 -6.06165,-2.30315 -8.36484,0 l -9.0394,9.03941 -12.14249,-12.1425 c -2.30314,-2.30315 -6.06169,-2.30315 -8.36484,0 l -18.75341,18.88833 -13.76149,0 c -3.25713,3e-5 -5.8014,-2.67915 -5.8014,-5.93631 l 0,-9.44419 c 0,-5.27885 -3.61571,-7.15058 -7.42041,-7.15058 l -26.03893,0 c -2.44605,-6.16794 -5.33539,-12.13085 -8.63467,-17.80897 -0.11284,-0.19429 -0.29083,-0.34592 -0.40474,-0.53966 -21.03906,-27.49258 -54.07172,-45.332 -91.3385,-45.332 z m -30.63933,34.80848 c 18.03154,3e-5 32.64982,14.48337 32.64982,32.5149 0,18.03157 -14.61828,32.78473 -32.64982,32.78473 -18.031537,0 -32.649817,-14.7532 -32.649817,-32.78473 0,-18.03153 14.61828,-32.5149 32.649817,-32.5149 z"
- style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(2.9251696,0,0,2.9251696,20.00345,226.93235)"
- d="m 68,65.25 c 0,16.016258 -12.983742,29 -29,29 -16.016258,0 -29,-12.983742 -29,-29 0,-16.016258 12.983742,-29 29,-29 16.016258,0 29,12.983742 29,29 z"
- sodipodi:ry="29"
- sodipodi:rx="29"
- sodipodi:cy="65.25"
- sodipodi:cx="39"
- id="path3187"
- style="opacity:0.41393445;fill:url(#radialGradient9409-380-91);fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc" />
- <path
- style="fill:none;stroke:url(#linearGradient3639);stroke-width:3.83528376;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- d="m 134.80965,272.29143 c -63.563591,0 -115.218772,51.65518 -115.218772,115.21877 0,63.56361 51.655181,115.08388 115.218772,115.08388 28.6635,0 56.23662,-9.01579 75.01365,-27.79281 6.69938,-6.69943 11.43253,-14.04878 16.18998,-21.72159 l 223.28695,0 c 1.79933,0 3.60625,-0.13535 5.26175,-0.53966 5.10554,-0.0271 10.33184,-2.10192 14.4361,-6.20617 l 36.02273,-36.15766 c 7.79308,-7.79311 8.45097,-19.74659 1.34914,-26.84838 l -26.71347,-26.57859 c -1.06266,1.06271 -2.41894,1.75391 -4.04752,1.75391 l -5.12679,0 -11.60284,-11.6028 c -2.30322,-2.30322 -6.06169,-2.30322 -8.36487,0 l -8.3648,8.63463 -12.81706,-12.81706 c -0.64359,-0.64355 -1.49235,-1.06523 -2.29361,-1.34917 -0.26913,-0.11363 -0.52147,-0.19701 -0.80948,-0.26991 -0.0911,-0.0194 -0.17839,0.0116 -0.26991,0 -0.38352,-0.0779 -0.67212,-0.13496 -1.0793,-0.13496 l -15.3805,0 c -0.22841,0 -0.45309,0.10975 -0.67457,0.13496 -1.68624,-0.16481 -3.42433,0.32109 -4.72209,1.619 l -15.65032,15.78524 -27.79281,0 -15.78524,-15.78524 c -2.30315,-2.30315 -6.06165,-2.30315 -8.36484,0 l -9.0394,9.03941 -12.14249,-12.1425 c -2.30314,-2.30315 -6.06169,-2.30315 -8.36484,0 l -18.75341,18.88833 -13.76149,0 c -3.25713,3e-5 -5.8014,-2.67915 -5.8014,-5.93631 l 0,-9.44419 c 0,-5.27885 -3.61571,-7.15058 -7.42041,-7.15058 l -26.03893,0 c -2.44605,-6.16794 -5.33539,-12.13085 -8.63467,-17.80897 -0.11284,-0.19429 -0.29083,-0.34592 -0.40474,-0.53966 -21.03906,-27.49258 -54.07172,-45.332 -91.3385,-45.332 z m -30.63933,34.80848 c 18.03154,3e-5 32.64982,14.48337 32.64982,32.5149 0,18.03157 -14.61828,32.78473 -32.64982,32.78473 -18.031537,0 -32.649817,-14.7532 -32.649817,-32.78473 0,-18.03153 14.61828,-32.5149 32.649817,-32.5149 z"
- id="path3142"
- sodipodi:nodetypes="cssscccccccccccccsssccsccccccccccccccscccsssc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient3636);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 242.77448,335.95694 c -0.0779,0.38353 -0.13185,0.78012 -0.13185,1.18727 l 0,33.7717 c 0,3.25725 2.54726,5.93643 5.8045,5.93643 l 251.44088,0 -20.18386,-20.05193 c -1.06268,1.06271 -2.46102,1.71498 -4.08957,1.71498 l -5.14494,0 -11.60901,-11.60905 c -2.30318,-2.30318 -6.00782,-2.30318 -8.31096,0 l -8.44294,8.57487 -12.79631,-12.79631 c -0.64355,-0.64355 -1.44144,-1.0353 -2.24269,-1.3192 -0.26913,-0.11363 -0.50344,-0.1908 -0.79145,-0.2637 -0.0911,-0.0194 -0.17218,0.0116 -0.26409,0 -0.38353,-0.0779 -0.78004,-0.13185 -1.18723,-0.13185 l -15.30279,0 c -0.2284,0 -0.43816,0.10664 -0.65963,0.13185 -1.68625,-0.16481 -3.45136,0.28542 -4.74912,1.58305 l -15.69856,15.83046 -27.70335,0 -15.8305,-15.83046 c -2.30315,-2.30319 -6.00782,-2.30319 -8.311,0 l -9.10255,9.1025 -12.13667,-12.13668 c -2.30319,-2.30318 -6.00785,-2.30318 -8.31101,0 l -18.86466,18.86464 -13.71978,0 c -3.25711,3e-5 -5.8045,-2.67927 -5.8045,-5.93644 l 0,-9.49828 c 0,-5.27888 -3.58287,-7.12369 -7.38755,-7.12369 l -18.46889,0 z"
- id="path2944"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path2900"
- d="m 264.54702,389.12099 c -3.2572,0 -19.92567,0.0116 -19.92567,7.21243 l 0,2.39319 c 0,6.74552 16.32818,7.676 19.58542,7.676 l 243.43813,0 c 3.43097,-5.40271 4.07126,-11.83295 1.97876,-17.28162 l -245.07664,0 z"
- style="fill:url(#linearGradient3633);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 264.54702,397.56393 c -3.2572,0 -19.92567,-5.67929 -19.92567,0.13068 l 0,1.03207 c 0,6.65994 16.32818,7.676 19.58542,7.676 l 243.86029,0 c 3.43096,-5.4027 4.07125,-11.83291 1.97875,-17.28161 L 264.54702,397.564 z"
- id="path2915"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path2927"
- d="m 242.77448,335.95694 c -0.0779,0.38353 -0.13185,0.78012 -0.13185,1.18727 l 0,33.7717 c 0,3.25725 2.54726,5.93643 5.8045,5.93643 l 251.44088,0 -20.18386,-20.05193 c -1.06268,1.06271 -2.46102,1.71498 -4.08957,1.71498 l -5.14494,0 -11.60901,-11.60905 c -2.30318,-2.30318 -6.00782,-2.30318 -8.31096,0 l -8.44294,8.57487 -12.79631,-12.79631 c -0.64355,-0.64355 -1.44144,-1.0353 -2.24269,-1.3192 -0.26913,-0.11363 -0.50344,-0.1908 -0.79145,-0.2637 -0.0911,-0.0194 -0.17218,0.0116 -0.26409,0 -0.38353,-0.0779 -0.78004,-0.13185 -1.18723,-0.13185 l -15.30279,0 c -0.2284,0 -0.43816,0.10664 -0.65963,0.13185 -1.68625,-0.16481 -3.45136,0.28542 -4.74912,1.58305 l -15.69856,15.83046 -27.70335,0 -15.8305,-15.83046 c -2.30315,-2.30319 -6.00782,-2.30319 -8.311,0 l -9.10255,9.1025 -12.13667,-12.13668 c -2.30319,-2.30318 -6.00785,-2.30318 -8.31101,0 l -18.86466,18.86464 -13.71978,0 c -3.25711,3e-5 -5.8045,-2.67927 -5.8045,-5.93644 l 0,-9.49828 c 0,-5.27888 -3.58287,-7.12369 -7.38755,-7.12369 l -18.46889,0 z"
- style="fill:url(#linearGradient3627);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path2967"
- d="m 129.68283,295.49711 c -1.13283,0.055 -2.25111,0.31139 -3.37292,0.40474 l 0,2.96817 5.66652,-3.238 0,-0.13495 c -0.76088,0.0194 -1.53736,-0.0388 -2.2936,0 z m 7.28548,0 -2.56339,1.48404 0,7.82519 6.74583,-3.77767 0,-5.26174 c -1.39474,-0.0947 -2.77153,-0.235 -4.18244,-0.26991 z m 6.61092,0.53965 0,3.50783 5.12684,-2.96818 c -1.7179,-0.25323 -3.37952,-0.37771 -5.12684,-0.53965 z m -19.6978,0.13495 c -1.17751,0.12797 -2.33211,0.21872 -3.50783,0.40474 1.21794,0.44996 2.3396,1.0735 3.50783,1.619 l 0,-2.02374 z m 28.60229,1.07931 -0.80948,0.40478 0,6.47596 6.74584,-3.91257 0,-1.619 c -1.95988,-0.49769 -3.92816,-0.97293 -5.93636,-1.34917 z m -20.50729,1.21426 -3.64278,2.02374 c 1.25254,0.75795 2.47005,1.56064 3.64278,2.42853 l 0,-4.45227 z m 17.26929,0.67457 -5.66649,3.10309 0,6.61092 5.66649,-3.37292 0,-6.34109 z m 14.4361,0.80952 -2.83326,1.619 0,7.9601 5.53157,-3.23801 0,-5.39666 c -0.91694,-0.32109 -1.76815,-0.65029 -2.69831,-0.94443 z m 5.12683,1.75391 0,3.10309 3.10309,-1.75391 c -1.02179,-0.43041 -2.06256,-0.95328 -3.10309,-1.34918 z m -10.38857,1.34918 -6.74584,3.91257 0,7.82518 6.74584,-3.91261 0,-7.82514 z m -17.26933,0.67456 -4.857,2.83327 c 1.39272,1.31206 2.68776,2.71064 3.91257,4.18239 l 0.94443,-0.53965 0,-6.47601 z m 33.59421,0.5397 -5.93631,3.37287 0,6.47602 6.74583,-3.91258 0,-5.53157 c -0.30054,-0.14194 -0.50712,-0.26564 -0.80952,-0.40474 z m 3.238,1.61896 0,2.96818 2.69836,-1.61901 c -0.87482,-0.47958 -1.80604,-0.89623 -2.69836,-1.34917 z m -28.73724,2.42853 -5.66649,3.238 0,3.50783 c 0.68244,1.04707 1.28973,2.13554 1.88883,3.238 l 3.77766,-2.02379 0,-7.96004 z m 33.99899,0.2699 -5.26175,2.96817 0,7.82515 5.66649,-3.10309 0,-7.42041 c -0.15822,-0.0943 -0.24586,-0.17644 -0.40474,-0.2699 z m -16.86458,0.40474 -5.53157,3.238 0,6.476 5.53157,-3.238 0,-6.476 z m 19.69785,1.48409 0,4.31731 3.50783,-2.02374 c -1.12147,-0.78761 -2.34903,-1.55359 -3.50783,-2.29357 z m -10.5235,2.5634 -6.74583,3.77769 0,7.96005 6.74583,-3.91257 0,-7.82517 z m -17.1344,0.6746 -6.74584,3.77766 0,6.61092 6.74584,-4.04753 0,-6.34105 z m 33.18947,0.67457 -5.53157,3.10309 0,6.61092 6.74583,-4.04753 0,-4.85696 c -0.39485,-0.30403 -0.81417,-0.51154 -1.21426,-0.80952 z m 3.64274,2.83326 0,1.48408 1.07935,-0.6746 c -0.36453,-0.31063 -0.70962,-0.50409 -1.07935,-0.80948 z m -28.87216,1.0793 -5.53157,3.23801 0,7.82518 5.53157,-3.238 0,-7.82519 z m -17.13441,0.67461 -2.69831,1.48409 c 0.8091,1.68648 1.41704,3.47146 2.02374,5.26175 l 0.67457,-0.40475 0,-6.34109 z m 34.40373,0 -5.66649,3.238 0,6.47598 5.66649,-3.37289 0,-6.34109 z m 14.57102,0.80949 -2.96818,1.75391 0,7.82518 5.66649,-3.37291 0,-3.77767 c -0.84621,-0.82278 -1.81945,-1.63753 -2.69831,-2.42851 z m -39.80039,3.10309 -6.74584,3.91257 0,7.82517 6.74584,-3.77765 0,-7.96009 z m 34.40373,0 -6.74583,3.91257 0,7.82517 6.74583,-3.77765 0,-7.96009 z m -17.26933,0.6746 -6.74583,3.91257 0,6.47601 6.74583,-3.91261 0,-6.47597 z m 29.41182,2.96814 -1.61901,0.94443 0,6.47601 5.39667,-3.10309 c -1.1953,-1.50809 -2.4865,-2.88639 -3.77766,-4.31731 z m -21.31685,1.75392 -5.66649,3.10308 0,7.9601 5.66649,-3.238 0,-7.82518 z m 17.26933,0.53968 -5.66649,3.238 0,6.61089 5.66649,-3.37291 0,-6.47598 z m -34.53865,0.13496 -5.53157,3.10304 0,6.61093 5.53157,-3.37291 0,-6.34106 z m 43.71301,3.77766 -6.74585,4.04748 0,7.82518 6.74585,-4.04752 0,-7.82514 z m -34.53866,0.13495 -6.74583,3.91257 0,7.82514 6.74583,-3.91257 0,-7.82514 z m -17.1344,0.67457 -6.74584,3.91257 0,6.476 6.74584,-3.91256 0,-6.47601 z m 34.40373,0 -6.74583,3.91257 0,6.476 6.74583,-3.91256 0,-6.47601 z m 19.69781,2.29356 0,3.50784 1.619,-1.07931 c -0.52318,-0.82084 -1.06907,-1.62537 -1.619,-2.42849 z m -46.14149,2.29361 -5.53157,3.23801 0,7.82514 5.53157,-3.10309 0,-7.96006 z m 34.53865,0 -5.66649,3.23801 0,7.82514 5.66649,-3.238 0,-7.82515 z m -145.844824,0.2699 c -0.561833,0.88526 -1.223799,1.79317 -1.753909,2.69832 l 1.753909,-1.07931 0,-1.61901 z m 128.575494,0.40475 -5.66649,3.23801 0,6.476 5.66649,-3.238 0,-6.47601 z m 31.70542,1.619 -2.83325,1.61901 0,6.476 5.66652,-3.238 c -0.8545,-1.65914 -1.87595,-3.25798 -2.83327,-4.85697 z m -160.280914,2.42853 -3.912609,2.15865 c -1.041339,2.01179 -1.949863,4.11186 -2.833223,6.20617 l 0,3.37293 6.745832,-3.91258 0,-7.82517 z m 103.346124,0 -6.74584,3.77765 0,7.9601 6.74584,-3.91258 0,-7.82517 z m 34.40373,0 -6.74583,3.77765 0,7.9601 6.74583,-3.91258 0,-7.82517 z m 17.26933,0.53965 -6.74585,3.91261 0,6.61091 6.74585,-4.04752 0,-6.476 z m -34.53866,0.13495 -6.74583,3.7777 0,6.61087 6.74583,-4.04748 0,-6.34109 z m -118.05204,3.91261 0,1.75391 0.26991,-0.13494 c -0.09457,-0.53156 -0.193118,-1.08149 -0.26991,-1.61901 z m 160.6857,0.53965 -5.66652,3.37292 0,7.82514 5.66652,-3.37287 0,-7.82519 z m -34.53869,0.13496 -5.66649,3.238 0,7.82515 5.66649,-3.23798 0,-7.82517 z m 17.26937,0.53965 -5.66653,3.37291 0,6.47601 5.66653,-3.37292 0,-6.476 z m -34.53869,0.13495 -5.53157,3.23801 0,6.476 5.53157,-3.37291 0,-6.3411 z m 54.23649,1.88884 0,3.91261 1.21426,-0.80953 c -0.40578,-1.05321 -0.76844,-2.06896 -1.21426,-3.10305 z m -162.304661,0.94443 -0.809519,0.40474 0,6.476 2.428484,-1.48409 c -0.650095,-1.75973 -1.180522,-3.54533 -1.618965,-5.39665 z m 117.242521,1.0793 -6.74583,3.91261 0,7.82515 6.74583,-3.77766 0,-7.9601 z m 34.53866,0 -6.74585,4.04752 0,7.69024 6.74585,-3.91257 0,-7.82519 z m -155.019184,0.67461 -6.745832,3.91257 0,6.47601 6.745832,-3.77766 0,-6.61092 z m 103.346124,0 -6.74584,3.91257 0,6.47601 6.74584,-3.91258 0,-6.476 z m 34.40373,0 -6.74583,3.91257 0,6.47601 6.74583,-3.77766 0,-6.61092 z m -43.57809,0.40436 c -0.26331,0.91356 -0.49319,1.80843 -0.80948,2.69834 l 0.80948,-0.5397 0,-2.15864 z m 73.52956,2.15864 -2.15866,1.34918 0,6.47601 3.77766,-2.29357 c -0.51983,-1.85878 -0.97859,-3.72278 -1.619,-5.53162 z m -56.39515,2.1587 -5.53157,3.23796 0,7.82519 5.53157,-3.238 0,-7.82515 z m 34.53869,0 -5.66653,3.23796 0,7.82519 5.66653,-3.37291 0,-7.69024 z m 17.26932,0.53966 -5.66652,3.238 0,6.61092 5.66652,-3.37292 0,-6.476 z m -172.288531,0.13495 -0.539662,0.13496 c -0.781824,2.49975 -1.335908,5.10355 -1.888822,7.69022 l 2.428484,-1.34913 0,-6.47601 z m 103.346111,0 -2.15866,1.21426 c -1.00051,2.22865 -2.18676,4.31219 -3.50783,6.34106 l 0,2.15865 5.66649,-3.37292 0,-6.34105 z m 34.40373,0 -5.66649,3.10309 0,6.61088 5.66649,-3.23796 0,-6.47601 z m -122.774094,0.53965 -3.372916,2.02375 0,7.82517 5.531574,-3.238 0,-2.29357 c -0.77183,-1.38489 -1.527097,-2.85106 -2.158658,-4.31731 z m -5.8014,3.37292 -6.745832,3.91258 0,7.82517 6.745832,-3.91257 0,-7.82518 z m 103.346124,0 -6.74584,3.91258 0,7.82517 6.74584,-3.91257 0,-7.82518 z m 34.40373,0 -6.74583,4.04749 0,7.69026 6.74583,-3.91257 0,-7.82518 z m 17.26933,0.53966 -6.74585,4.04752 0,6.47601 6.74585,-3.91261 0,-6.61092 z m -34.53866,0.13494 -6.74583,3.91261 0,6.47598 6.74583,-3.91258 0,-6.47601 z m 49.5144,0.67461 -4.45226,2.69831 0,7.69027 5.93632,-3.37291 c -0.375,-2.34271 -0.92186,-4.73672 -1.48409,-7.01567 z m -159.60634,3.50783 0,6.20615 3.372916,-1.88883 c -1.202904,-1.36085 -2.331883,-2.82326 -3.372916,-4.31728 z m -19.562931,0.40478 -3.103058,1.88883 c -0.481826,2.763 -0.869971,5.52208 -1.079345,8.36484 l 4.182403,-2.29361 0,-7.96006 z m 103.346111,0 -5.66649,3.238 0,7.82515 5.66649,-3.10309 0,-7.96006 z m 34.40373,0 -5.66649,3.37292 0,7.69023 5.66649,-3.10309 0,-7.96006 z m 34.53869,0 -5.66652,3.37292 0,7.69023 5.66652,-3.10309 0,-7.96006 z m -155.154126,0.67457 -5.531574,3.23801 0,6.476 5.531574,-3.10309 0,-6.61092 z m 103.346116,0 -5.53157,3.23801 0,6.476 5.53157,-3.10309 0,-6.61092 z m 34.53869,0 -5.66653,3.23801 0,6.476 5.66653,-3.238 0,-6.47601 z m -59.76807,0.94444 c -0.0973,0.12525 -0.17101,0.28075 -0.2699,0.40473 l 0.2699,-0.13495 0,-0.2699 z m 0,3.10304 -5.93635,3.37292 c -0.25905,0.22918 -0.54524,0.45116 -0.80948,0.67461 l 0,7.69023 6.74583,-3.91257 0,-7.82519 z m 34.40373,0 -6.74583,3.91261 0,7.82515 6.74583,-3.91257 0,-7.82519 z m 34.53866,0 -6.74585,3.91261 0,7.82515 6.74585,-3.91257 0,-7.82519 z m -155.019184,0.67461 -6.745832,3.77766 0,6.61092 6.745832,-3.91257 0,-6.47601 z m 103.346124,0 -6.74584,3.77766 0,6.61092 6.74584,-3.91257 0,-6.47601 z m 34.40373,0 -6.74583,3.77766 0,6.61092 6.74583,-3.91257 0,-6.47601 z m 33.99899,0.13496 -6.20618,3.64274 0,6.61092 6.74583,-3.91257 0,-2.1587 c -0.11323,-1.41156 -0.35792,-2.78995 -0.53965,-4.18239 z m -156.368348,0.13495 -4.991912,2.83322 0,7.96009 6.745831,-3.91256 0,-5.12684 c -0.609189,-0.56167 -1.175092,-1.16117 -1.753919,-1.75391 z m 4.182403,3.91257 0,1.48408 1.214258,-0.67456 c -0.387797,-0.29162 -0.836044,-0.50631 -1.214258,-0.80952 z m -11.602841,0.40474 -5.531574,3.238 0,7.82519 5.531574,-3.23801 0,-7.82518 z m 103.346116,0 -5.53157,3.37291 0,7.69028 5.53157,-3.23801 0,-7.82518 z m 34.53869,0 -5.66653,3.37291 0,7.69028 5.66653,-3.23801 0,-7.82518 z m 17.26932,0.53969 -5.66652,3.37292 0,6.61088 5.66652,-3.37291 0,-6.61089 z m -172.288531,0.13495 -4.317316,2.42849 c -0.04618,1.15066 0,2.21147 0,3.37291 0,1.02417 -0.0349,2.08727 0,3.10309 l 4.317316,-2.42852 0,-6.47597 z m 86.076821,0 c -1.78692,1.32234 -3.69866,2.44497 -5.66652,3.50783 l 0,6.88075 5.66652,-3.238 0,-7.15058 z m 17.26929,0 -5.66649,3.23801 0,6.47596 5.66649,-3.238 0,-6.47597 z m 34.40373,0 -5.66649,3.23801 0,6.47596 5.66649,-3.238 0,-6.47597 z m -105.639679,1.34914 -3.372916,1.88887 0,6.47596 5.666487,-3.238 0,-3.77766 c -0.766442,-0.4505 -1.555636,-0.85729 -2.293571,-1.34917 z m -22.935815,2.56343 -6.745832,3.91258 0,7.82518 6.745832,-3.77766 0,-7.9601 z m 103.346124,0 -6.74584,4.04749 0,7.69027 6.74584,-3.77766 0,-7.9601 z m 68.94237,0 -6.74583,4.04749 0,7.69027 6.74583,-3.77766 0,-7.9601 z m -144.630593,0.13496 0,1.07931 0.944401,-0.53966 c -0.329244,-0.1586 -0.619385,-0.37383 -0.944401,-0.53965 z m 110.091953,0 -6.74583,3.91256 0,7.69028 6.74583,-3.7777 0,-7.82514 z m -120.615439,0.53965 -6.745831,3.91258 0,6.476 6.745831,-3.77766 0,-6.61092 z m 68.942379,0 -6.74583,3.91258 0,6.476 6.74583,-3.77766 0,-6.61092 z m 34.40373,0 -6.74583,3.91258 0,6.476 6.74583,-3.77766 0,-6.61092 z m 34.53866,0 -6.74585,3.91258 0,6.61091 6.74585,-3.91257 0,-6.61092 z m -86.21171,0.26991 c -1.66174,0.77334 -3.36683,1.44565 -5.12684,2.02374 l -1.61899,0.94444 0,7.82513 6.74583,-3.77765 0,-7.01566 z m -37.641733,0.94443 -3.50784,2.02375 0,7.82513 6.745843,-3.77765 0,-4.99192 c -1.054338,-0.34592 -2.21795,-0.66247 -3.238003,-1.07931 z m 5.666476,1.75392 0,2.83322 3.507839,-2.02374 c -1.199256,-0.22415 -2.342362,-0.49611 -3.507839,-0.80948 z m 19.023247,1.0793 c -0.58553,0.0853 -1.1616,0.34126 -1.75392,0.40478 l 0,0.67457 1.75392,-1.07935 z m -10.92823,0.40478 0,5.93632 6.74582,-3.77766 0,-2.15866 c -0.89018,0.0501 -1.79563,0.13496 -2.69834,0.13496 -1.39203,0 -2.68605,-0.0155 -4.04748,-0.13496 z m -54.101581,0.2699 -4.182403,2.29357 c 0.165201,2.50531 0.432202,4.97548 0.809487,7.42041 l 3.372916,-1.88883 0,-7.82515 z m 34.403733,0 -5.666487,3.23797 0,7.69027 0.2699,0 5.396661,-3.10309 0,-7.82515 z m 34.403728,0 -5.53157,3.23797 0,7.69027 0.26991,0 5.26174,-3.10309 0,-7.82515 z m 34.53865,0 -5.66649,3.23797 0,7.69027 0.26991,0 5.39665,-3.10309 0,-7.82515 z m 68.94242,0 -5.66652,3.23797 0,7.82518 5.66652,-3.238 0,-7.82515 z m -34.53869,0.13496 -5.66649,3.10305 0,7.69027 0.26991,0 5.39667,-3.10309 0,-7.69023 z m 17.26937,0.40474 -5.66653,3.238 0,6.74584 5.66653,-3.37291 0,-6.61093 z m -137.884806,0.13495 -5.531574,3.10309 0,6.61089 5.531574,-3.238 0,-6.47598 z m 34.538646,0 -5.666487,3.10309 0,6.61089 5.666487,-3.238 0,-6.47598 z m 34.40377,0 -5.66652,3.10309 0,6.61089 5.66652,-3.238 0,-6.47598 z m 34.4037,0 -5.53157,3.10309 0,6.61089 5.53157,-3.238 0,-6.47598 z m -94.171759,3.91258 -6.745831,3.91257 0,2.42851 c 0.431611,-0.0977 0.887112,0 1.34917,0 l 5.396661,0 0,-6.34108 z m 34.538639,0 -6.74582,3.91257 0,2.42851 6.74582,0 0,-6.34108 z m 34.40374,0 -6.74583,4.04748 0,2.2936 6.74583,0 0,-6.34108 z m 68.94239,0 -6.74585,4.04748 0,2.2936 3.23801,0 c 1.37656,0 2.49647,0.44174 3.50784,1.21423 l 0,-7.55531 z m -34.53866,0.13494 -6.74583,3.91258 0,2.2936 6.74583,0 0,-6.20618 z m -120.480524,0.53967 -6.745832,3.9126 0,6.47597 6.745832,-3.91257 0,-6.476 z m 34.403744,0 -6.745843,3.9126 0,1.75391 6.745843,0 0,-5.66651 z m 34.40373,0 -6.74583,3.9126 0,1.75391 6.74583,0 0,-5.66651 z m 34.53865,0 -6.74584,3.9126 0,1.75391 6.74584,0 0,-5.66651 z m 34.40373,0 -6.74583,3.9126 0,1.75391 6.74583,0 0,-5.66651 z m 34.26882,0.13494 -6.47601,3.7777 0,6.61088 5.53158,-3.37291 c 0.44006,-2.33484 0.69903,-4.6215 0.94443,-7.01567 z m -164.058616,4.45227 -5.531574,3.238 0,7.82514 3.238003,-1.75391 0,-2.29357 c 0,-1.89096 0.937073,-3.48646 2.293571,-4.58717 l 0,-2.42849 z m 34.538646,0 -1.888822,1.0793 1.888822,0 0,-1.0793 z m 34.40377,0 -1.75395,1.0793 1.75395,0 0,-1.0793 z m 68.94239,0 -1.75392,1.0793 1.75392,0 0,-1.0793 z m -34.53869,0.13495 -1.619,0.9444 1.619,0 0,-0.9444 z m -120.480521,0.53966 -2.968146,1.75391 c 0.356781,1.92637 0.730029,3.78499 1.214226,5.66648 l 1.75392,-0.80947 0,-6.61092 z m 34.403733,0 -0.674575,0.40474 0.674575,0 0,-0.40474 z m 34.403728,0 -0.67456,0.40474 0.67456,0 0,-0.40474 z m 34.53865,0 -0.67457,0.40474 0.67457,0 0,-0.40474 z m 34.40373,0 -0.67456,0.40474 0.67456,0 0,-0.40474 z m 34.53869,0 -5.66652,3.238 0,3.10309 0,3.50783 5.66652,-3.238 0,-6.61092 z m -163.114184,4.04748 -6.745832,3.77769 0,7.96006 6.745832,-3.91258 0,-7.82517 z m 170.399674,1.07934 -4.85701,2.83327 0,7.82514 2.15866,-1.21422 c 1.07981,-3.06164 1.96825,-6.24399 2.69835,-9.44419 z m -179.574021,4.18248 -1.079313,0.53965 c 0.291237,1.00727 0.7524,1.97559 1.079313,2.96818 l 0,-3.50783 z m 172.288491,0 -5.66648,3.37292 0,7.82514 5.66648,-3.37292 0,-7.82514 z m -157.447657,2.02374 -3.238003,1.88883 0,6.476 3.238003,-1.88882 0,-6.47601 z m -5.666487,3.23801 -6.745832,3.91257 0,0.94443 c 0.627608,1.48793 1.180954,2.87053 1.888833,4.31731 l 4.856999,-2.56339 0,-6.61092 z m 166.217234,3.64274 -0.67457,0.40474 0,1.34918 c 0.25556,-0.5929 0.43209,-1.1547 0.67457,-1.75392 z m -3.10309,1.75392 -5.66648,3.238 0,6.61092 4.72209,-2.83326 c 0.29549,-0.5447 0.66056,-1.06784 0.94439,-1.61901 l 0,-5.39665 z m -157.447657,0.67456 -3.238003,1.88884 0,7.82517 5.261748,-3.10309 c -1.201691,-1.09796 -2.023745,-2.55374 -2.023745,-4.3173 l 0,-2.29362 z m -5.666487,3.23801 -3.642741,2.15865 c 1.056857,2.01378 2.164783,3.8786 3.372915,5.80144 l 0.26991,-0.13495 0,-7.82519 z m 155.019184,3.77765 c -1.01137,0.77249 -2.13128,1.21427 -3.50784,1.21427 l -3.23801,0 0,6.20617 6.74585,-4.04752 0,-3.37292 z m -144.6306,1.21427 0,6.07126 6.745831,-3.91261 0,-2.15865 -5.396703,0 c -0.462016,0 -0.917517,0.0977 -1.349128,0 z m 9.174315,0 0,0.80952 1.349171,-0.80952 -1.349171,0 z m 8.095002,0 0,6.74583 6.745843,-3.91258 0,-2.83325 -6.745843,0 z m 9.174316,0 0,1.48408 2.563439,-1.48408 -2.563439,0 z m 8.095017,0 0,6.07126 6.74582,-3.91261 0,-2.15865 -6.74582,0 z m 9.17431,0 0,0.80952 1.34917,-0.80952 -1.34917,0 z m 7.9601,0 0,6.74583 6.74583,-3.91258 0,-2.83325 -6.74583,0 z m 9.17431,0 0,1.48408 2.56343,-1.48408 -2.56343,0 z m 8.09501,0 0,6.20617 6.74583,-3.91261 0,-2.29356 -6.74583,0 z m 9.17431,0 0,0.94443 1.61901,-0.94443 -1.61901,0 z m 8.09501,0 0,6.74583 6.74584,-3.91258 0,-2.83325 -6.74584,0 z m 9.17432,0 0,1.48408 2.56343,-1.48408 -2.56343,0 z m 7.96009,0 0,6.20617 6.74583,-3.91261 0,-2.29356 -6.74583,0 z m 9.17431,0 0,0.94443 1.61901,-0.94443 -1.61901,0 z m 8.09502,0 0,6.88074 6.74583,-3.91257 0,-2.96817 -6.74583,0 z m 9.17431,0 0,1.48408 2.56344,-1.48408 -2.56344,0 z m -114.948948,0.40474 -5.666487,3.238 0,7.69026 5.666487,-3.10309 0,-7.82517 z m 34.403728,0 -5.53157,3.238 0,7.69026 5.53157,-3.10309 0,-7.82517 z m 34.53865,0 -5.66649,3.238 0,7.69026 5.66649,-3.10309 0,-7.82517 z m 34.40373,0 -5.66649,3.37291 0,7.69027 5.66649,-3.23801 0,-7.82517 z m -120.615436,0.53969 -5.531574,3.238 0,2.83323 c 0.623496,0.88359 1.098543,1.70279 1.75392,2.56343 l 3.777654,-2.02374 0,-6.61092 z m 34.538646,0 -5.666487,3.238 0,6.47597 5.666487,-3.10305 0,-6.61092 z m 34.40374,0 -5.66649,3.238 0,6.61088 5.66649,-3.10305 0,-6.74583 z m 34.40373,0 -5.53157,3.238 0,6.61088 5.53157,-3.10305 0,-6.74583 z m 34.53865,0 -5.66649,3.37292 0,6.47596 5.66649,-3.23796 0,-6.61092 z m 13.76149,1.34913 -2.15865,1.34918 0,2.15869 c 0.76717,-1.1229 1.44395,-2.35061 2.15865,-3.50787 z m -4.58713,2.69835 -6.74585,3.91258 0,7.82518 0.67458,-0.40474 c 2.15672,-2.31203 4.17297,-4.63186 6.07127,-7.15062 l 0,-4.1824 z m -137.884769,0.13496 -6.745831,3.77765 0,7.82519 6.745831,-3.91258 0,-7.69026 z m 34.538639,0 -6.74582,3.77765 0,7.82519 6.74582,-3.91258 0,-7.69026 z m 34.40374,0 -6.74583,3.77765 0,7.82519 6.74583,-3.91258 0,-7.69026 z m 34.40373,0 -6.74583,3.91256 0,7.69028 6.74583,-3.77767 0,-7.82517 z m -86.07678,0.53965 -6.745843,3.77769 0,6.61089 6.745843,-3.91258 0,-6.476 z m 34.40373,0 -6.74583,3.77769 0,6.74584 6.74583,-3.91261 0,-6.61092 z m 34.53865,0 -6.74584,3.77769 0,6.74584 6.74584,-3.91261 0,-6.61092 z m 34.40373,0.13495 -6.74583,3.77766 0,6.61092 6.74583,-3.91261 0,-6.47597 z m 8.09497,4.45223 -5.66649,3.37292 0,7.82517 5.66649,-3.37291 0,-7.82518 z m -137.884766,0.13495 -2.158658,1.21426 c 0.711136,0.88122 1.414249,1.70885 2.158658,2.5634 l 0,-3.77766 z m 34.538646,0 -5.666487,3.238 0,7.69027 5.666487,-3.238 0,-7.69027 z m 34.40374,0 -5.66649,3.238 0,7.69027 5.66649,-3.238 0,-7.69027 z m 34.40373,0 -5.53157,3.37291 0,7.69028 5.53157,-3.23801 0,-7.82518 z m -86.076788,0.53966 -5.666487,3.238 0,6.47601 5.666487,-3.23801 0,-6.476 z m 34.403728,0 -5.53157,3.238 0,6.61092 5.53157,-3.238 0,-6.61092 z m 34.53865,0 -5.66649,3.238 0,6.61092 5.66649,-3.238 0,-6.61092 z m 34.40373,0.13494 -5.66649,3.23797 0,6.47601 5.66649,-3.238 0,-6.47598 z m -94.17175,3.91258 -6.745843,3.91257 0,7.69026 6.745843,-3.7777 0,-7.82513 z m 34.40373,0 -6.74583,3.91257 0,7.69026 6.74583,-3.7777 0,-7.82513 z m 34.53865,0 -6.74584,4.04748 0,7.69026 6.74584,-3.91261 0,-7.82513 z m 34.40373,0 -6.74583,3.91257 0,7.82517 6.74583,-3.91261 0,-7.82513 z m -120.615439,0.53965 -4.991922,3.10309 c 1.359955,1.36569 2.734955,2.63169 4.182403,3.91257 l 0.809519,-0.40474 0,-6.61092 z m 34.538639,0 -6.74582,3.91257 0,6.61092 6.74582,-3.77766 0,-6.74583 z m 34.40374,0 -6.74583,3.91257 0,6.61092 6.74583,-3.77766 0,-6.74583 z m 34.40373,0.13496 -6.74583,3.91256 0,6.47601 6.74583,-3.77766 0,-6.61091 z m -95.251138,4.72208 -5.666487,3.10309 0,1.75392 c 1.468649,1.1832 3.043019,2.412 4.587174,3.50783 l 1.079313,-0.67461 0,-7.69023 z m 34.403728,0 -5.53157,3.10309 0,7.82515 5.53157,-3.23801 0,-7.69023 z m 34.53865,0 -5.66649,3.23801 0,7.69023 5.66649,-3.10305 0,-7.82519 z m 34.40373,0 -5.66649,3.10309 0,7.82515 5.66649,-3.10305 0,-7.82519 z m -86.07679,0.53965 -5.666487,3.10309 0,6.74585 5.666487,-3.23801 0,-6.61093 z m 34.40374,0 -5.66649,3.10309 0,6.74585 5.66649,-3.23801 0,-6.61093 z m 34.40373,0.13496 -5.53157,3.10309 0,6.61092 5.53157,-3.23801 0,-6.476 z m 30.49116,2.29361 -1.619,0.80948 0,0.40474 c 0.51398,-0.42448 1.11495,-0.77928 1.619,-1.21422 z m -90.12428,1.619 -6.74582,3.91258 0,7.69022 6.74582,-3.91257 0,-7.69023 z m 34.40374,0 -6.74583,3.91258 0,7.82513 6.74583,-3.91257 0,-7.82514 z m 34.40373,0 -6.74583,3.91258 0,7.82513 6.74583,-3.91257 0,-7.82514 z m -86.07678,0.53965 -6.745843,3.91258 0,1.75391 c 1.351311,0.86908 2.647126,1.76168 4.047491,2.56344 l 2.698352,-1.619 0,-6.61093 z m 34.40373,0 -6.74583,3.91258 0,6.61092 6.74583,-3.91257 0,-6.61093 z m 34.53865,0.13495 -6.74584,3.91258 0,6.47601 6.74584,-3.91258 0,-6.47601 z m 34.40373,0 -6.74583,3.91258 0,1.75391 c 2.31393,-1.47761 4.58411,-3.19247 6.74583,-4.857 l 0,-0.80949 z m -95.25115,4.58719 -5.666487,3.238 0,2.83322 c 1.553854,0.76799 3.118682,1.60846 4.722097,2.29361 l 0.94439,-0.5397 0,-7.82513 z m 34.40374,0 -5.66649,3.37291 0,7.69023 5.66649,-3.23801 0,-7.82513 z m 34.40373,0 -5.53157,3.238 0,7.82514 5.53157,-3.23801 0,-7.82513 z m -51.67306,0.53965 -5.53157,3.238 0,6.61092 5.53157,-3.10309 0,-6.74583 z m 34.53865,0.13495 -5.66649,3.23801 0,6.476 5.66649,-3.10309 0,-6.61092 z m 34.40373,0 -5.66649,3.23801 0,1.61899 c 1.88997,-0.96056 3.85662,-1.88937 5.66649,-2.96817 l 0,-1.88883 z m -94.17175,4.04749 -0.26991,0.13495 c 0.07327,0.0391 0.196228,-0.0391 0.26991,0 l 0,-0.13495 z m 68.94238,0 -6.74584,3.77769 0,5.93631 c 1.77734,-0.31799 3.52133,-0.66615 5.26174,-1.07934 l 1.4841,-0.80949 0,-7.82517 z m -34.53865,0.13495 -6.74583,3.7777 0,5.8014 c 0.89029,0.16054 1.79924,0.26874 2.69831,0.40473 l 4.04752,-2.29357 0,-7.69026 z m -17.13442,0.40478 -6.74582,3.77766 0,0.67456 c 2.17731,0.83446 4.3559,1.48079 6.61091,2.1587 l 0.13496,0 0,-6.61092 z m 34.40374,0.13495 -6.74583,3.77766 0,6.61092 6.74583,-3.91258 0,-6.476 z m 34.40373,0 -6.74583,3.77766 0,0.53965 c 2.29163,-0.87195 4.54763,-1.79618 6.74583,-2.83322 l 0,-1.48409 z m -26.30876,4.58714 -5.66649,3.238 0,2.29361 c 1.90268,-0.17645 3.79891,-0.3902 5.66649,-0.6746 l 0,-4.85701 z m -34.53865,0.13495 -4.85696,2.69831 c 1.59297,0.41668 3.23106,0.7429 4.85696,1.07935 l 0,-3.77766 z m 17.26933,0.53965 -5.66649,3.23801 0,1.75392 c 1.86974,0.15589 3.76668,0.0869 5.66649,0.13494 l 0,-5.12682 z m 9.17435,3.91258 -2.15865,1.21426 c 0.70043,-0.031 1.46229,0.0473 2.15865,0 l 0,-1.21426 z"
- style="fill:url(#linearGradient3624);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.65163933;fill:none;stroke:url(#radialGradient3621);stroke-width:5.77425385;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- d="m 134.80965,272.29143 c -63.563591,0 -115.218772,51.65518 -115.218772,115.21877 l 485.429932,22.66599 c 7.79308,-7.79311 8.45097,-17.80762 1.34914,-24.90941 l -26.71347,-26.57859 c -1.06266,1.06271 -2.41894,1.75392 -4.04752,1.75392 l -5.12679,0 -11.60284,-11.6028 c -2.30322,-2.30323 -6.06169,-2.30323 -8.36487,0 l -8.3648,8.63462 -12.81706,-12.81706 c -0.64359,-0.64355 -1.49235,-1.06524 -2.29361,-1.34918 -0.26913,-0.11362 -0.52147,-0.197 -0.80948,-0.2699 -0.0911,-0.0194 -0.17839,0.0116 -0.26991,0 -0.38352,-0.0779 -0.67212,-0.13495 -1.0793,-0.13495 l -15.3805,0 c -0.22841,0 -0.45309,0.10974 -0.67457,0.13495 -1.68624,-0.16481 -3.42433,0.32109 -4.72209,1.619 l -15.65032,15.78524 -27.79281,0 -15.78524,-15.78524 c -2.30315,-2.30315 -6.06165,-2.30315 -8.36484,0 l -9.0394,9.0394 -12.14249,-12.14249 c -2.30314,-2.30315 -6.06169,-2.30315 -8.36484,0 l -18.75341,18.88833 -13.76149,0 c -3.25713,3e-5 -5.8014,-2.67915 -5.8014,-5.93632 l 0,-9.44417 c 0,-5.27885 -3.61571,-7.15058 -7.42041,-7.15058 l -26.03893,-1.93898 c -2.44605,-6.16794 -5.33539,-12.13085 -8.63467,-17.80897 -0.11284,-0.19429 -0.29083,-0.34592 -0.40474,-0.53966 -21.03906,-27.49258 -54.07172,-45.332 -91.3385,-45.332 z m -30.63933,34.80848 c 18.03154,3e-5 32.64982,14.48337 32.64982,32.5149 0,18.03157 -14.61828,32.78473 -32.64982,32.78473 -18.031537,0 -32.649817,-14.7532 -32.649817,-32.78473 0,-18.03153 14.61828,-32.5149 32.649817,-32.5149 z"
- id="path3154"
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- id="path3158"
- d="m 134.80965,272.29143 c -63.563591,0 -115.218772,51.65518 -115.218772,115.21877 l 485.429932,22.66599 c 7.79308,-7.79311 8.45097,-19.74659 1.34914,-26.84838 l -26.71347,-26.57859 c -1.06266,1.06271 -2.41894,1.75391 -4.04752,1.75391 l -5.12679,0 -11.60284,-11.6028 c -2.30322,-2.30322 -6.06169,-2.30322 -8.36487,0 l -8.3648,8.63463 -12.81706,-12.81706 c -0.64359,-0.64355 -1.49235,-1.06523 -2.29361,-1.34917 -0.26913,-0.11363 -0.52147,-0.19701 -0.80948,-0.26991 -0.0911,-0.0194 -0.17839,0.0116 -0.26991,0 -0.38352,-0.0779 -0.67212,-0.13496 -1.0793,-0.13496 l -15.3805,0 c -0.22841,0 -0.45309,0.10975 -0.67457,0.13496 -1.68624,-0.16481 -3.42433,0.32109 -4.72209,1.619 l -15.65032,15.78524 -27.79281,0 -15.78524,-15.78524 c -2.30315,-2.30315 -6.06165,-2.30315 -8.36484,0 l -9.0394,9.03941 -12.14249,-12.1425 c -2.30314,-2.30315 -6.06169,-2.30315 -8.36484,0 l -18.75341,18.88833 -13.76149,0 c -3.25713,3e-5 -5.8014,-2.67915 -5.8014,-5.93631 l 0,-9.44419 c 0,-5.27885 -3.61571,-7.15058 -7.42041,-7.15058 l -26.03893,0 c -2.44605,-6.16794 -5.33539,-12.13085 -8.63467,-17.80897 -0.11284,-0.19429 -0.29083,-0.34592 -0.40474,-0.53966 -21.03906,-27.49258 -54.07172,-45.332 -91.3385,-45.332 z m -30.63933,34.80848 c 18.03154,3e-5 32.64982,14.48337 32.64982,32.5149 0,18.03157 -14.61828,32.78473 -32.64982,32.78473 -18.031537,0 -32.649817,-14.7532 -32.649817,-32.78473 0,-18.03153 14.61828,-32.5149 32.649817,-32.5149 z"
- style="opacity:0.84836067;fill:none;stroke:url(#radialGradient3618);stroke-width:2.28410721;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccccccccsssccsccccccccccccccscccsssc"
- id="path3144"
- d="m 134.80965,272.67922 c -63.563591,0 -115.218772,51.65518 -115.218772,115.21878 l 485.429932,22.66599 c 7.79308,-7.79312 8.45097,-19.74659 1.34914,-26.84838 l -26.71347,-26.5786 c -1.06266,1.06272 -2.41894,1.75392 -4.04752,1.75392 l -5.12679,0 -11.60284,-11.6028 c -2.30322,-2.30323 -6.06169,-2.30323 -8.36487,0 l -8.3648,8.63462 -12.81706,-12.81706 c -0.64359,-0.64354 -1.49235,-1.06523 -2.29361,-1.34918 -0.26913,-0.11361 -0.52147,-0.19699 -0.80948,-0.2699 -0.0911,-0.0194 -0.17839,0.0116 -0.26991,0 -0.38352,-0.0779 -0.67212,-0.13495 -1.0793,-0.13495 l -15.3805,0 c -0.22841,0 -0.45309,0.10975 -0.67457,0.13495 -1.68624,-0.16481 -3.42433,0.3211 -4.72209,1.619 l -15.65032,15.78525 -27.79281,0 -15.78524,-15.78525 c -2.30315,-2.30314 -6.06165,-2.30314 -8.36484,0 l -9.0394,9.0394 -12.14249,-12.14249 c -2.30314,-2.30314 -6.06169,-2.30314 -8.36484,0 l -18.75341,18.88834 -13.76149,0 c -3.25713,3e-5 -5.8014,-2.67916 -5.8014,-5.93633 l 0,-9.44417 c 0,-5.27885 -3.61571,-7.15058 -7.42041,-7.15058 l -26.03893,0 c -2.44605,-6.16794 -5.33539,-12.13085 -8.63467,-17.80898 -0.11284,-0.19428 -0.29083,-0.34591 -0.40474,-0.53965 -21.03906,-27.49259 -54.07172,-45.332 -91.3385,-45.332 z m -30.63933,34.80847 c 18.03154,5e-5 32.64982,14.48338 32.64982,32.51491 0,18.03158 -14.61828,32.78473 -32.64982,32.78473 -18.031537,0 -32.649817,-14.75319 -32.649817,-32.78473 0,-18.03153 14.61828,-32.51491 32.649817,-32.51491 z"
- style="fill:none;stroke:url(#radialGradient3615);stroke-width:3.05969524;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:4"
- inkscape:connector-curvature="0" />
- <path
- id="path3168"
- d="m 363.00484,426.28275 c -63.15619,0 -115.50277,11.62184 -124.57885,26.78203 l 210.863,0 c 1.79933,0 3.67667,-0.0802 5.33216,-0.48473 5.10555,-0.0271 10.31684,-2.19745 14.4211,-6.30167 l 3.87794,-3.87793 c -21.56926,-9.61858 -62.69843,-16.1177 -109.91535,-16.1177 z"
- style="opacity:0.63934428;fill:url(#radialGradient3612);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path3203"
- d="m 269.81998,389.10335 239.21353,0"
- style="fill:none;stroke:url(#radialGradient3609);stroke-width:0.82987934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#radialGradient3606);stroke-width:2.54294777;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 270.26543,406.83147 239.21358,0"
- id="path3214"
- inkscape:connector-curvature="0" />
- </g>
- </g>
<text
xml:space="preserve"
style="font-size:56.11684418px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
@@ -4028,15 +3456,95 @@
height="69.433342"
x="203.53499"
y="291.69998" /></flowRegion><flowPara
- id="flowPara11203" /></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:0.6;fill:#9933cc;fill-opacity:1;stroke:none"
- id="path4501"
- sodipodi:cx="227.53687"
- sodipodi:cy="246.58241"
- sodipodi:rx="225.51656"
- sodipodi:ry="225.51656"
- d="m 453.05342,246.58241 c 0,124.54936 -100.9672,225.51656 -225.51655,225.51656 -124.54936,0 -225.5165606,-100.9672 -225.5165606,-225.51656 0,-124.54935 100.9672006,-225.516553 225.5165606,-225.516553 124.54935,0 225.51655,100.967203 225.51655,225.516553 z"
- transform="translate(-824.39975,263.78972)" />
+ id="flowPara11203" /></flowRoot> <g
+ transform="matrix(0.41563835,0,0,0.41563835,373.39264,573.26951)"
+ id="g3013">
+ <g
+ id="Layer_9"
+ transform="matrix(1.6991779,0,0,1.6991779,-304.41094,-297.68272)">
+ <path
+ clip-rule="evenodd"
+ d="M 313.25,252 H 265.3 c 1.047,-0.933 2.105,-1.85 3.175,-2.75 H 313.25 V 252 z m 0,61 v 18.75 h -80.5 V 292.3 c 1.324,-2.403 2.724,-4.778 4.2,-7.125 V 313 h 76.3 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:#94c061;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 232.75,292.3 v 39.45 h 80.5 V 313 h 3.7 v -61 h -3.7 v -2.75 h -44.775 c 1.307,-1.109 2.632,-2.192 3.975,-3.25 2.202,-1.742 4.435,-3.408 6.7,-5 4.153,-2.919 8.412,-5.585 12.775,-8 9.974,-5.517 20.499,-9.717 31.575,-12.6 12.134,-3.167 24.934,-4.75 38.4,-4.75 9.199,0 18.083,0.75 26.649,2.25 3,0.5 6,1.117 9,1.85 24.967,6 47.217,18.583 66.75,37.75 0.334,0.333 0.667,0.667 1,1 21.334,21.367 34.717,45.983 40.15,73.85 0.2,1.167 0.416,2.351 0.649,3.551 1.4,8.3 2.101,16.85 2.101,25.649 0,0.134 0,0.283 0,0.45 0,22.934 -4.601,43.967 -13.8,63.1 -4.601,9.434 -10.284,18.417 -17.051,26.95 -2,2.4 -4.033,4.783 -6.1,7.15 -1.934,2.133 -3.917,4.217 -5.95,6.25 -3.5,3.5 -7.066,6.8 -10.7,9.899 -4.833,4.034 -9.833,7.717 -15,11.051 -5.333,3.399 -10.833,6.416 -16.5,9.05 -0.533,0.2 -1.033,0.416 -1.5,0.649 -17.466,7.867 -36.483,11.967 -57.05,12.301 -0.533,0 -1.05,0 -1.55,0 -0.366,0 -0.733,0 -1.1,0 -40.434,0 -74.934,-14.317 -103.5,-42.95 -0.467,-0.467 -0.917,-0.917 -1.35,-1.351 -27.7,-28.3 -41.55,-62.333 -41.55,-102.1 0,-0.167 0,-0.316 0,-0.45 0.042,-14.928 2.042,-29.053 6,-42.375 0.517,-1.738 1.067,-3.464 1.65,-5.175 2.562,-7.495 5.762,-14.728 9.602,-21.699 z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:#658d38;fill-rule:evenodd" />
+ </g>
+ <g
+ id="Layer_6"
+ transform="matrix(1.6991779,0,0,1.6991779,-304.41094,-297.68272)">
+ <path
+ clip-rule="evenodd"
+ d="m 304.3,301.2 c -0.614,-0.905 -1.206,-1.821 -1.775,-2.75 0.907,-1.061 1.598,-2.144 2.075,-3.25 1.167,-2.333 1.75,-4.9 1.75,-7.7 0,-1.033 -0.083,-2.033 -0.25,-3 -0.368,-2.332 -1.21,-4.482 -2.525,-6.45 0.112,0.118 0.204,0.209 0.275,0.275 L 304,278.5 c 2.9,3.256 4.35,7.09 4.35,11.5 0,1.759 -0.233,3.425 -0.7,5 -0.266,0.932 -0.616,1.833 -1.05,2.7 -0.515,1.195 -1.282,2.362 -2.3,3.5 z m -7.475,5.225 c -1.841,0.65 -3.816,0.975 -5.925,0.975 -2.68,0 -5.146,-0.533 -7.4,-1.6 -1.783,-0.85 -3.433,-2.033 -4.95,-3.55 -0.894,-0.895 -1.669,-1.836 -2.325,-2.825 0.106,0.106 0.214,0.214 0.325,0.325 3.434,3.433 7.55,5.15 12.35,5.15 2.171,0 4.205,-0.35 6.1,-1.05 0.588,0.867 1.197,1.725 1.825,2.575 z"
+ id="path10"
+ inkscape:connector-curvature="0"
+ style="fill:#bbd89c;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 333.575,324.85 c 0.758,-1.002 1.6,-1.968 2.524,-2.899 4.9,-4.867 10.801,-7.3 17.7,-7.3 3.473,0 6.689,0.616 9.65,1.85 -0.393,-0.553 -0.81,-1.095 -1.25,-1.625 0.193,0.112 0.385,0.229 0.575,0.35 0.349,0.262 0.69,0.537 1.024,0.825 1.32,1.517 2.354,3.133 3.101,4.851 0.1,0.199 0.199,0.383 0.3,0.55 1.1,2.033 1.866,4.184 2.3,6.45 0.063,0.356 0.121,0.715 0.175,1.074 -3.332,0.468 -6.757,0.7 -10.274,0.7 -9.27,0.001 -17.879,-1.608 -25.825,-4.826 z m 102.55,-21.8 c -0.209,-0.221 -0.417,-0.438 -0.625,-0.65 -1.628,-1.637 -3.294,-3.195 -5,-4.675 2.639,-5.218 4.613,-10.71 5.925,-16.475 l 25.851,-25.775 c 0.342,0.343 0.684,0.685 1.024,1.025 21.334,21.367 34.717,45.983 40.15,73.85 0.2,1.167 0.416,2.351 0.649,3.551 1.4,8.3 2.101,16.85 2.101,25.649 0,0.134 0,0.283 0,0.45 0,22.934 -4.601,43.967 -13.8,63.1 -4.601,9.434 -10.284,18.417 -17.051,26.95 -0.075,0.091 -0.15,0.183 -0.225,0.275 l 5.975,-21.976 c 0.101,-0.399 0.051,-0.816 -0.149,-1.25 -0.167,-0.366 -0.417,-0.683 -0.75,-0.949 -0.134,-0.034 -8.167,-8.784 -24.101,-26.25 3.448,-7.858 5.157,-14.851 5.125,-20.976 -0.005,-1.372 -0.005,-2.605 0,-3.7 0.547,-2.661 0.964,-5.245 1.25,-7.75 0.469,-4.224 0.561,-8.232 0.275,-12.024 0.033,-0.367 0.033,-0.783 0,-1.25 -0.4,-2.634 -0.884,-5.25 -1.45,-7.851 -2.666,-11.433 -7.75,-22.116 -15.25,-32.05 -1.333,-1.7 -2.7,-3.383 -4.1,-5.05 -1.467,-1.7 -2.95,-3.317 -4.45,-4.85 -0.455,-0.458 -0.913,-0.908 -1.374,-1.349 z M 255.05,462.1 301.775,415.526 c 1.695,2.331 3.52,4.623 5.475,6.875 0.874,0.999 1.757,1.975 2.65,2.925 l 51.075,81.075 c -0.362,0 -0.721,0 -1.074,0 -40.434,0 -74.934,-14.317 -103.5,-42.95 -0.454,-0.453 -0.903,-0.903 -1.351,-1.351 z M 368.6,340.05 c -1.316,3.908 -3.649,7.324 -7,10.25 -0.066,0.033 -0.149,0.117 -0.25,0.25 -0.1,0.033 -0.149,0.084 -0.149,0.15 -0.101,0.033 -0.167,0.083 -0.2,0.149 -0.434,0.367 -0.866,0.733 -1.3,1.101 -0.101,0.033 -0.2,0.1 -0.3,0.2 -2.434,1.8 -4.9,3.017 -7.4,3.649 l -2.85,0.601 c -0.267,0 -0.517,0.033 -0.75,0.1 -1,0.1 -2.034,0.15 -3.101,0.15 -0.1,0 -0.2,0 -0.3,0 -0.1,0 -0.2,0 -0.3,0 -0.101,0 -0.2,0 -0.3,0 -0.134,-0.067 -0.284,-0.101 -0.45,-0.101 h -0.25 c -4.182,-0.275 -7.89,-1.476 -11.125,-3.6 -2.517,-3.904 -3.775,-8.338 -3.775,-13.3 0,-2.092 0.226,-4.092 0.675,-6 9.717,4.448 20.358,6.682 31.926,6.699 2.441,-0.001 4.841,-0.102 7.199,-0.298 z"
+ id="path12"
+ inkscape:connector-curvature="0"
+ style="fill:#7bad45;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="M 301.775,415.525 255.05,462.1 C 227.35,433.796 213.5,399.763 213.5,360 c 0,-0.167 0,-0.316 0,-0.45 0.089,-36.006 11.589,-67.339 34.5,-94 1.905,-2.214 3.888,-4.397 5.95,-6.55 0.805,-0.837 1.622,-1.671 2.45,-2.5 4.5,-4.5 9.184,-8.667 14.05,-12.5 0.165,-0.13 0.332,-0.264 0.5,-0.4 0.336,-0.264 0.669,-0.522 1,-0.775 0.154,-0.119 0.304,-0.235 0.45,-0.35 l 13.15,-8.95 c 0.752,-0.458 1.511,-0.908 2.275,-1.35 v 0.025 c 0.41,-0.238 0.818,-0.479 1.225,-0.725 l 1.225,-0.675 c 0.469,-0.25 0.935,-0.5 1.4,-0.75 4.524,-2.416 9.158,-4.565 13.9,-6.45 4.045,-1.601 8.171,-3.009 12.375,-4.225 1.177,-0.34 2.36,-0.665 3.55,-0.975 12.141,-3.167 24.94,-4.75 38.4,-4.75 9.199,0 18.083,0.75 26.649,2.25 3,0.5 6,1.117 9,1.85 7.557,1.815 14.865,4.231 21.925,7.25 6.836,10.689 10.252,22.79 10.25,36.3 0.002,10.708 -2.14,20.524 -6.425,29.45 -8.328,-5.511 -17.444,-9.411 -27.35,-11.7 -0.233,-0.066 -0.45,-0.117 -0.65,-0.15 -1.434,-0.333 -2.916,-0.633 -4.45,-0.9 -0.199,-0.033 -0.35,-0.05 -0.449,-0.05 -5.301,-0.7 -8.25,-1.067 -8.851,-1.1 h -0.05 c -18.967,-1.267 -36.134,2.783 -51.5,12.15 -4.233,2.567 -8.316,5.55 -12.25,8.95 -0.1,0.066 -0.167,0.15 -0.2,0.25 -0.133,0.1 -0.283,0.233 -0.45,0.4 -0.53,0.462 -1.056,0.929 -1.574,1.4 -2.051,1.869 -3.984,3.803 -5.8,5.8 -1.214,-1.499 -2.355,-3.032 -3.425,-4.6 1.019,-1.139 1.785,-2.305 2.3,-3.5 0.434,-0.868 0.784,-1.768 1.05,-2.7 0.467,-1.575 0.7,-3.241 0.7,-5 0,-4.41 -1.45,-8.244 -4.35,-11.5 l -0.15,-0.175 c -0.071,-0.066 -0.163,-0.158 -0.275,-0.275 -0.069,-0.076 -0.144,-0.159 -0.225,-0.25 -0.051,-0.051 -0.102,-0.101 -0.15,-0.15 -0.633,-0.633 -1.317,-1.217 -2.05,-1.75 -2.26,-1.695 -4.768,-2.728 -7.525,-3.1 H 293.6 c -0.432,-0.1 -0.898,-0.149 -1.4,-0.15 -0.434,-0.066 -0.867,-0.1 -1.3,-0.1 -0.333,0 -0.65,0.034 -0.95,0.1 -0.667,0 -1.317,0.05 -1.95,0.15 h -0.05 c -0.256,0.041 -0.506,0.091 -0.75,0.15 l -2.2,0.6 c -0.44,0.165 -0.874,0.348 -1.3,0.55 -0.117,0.05 -0.233,0.1 -0.35,0.15 -1.731,0.798 -3.332,1.931 -4.8,3.4 -0.2,0.2 -0.383,0.417 -0.55,0.65 -0.062,0.066 -0.12,0.133 -0.175,0.2 -1.904,2.117 -3.179,4.5 -3.825,7.15 -0.333,1.4 -0.5,2.85 -0.5,4.35 0,3.525 0.908,6.667 2.725,9.425 0.656,0.989 1.431,1.931 2.325,2.825 1.517,1.517 3.167,2.7 4.95,3.55 2.253,1.067 4.72,1.6 7.4,1.6 2.109,0 4.084,-0.325 5.925,-0.975 1.599,2.163 3.333,4.271 5.2,6.325 0.039,-0.053 0.081,-0.103 0.125,-0.15 -0.357,0.478 -0.708,0.961 -1.05,1.45 -0.7,1 -1.35,2 -1.95,3 -1.6,2.434 -3.083,4.967 -4.45,7.601 -0.016,0.033 -0.033,0.066 -0.05,0.1 -1.014,2.101 -1.964,4.217 -2.85,6.35 -0.633,1.601 -1.216,3.233 -1.75,4.9 -2.267,6.967 -3.683,14.384 -4.25,22.25 -1.522,21.336 3.803,40.428 15.975,57.274 z m 160.5,-160.05 -25.851,25.775 c 1.307,-5.716 1.966,-11.699 1.976,-17.95 -0.018,-11.181 -2.109,-21.498 -6.275,-30.95 10.682,6.175 20.731,13.884 30.15,23.125 z m -100.075,59.4 c -0.057,-0.069 -0.115,-0.136 -0.175,-0.2 0.254,0.176 0.504,0.359 0.75,0.55 -0.19,-0.121 -0.381,-0.238 -0.575,-0.35 z"
+ id="path14"
+ inkscape:connector-curvature="0"
+ style="fill:#94c061;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 433,487.2 c -3.879,2.285 -7.846,4.368 -11.9,6.25 -0.533,0.2 -1.033,0.416 -1.5,0.649 -17.453,7.864 -36.47,11.956 -57.05,12.275 -0.523,0.01 -1.049,0.019 -1.575,0.025 L 309.9,425.325 c 0.931,0.984 1.873,1.943 2.825,2.875 2.176,2.226 4.417,4.309 6.725,6.25 2.767,2.366 5.684,4.533 8.75,6.5 10.033,6.566 21.25,10.816 33.649,12.75 0.101,0 0.233,0 0.4,0 5.441,-0.049 10.25,-0.207 14.425,-0.476 1.525,-0.091 2.968,-0.199 4.325,-0.324 5.1,-0.467 10.3,-1.184 15.6,-2.15 l 1.4,1.4 v 0.699 c 0.2,-0.03 0.399,-0.063 0.6,-0.1 L 433,487.2 z"
+ id="path16"
+ inkscape:connector-curvature="0"
+ style="fill:#6c983d;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 414.8,207.875 c -14.804,-14.35 -32.604,-21.525 -53.399,-21.525 -21.301,0 -39.467,7.5 -54.5,22.5 -3.536,3.543 -6.652,7.26 -9.35,11.15 -2.247,3.233 -4.206,6.583 -5.875,10.05 -0.465,0.25 -0.931,0.5 -1.4,0.75 l -1.225,0.675 c -0.406,0.246 -0.815,0.487 -1.225,0.725 v -0.025 c 3.759,-9.244 9.451,-17.686 17.075,-25.325 15.042,-15.012 33.208,-22.521 54.5,-22.525 21.259,0.003 39.392,7.512 54.399,22.525 0.337,0.337 0.67,0.678 1,1.025 z m -6.1,6.075 c 0.331,0.331 0.664,0.665 1,1 3.316,3.316 6.225,6.799 8.725,10.45 7.55,11.081 11.325,23.714 11.325,37.9 0,10.513 -2.066,20.171 -6.2,28.975 -0.072,0.155 -0.147,0.314 -0.225,0.475 -0.525,1.09 -1.084,2.165 -1.675,3.225 -3.098,5.593 -7.081,10.818 -11.95,15.675 -4.908,4.92 -10.191,8.937 -15.851,12.05 -5.304,2.91 -10.937,5.027 -16.899,6.35 -1.729,0.384 -3.486,0.7 -5.275,0.95 -0.607,0.085 -1.216,0.16 -1.825,0.225 -2.757,0.317 -5.573,0.476 -8.449,0.476 -10.305,0 -19.788,-1.983 -28.45,-5.95 -2.097,-0.97 -4.146,-2.053 -6.15,-3.25 l -0.325,0.55 c -0.111,0.182 -0.22,0.365 -0.324,0.55 0.322,-0.596 0.673,-1.18 1.05,-1.75 2.078,1.124 4.203,2.124 6.375,3 7.946,3.219 16.555,4.827 25.825,4.825 3.518,0 6.942,-0.232 10.274,-0.7 0.526,-0.073 1.052,-0.156 1.575,-0.25 1.565,-0.254 3.106,-0.562 4.625,-0.925 11.948,-2.813 22.557,-8.863 31.825,-18.15 5.637,-5.626 10.078,-11.743 13.325,-18.35 0.096,-0.186 0.188,-0.369 0.274,-0.55 4.285,-8.926 6.427,-18.742 6.425,-29.45 0.002,-13.51 -3.414,-25.61 -10.25,-36.3 -2.478,-3.868 -5.403,-7.551 -8.775,-11.051 z M 295,303.85 c -6.065,-8.954 -9.948,-18.82 -11.65,-29.6 0.117,-0.05 0.233,-0.1 0.35,-0.15 0.426,-0.203 0.859,-0.386 1.3,-0.55 1.337,10.945 4.862,20.97 10.575,30.075 0.549,0.882 1.115,1.757 1.7,2.625 0.852,1.233 1.744,2.45 2.675,3.65 0.707,0.909 1.44,1.809 2.2,2.7 -0.044,0.047 -0.086,0.097 -0.125,0.15 -1.867,-2.054 -3.601,-4.163 -5.2,-6.325 -0.628,-0.85 -1.237,-1.708 -1.825,-2.575 z"
+ id="path18"
+ inkscape:connector-curvature="0"
+ style="fill:#e2e2e2;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 305.575,223.6 c -4.743,1.884 -9.376,4.034 -13.9,6.45 1.669,-3.466 3.628,-6.816 5.875,-10.05 2.698,-3.89 5.814,-7.606 9.35,-11.15 15.034,-15 33.2,-22.5 54.5,-22.5 20.796,0 38.596,7.175 53.399,21.525 0.335,0.318 0.668,0.643 1,0.975 7.129,7.129 12.571,14.962 16.325,23.5 4.166,9.452 6.258,19.769 6.275,30.95 -0.01,6.251 -0.669,12.234 -1.976,17.95 -1.312,5.765 -3.286,11.257 -5.925,16.475 -0.037,0.074 -0.07,0.148 -0.1,0.225 -3.637,7.117 -8.504,13.716 -14.601,19.8 -10.662,10.686 -22.903,17.577 -36.725,20.675 -0.104,0.029 -0.203,0.054 -0.3,0.075 -2.47,0.547 -4.986,0.972 -7.551,1.275 -0.869,0.103 -1.744,0.194 -2.625,0.274 -2.357,0.196 -4.758,0.297 -7.199,0.3 -11.567,-0.018 -22.209,-2.251 -31.926,-6.699 -1.929,-0.879 -3.821,-1.846 -5.675,-2.9 0.047,-0.277 0.098,-0.552 0.15,-0.825 0.015,-0.092 0.031,-0.184 0.05,-0.274 0.173,-0.857 0.39,-1.69 0.65,-2.5 0.388,-1.194 0.871,-2.336 1.449,-3.426 l 0.051,-0.125 c 0.104,-0.185 0.213,-0.368 0.324,-0.55 l 0.325,-0.55 c 2.004,1.197 4.054,2.28 6.15,3.25 8.662,3.967 18.146,5.95 28.45,5.95 2.876,0 5.692,-0.158 8.449,-0.476 0.609,-0.064 1.218,-0.14 1.825,-0.225 1.789,-0.25 3.547,-0.566 5.275,-0.95 5.963,-1.322 11.596,-3.439 16.899,-6.35 5.659,-3.113 10.942,-7.13 15.851,-12.05 4.869,-4.857 8.853,-10.082 11.95,-15.675 0.591,-1.061 1.149,-2.135 1.675,-3.225 0.077,-0.161 0.152,-0.32 0.225,-0.475 4.134,-8.804 6.2,-18.462 6.2,-28.975 0,-14.186 -3.775,-26.819 -11.325,-37.9 -2.5,-3.65 -5.408,-7.134 -8.725,-10.45 -0.336,-0.335 -0.669,-0.669 -1,-1 -13.142,-12.666 -28.908,-18.983 -47.3,-18.95 -18.9,-0.033 -35.034,6.617 -48.4,19.95 -2.754,2.768 -5.228,5.651 -7.419,8.651 z m 115.775,211.8 -3.1,2.449 c -0.2,0.134 -0.366,0.25 -0.5,0.351 -0.267,0.2 -0.517,0.366 -0.75,0.5 -1.134,0.733 -2.267,1.467 -3.4,2.2 -0.1,0.033 -0.183,0.083 -0.25,0.149 l 65.601,65.75 c 0.133,0.134 0.316,0.316 0.55,0.55 l 1.1,1.101 c 1.4,1.366 3.067,2.05 5,2.05 1.634,-0.066 3.051,-0.55 4.25,-1.45 0.301,-0.166 0.551,-0.383 0.75,-0.649 0.233,-0.167 1.25,0.399 3.051,1.699 1.767,1.334 5.116,4.817 10.05,10.45 4.866,5.533 11.833,9.533 20.899,12 -5.933,1 -14.783,1.7 -26.55,2.101 -11.121,0.349 -19.721,-2.201 -25.8,-7.65 -1.462,-1.316 -2.778,-2.8 -3.95,-4.45 l -20.1,-20.1 h 0.05 L 433,487.2 l -34.4,-34.45 -0.6,-0.6 -1.4,-1.4 c -5.3,0.967 -10.5,1.684 -15.6,2.15 -1.357,0.125 -2.8,0.233 -4.325,0.324 l 33.95,-33.925 c 0.542,0.528 1.075,1.045 1.6,1.55 4.902,4.798 8.96,8.848 12.176,12.15 -0.167,0.066 -0.284,0.167 -0.351,0.3 -0.899,0.733 -1.767,1.45 -2.6,2.15 l -0.1,-0.049 z M 302.15,312.6 c -0.759,-0.891 -1.493,-1.791 -2.2,-2.7 -0.932,-1.2 -1.823,-2.417 -2.675,-3.65 -0.584,-0.868 -1.151,-1.743 -1.7,-2.625 -5.713,-9.105 -9.238,-19.13 -10.575,-30.075 l 2.2,-0.6 c 0.244,-0.06 0.494,-0.109 0.75,-0.15 H 288 c 0.633,-0.1 1.283,-0.15 1.95,-0.15 0.3,-0.066 0.617,-0.1 0.95,-0.1 0.434,0 0.867,0.034 1.3,0.1 0.501,0 0.968,0.05 1.4,0.15 h 0.025 c 0.946,7.487 3.054,14.487 6.325,21 0.793,1.581 1.651,3.131 2.575,4.65 0.569,0.929 1.161,1.845 1.775,2.75 1.07,1.567 2.211,3.101 3.425,4.6 -0.236,0.257 -0.469,0.515 -0.7,0.775 l -4.875,6.025 z"
+ id="path20"
+ inkscape:connector-curvature="0"
+ style="fill:#d3d3d3;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 309.9,425.325 c -0.893,-0.95 -1.776,-1.926 -2.65,-2.925 -1.955,-2.252 -3.78,-4.544 -5.475,-6.875 -12.172,-16.847 -17.497,-35.938 -15.975,-57.275 0.567,-7.866 1.983,-15.283 4.25,-22.25 0.534,-1.667 1.117,-3.3 1.75,-4.9 0.886,-2.133 1.836,-4.249 2.85,-6.35 0.017,-0.033 0.034,-0.066 0.05,-0.1 1.367,-2.634 2.85,-5.167 4.45,-7.601 0.6,-1 1.25,-2 1.95,-3 0.342,-0.488 0.692,-0.972 1.05,-1.45 l 4.875,-6.025 c 0.231,-0.26 0.464,-0.519 0.7,-0.775 1.816,-1.997 3.75,-3.931 5.8,-5.8 0.519,-0.471 1.044,-0.938 1.574,-1.4 0.167,-0.167 0.317,-0.3 0.45,-0.4 0.033,-0.1 0.101,-0.184 0.2,-0.25 3.934,-3.4 8.017,-6.383 12.25,-8.95 15.366,-9.367 32.533,-13.417 51.5,-12.15 h 0.05 c 0.601,0.033 3.55,0.4 8.851,1.1 0.1,0 0.25,0.017 0.449,0.05 1.534,0.267 3.017,0.567 4.45,0.9 0.2,0.033 0.417,0.083 0.65,0.15 9.905,2.289 19.021,6.189 27.35,11.7 -0.087,0.181 -0.179,0.364 -0.274,0.55 -7.707,-4.751 -16.065,-8.167 -25.075,-10.25 -0.233,-0.066 -0.45,-0.117 -0.65,-0.15 -1.434,-0.333 -2.916,-0.633 -4.45,-0.9 -0.199,-0.033 -0.35,-0.05 -0.449,-0.05 -5.301,-0.7 -8.25,-1.067 -8.851,-1.1 h -0.05 c -18.98,-1.281 -36.146,2.769 -51.5,12.15 -4.22,2.58 -8.303,5.563 -12.25,8.95 -0.1,0.066 -0.167,0.15 -0.2,0.25 -0.133,0.1 -0.283,0.233 -0.45,0.4 -5.433,4.733 -10.1,9.883 -14,15.45 -0.7,1 -1.35,2 -1.95,3 -1.6,2.434 -3.083,4.967 -4.45,7.601 -1.034,2.133 -2,4.283 -2.9,6.449 -0.634,1.608 -1.217,3.242 -1.75,4.9 -2.268,6.971 -3.685,14.388 -4.25,22.25 -1.451,20.351 3.324,38.659 14.325,54.925 2.144,3.148 4.519,6.224 7.125,9.226 0.08,0.091 0.163,0.183 0.25,0.274 1.057,1.209 2.132,2.384 3.225,3.525 -0.952,-0.93 -1.894,-1.889 -2.825,-2.874 z M 363.8,316.05 c 0.185,0.165 0.368,0.332 0.55,0.5 2.034,1.934 3.551,4.05 4.551,6.351 0.1,0.199 0.199,0.383 0.3,0.55 0.91,1.683 1.594,3.44 2.05,5.274 -0.523,0.094 -1.049,0.177 -1.575,0.25 -0.054,-0.359 -0.112,-0.718 -0.175,-1.074 -0.434,-2.267 -1.2,-4.417 -2.3,-6.45 -0.101,-0.167 -0.2,-0.351 -0.3,-0.55 -0.748,-1.718 -1.781,-3.335 -3.101,-4.851 z m -33.9,34.85 c 0.853,0.762 1.744,1.445 2.675,2.05 3.235,2.124 6.943,3.324 11.125,3.6 h 0.25 c 0.166,0 0.316,0.033 0.45,0.101 0.1,0 0.199,0 0.3,0 0.1,0 0.2,0 0.3,0 0.1,0 0.2,0 0.3,0 1.066,0 2.101,-0.051 3.101,-0.15 0.233,-0.066 0.483,-0.1 0.75,-0.1 L 352,355.8 c 2.5,-0.633 4.967,-1.85 7.4,-3.649 0.1,-0.101 0.199,-0.167 0.3,-0.2 0.434,-0.367 0.866,-0.733 1.3,-1.101 0.033,-0.066 0.1,-0.116 0.2,-0.149 0,-0.066 0.05,-0.117 0.149,-0.15 0.101,-0.133 0.184,-0.217 0.25,-0.25 3.351,-2.926 5.684,-6.342 7,-10.25 0.881,-0.08 1.756,-0.172 2.625,-0.274 -1.101,4.872 -3.643,9.047 -7.625,12.524 -0.066,0.033 -0.149,0.117 -0.25,0.25 -0.1,0.033 -0.149,0.084 -0.149,0.15 -0.101,0.033 -0.167,0.083 -0.2,0.149 -0.434,0.367 -0.866,0.733 -1.3,1.101 -0.101,0.033 -0.2,0.1 -0.3,0.2 -2.434,1.8 -4.9,3.017 -7.4,3.649 l -2.85,0.601 c -0.267,0 -0.517,0.033 -0.75,0.1 -1,0.1 -2.034,0.15 -3.101,0.15 -0.1,0 -0.2,0 -0.3,0 -0.1,0 -0.2,0 -0.3,0 -0.101,0 -0.2,0 -0.3,0 -0.134,-0.067 -0.284,-0.101 -0.45,-0.101 h -0.25 c -5.009,-0.33 -9.343,-1.98 -13,-4.95 -0.979,-0.805 -1.912,-1.705 -2.799,-2.7 z m 100.6,-53.175 c 1.706,1.48 3.372,3.038 5,4.675 0.208,0.212 0.416,0.429 0.625,0.65 -1.864,-1.801 -3.772,-3.501 -5.725,-5.1 0.03,-0.076 0.063,-0.151 0.1,-0.225 z"
+ id="path22"
+ inkscape:connector-curvature="0"
+ style="fill:#b6b6b6;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 462.475,367.475 -51.85,51.825 -33.95,33.925 c -4.175,0.269 -8.983,0.427 -14.425,0.476 -0.167,0 -0.3,0 -0.4,0 -12.399,-1.934 -23.616,-6.184 -33.649,-12.75 -3.066,-1.967 -5.983,-4.134 -8.75,-6.5 -2.308,-1.941 -4.549,-4.024 -6.725,-6.25 -1.093,-1.142 -2.168,-2.316 -3.225,-3.525 -0.087,-0.092 -0.17,-0.184 -0.25,-0.274 -2.606,-3.002 -4.981,-6.077 -7.125,-9.226 -11.001,-16.266 -15.776,-34.574 -14.325,-54.925 0.565,-7.862 1.982,-15.279 4.25,-22.25 0.533,-1.658 1.116,-3.292 1.75,-4.9 0.9,-2.166 1.867,-4.316 2.9,-6.449 1.367,-2.634 2.85,-5.167 4.45,-7.601 0.6,-1 1.25,-2 1.95,-3 3.9,-5.566 8.566,-10.716 14,-15.45 0.167,-0.167 0.317,-0.3 0.45,-0.4 0.033,-0.1 0.101,-0.184 0.2,-0.25 3.947,-3.387 8.03,-6.37 12.25,-8.95 15.354,-9.381 32.52,-13.431 51.5,-12.15 h 0.05 c 0.601,0.033 3.55,0.4 8.851,1.1 0.1,0 0.25,0.017 0.449,0.05 1.534,0.267 3.017,0.567 4.45,0.9 0.2,0.033 0.417,0.083 0.65,0.15 9.01,2.083 17.368,5.499 25.075,10.25 -3.247,6.607 -7.688,12.724 -13.325,18.35 -9.269,9.287 -19.877,15.336 -31.825,18.15 -1.519,0.363 -3.06,0.671 -4.625,0.925 -0.456,-1.834 -1.14,-3.592 -2.05,-5.274 -0.101,-0.167 -0.2,-0.351 -0.3,-0.55 -1,-2.301 -2.517,-4.417 -4.551,-6.351 -0.182,-0.168 -0.365,-0.335 -0.55,-0.5 -0.334,-0.288 -0.676,-0.563 -1.024,-0.825 -0.246,-0.19 -0.496,-0.374 -0.75,-0.55 -3.474,-2.444 -7.615,-3.87 -12.426,-4.275 -2.301,-0.139 -4.501,0.011 -6.6,0.45 -3.92,0.822 -7.487,2.656 -10.7,5.5 -0.233,0.167 -0.45,0.351 -0.649,0.551 -1.766,1.505 -3.249,3.154 -4.45,4.949 -0.377,0.57 -0.728,1.154 -1.05,1.75 l -0.051,0.125 c -0.578,1.09 -1.062,2.231 -1.449,3.426 -0.261,0.81 -0.478,1.643 -0.65,2.5 -0.019,0.091 -0.035,0.183 -0.05,0.274 -0.053,0.273 -0.104,0.548 -0.15,0.825 -0.114,0.75 -0.198,1.517 -0.25,2.3 0,0.033 0,0.084 0,0.15 -0.09,1.646 -0.04,3.246 0.15,4.8 0.082,0.744 0.199,1.478 0.35,2.2 0.834,3.666 2.601,7.066 5.3,10.2 0.018,0.016 0.034,0.032 0.051,0.05 h 0.1 c 0.133,0.155 0.266,0.306 0.4,0.45 0.887,0.994 1.819,1.895 2.8,2.699 3.657,2.97 7.991,4.62 13,4.95 h 0.25 c 0.166,0 0.316,0.033 0.45,0.101 0.1,0 0.199,0 0.3,0 0.1,0 0.2,0 0.3,0 0.1,0 0.2,0 0.3,0 1.066,0 2.101,-0.051 3.101,-0.15 0.233,-0.066 0.483,-0.1 0.75,-0.1 L 354,357.8 c 2.5,-0.633 4.967,-1.85 7.4,-3.649 0.1,-0.101 0.199,-0.167 0.3,-0.2 0.434,-0.367 0.866,-0.733 1.3,-1.101 0.033,-0.066 0.1,-0.116 0.2,-0.149 0,-0.066 0.05,-0.117 0.149,-0.15 0.101,-0.133 0.184,-0.217 0.25,-0.25 3.982,-3.478 6.524,-7.652 7.625,-12.524 2.564,-0.304 5.081,-0.729 7.551,-1.275 0.097,-0.021 0.196,-0.046 0.3,-0.075 13.821,-3.098 26.063,-9.989 36.725,-20.675 6.097,-6.083 10.964,-12.683 14.601,-19.8 1.952,1.598 3.86,3.298 5.725,5.1 0.461,0.441 0.919,0.892 1.375,1.35 1.5,1.533 2.983,3.15 4.45,4.85 1.399,1.667 2.767,3.35 4.1,5.05 7.5,9.934 12.584,20.617 15.25,32.05 0.566,2.601 1.05,5.217 1.45,7.851 0.033,0.467 0.033,0.883 0,1.25 0.284,3.789 0.192,7.798 -0.276,12.022 z"
+ id="path24"
+ inkscape:connector-curvature="0"
+ style="fill:#a3a3a3;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 474.175,453.9 h -0.024 v 0.05 c -0.367,0.066 -0.75,0.033 -1.15,-0.101 -0.192,-0.096 -0.359,-0.229 -0.5,-0.399 -0.115,-0.131 -0.216,-0.281 -0.3,-0.45 v -0.15 c -0.134,-0.333 -0.134,-0.683 0,-1.05 l -0.05,0.101 6.949,-25.551 c 0.101,-0.399 0.051,-0.816 -0.149,-1.25 -0.167,-0.366 -0.417,-0.683 -0.75,-0.949 -0.134,-0.034 -8.167,-8.784 -24.101,-26.25 1.967,-3.834 4.051,-10.117 6.25,-18.851 0.32,-1.295 0.612,-2.57 0.875,-3.825 -0.005,1.095 -0.005,2.328 0,3.7 0.032,6.125 -1.677,13.117 -5.125,20.976 15.934,17.466 23.967,26.216 24.101,26.25 0.333,0.267 0.583,0.583 0.75,0.949 0.2,0.434 0.25,0.851 0.149,1.25 l -5.975,21.976 -0.975,3.575 0.05,-0.101 c -0.012,0.032 -0.02,0.065 -0.025,0.1 z m 53.775,19.45 c 6.564,5.904 9.681,14.588 9.35,26.051 -0.467,13.733 -1.383,23.517 -2.75,29.35 -0.233,1.167 -0.767,2.25 -1.6,3.25 l -0.15,0.3 c -0.333,0.233 -0.649,0.45 -0.95,0.65 -0.8,0.533 -1.666,0.866 -2.6,1 -0.8,0.2 -1.684,0.399 -2.65,0.6 -5.933,1 -14.783,1.7 -26.55,2.101 -12.402,0.389 -21.669,-2.827 -27.8,-9.65 6.079,5.449 14.679,7.999 25.8,7.65 11.767,-0.4 20.617,-1.101 26.55,-2.101 0.967,-0.2 1.851,-0.399 2.65,-0.6 0.934,-0.134 1.8,-0.467 2.6,-1 0.301,-0.2 0.617,-0.417 0.95,-0.65 l 0.15,-0.3 c 0.833,-1 1.366,-2.083 1.6,-3.25 1.367,-5.833 2.283,-15.616 2.75,-29.35 0.296,-10.23 -2.154,-18.247 -7.35,-24.051 z m -31.125,3.225 c -0.357,0.039 -0.698,0.014 -1.025,-0.075 -0.333,-0.2 -0.6,-0.467 -0.8,-0.8 -0.066,-0.066 -0.1,-0.15 -0.1,-0.25 -0.134,-0.334 -0.15,-0.667 -0.051,-1 l 0.051,-0.05 6.75,-25.051 c 0.1,-0.433 0.083,-0.85 -0.051,-1.25 1.423,1.927 2.105,3.01 2.051,3.25 l -6.75,25.051 -0.051,0.05 c -0.011,0.039 -0.019,0.081 -0.024,0.125 z M 398.6,452.75 c -0.2,0.036 -0.399,0.069 -0.6,0.1 v -0.699 l 0.6,0.599 z"
+ id="path26"
+ inkscape:connector-curvature="0"
+ style="fill:#8f8f8f;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 410.625,419.3 51.85,-51.825 c -0.286,2.505 -0.703,5.089 -1.25,7.75 -0.263,1.255 -0.555,2.53 -0.875,3.825 -2.199,8.733 -4.283,15.017 -6.25,18.851 15.934,17.466 23.967,26.216 24.101,26.25 0.333,0.267 0.583,0.583 0.75,0.949 0.2,0.434 0.25,0.851 0.149,1.25 l -6.95,25.55 0.05,-0.101 c -0.134,0.367 -0.134,0.717 0,1.05 V 453 c 0.084,0.169 0.185,0.319 0.3,0.45 0.141,0.17 0.308,0.304 0.5,0.399 0.4,0.134 0.783,0.167 1.15,0.101 v -0.05 h 0.024 l 25.325,-6.65 c 0.434,-0.233 0.833,-0.217 1.2,0.05 0.333,0.167 0.633,0.434 0.899,0.8 0.134,0.4 0.15,0.817 0.051,1.25 l -6.749,25.05 -0.051,0.05 c -0.1,0.333 -0.083,0.666 0.051,1 0,0.1 0.033,0.184 0.1,0.25 0.2,0.333 0.467,0.6 0.8,0.8 0.327,0.089 0.668,0.114 1.025,0.075 0.039,-0.01 0.081,-0.018 0.125,-0.025 v 0.101 l 0.1,-0.101 26.65,-7 c 1.576,1.142 2.992,2.408 4.25,3.8 5.195,5.805 7.646,13.821 7.35,24.051 -0.467,13.733 -1.383,23.517 -2.75,29.35 -0.233,1.167 -0.767,2.25 -1.6,3.25 l -0.15,0.3 c -0.333,0.233 -0.649,0.45 -0.95,0.65 -0.8,0.533 -1.666,0.866 -2.6,1 -0.8,0.2 -1.684,0.399 -2.65,0.6 -21.5,-21.6 -32.816,-32.934 -33.949,-34 L 430.55,438.2 c -0.2,-0.101 -0.366,-0.233 -0.5,-0.4 l -5.2,-5.25 -0.149,0.15 c -0.101,0.066 -0.2,0.166 -0.3,0.3 -3.216,-3.303 -7.273,-7.353 -12.176,-12.15 -0.525,-0.505 -1.058,-1.022 -1.6,-1.55 z m 10.725,16.1 0.101,0.05 h -0.101 v -0.05 z"
+ id="path28"
+ inkscape:connector-curvature="0"
+ style="fill:#dbdbdb;fill-rule:evenodd" />
+ <path
+ clip-rule="evenodd"
+ d="m 421.35,435.4 v 0.05 h 0.101 c 0.833,-0.7 1.7,-1.417 2.6,-2.15 0.066,-0.133 0.184,-0.233 0.351,-0.3 0.1,-0.134 0.199,-0.233 0.3,-0.3 l 0.149,-0.15 5.2,5.25 c 0.134,0.167 0.3,0.3 0.5,0.4 l 60.101,60.35 c 1.133,1.066 12.449,12.4 33.949,34 -9.066,-2.467 -16.033,-6.467 -20.899,-12 -4.934,-5.633 -8.283,-9.116 -10.05,-10.45 -1.801,-1.3 -2.817,-1.866 -3.051,-1.699 -0.199,0.267 -0.449,0.483 -0.75,0.649 -1.199,0.9 -2.616,1.384 -4.25,1.45 -1.933,0 -3.6,-0.684 -5,-2.05 l -1.1,-1.101 c -0.233,-0.233 -0.417,-0.416 -0.55,-0.55 l -65.601,-65.75 c 0.067,-0.066 0.15,-0.116 0.25,-0.149 1.134,-0.733 2.267,-1.467 3.4,-2.2 0.233,-0.134 0.483,-0.3 0.75,-0.5 0.134,-0.101 0.3,-0.217 0.5,-0.351 l 3.1,-2.449 z"
+ id="path30"
+ inkscape:connector-curvature="0"
+ style="fill:#c8c8c8;fill-rule:evenodd" />
+ </g>
+ </g>
</g>
</svg>
diff --git a/Graphics/screenshots/device-2015-05-06-140816.png b/Graphics/screenshots/device-2015-05-06-140816.png
new file mode 100644
index 000000000..705287dd8
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-140816.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-141500.png b/Graphics/screenshots/device-2015-05-06-141500.png
new file mode 100644
index 000000000..930e61c64
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-141500.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-141508.png b/Graphics/screenshots/device-2015-05-06-141508.png
new file mode 100644
index 000000000..e00002fb3
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-141508.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-141517.png b/Graphics/screenshots/device-2015-05-06-141517.png
new file mode 100644
index 000000000..786c6e977
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-141517.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-141527.png b/Graphics/screenshots/device-2015-05-06-141527.png
new file mode 100644
index 000000000..103fc8186
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-141527.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-141552.png b/Graphics/screenshots/device-2015-05-06-141552.png
new file mode 100644
index 000000000..b4bd1ccd0
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-141552.png
Binary files differ
diff --git a/Graphics/screenshots/device-2015-05-06-142026.png b/Graphics/screenshots/device-2015-05-06-142026.png
new file mode 100644
index 000000000..9b36c9ba4
--- /dev/null
+++ b/Graphics/screenshots/device-2015-05-06-142026.png
Binary files differ
diff --git a/OpenKeychain-Test/build.gradle b/OpenKeychain-Test/build.gradle
index 1c87fcb4d..2bf35b3d1 100644
--- a/OpenKeychain-Test/build.gradle
+++ b/OpenKeychain-Test/build.gradle
@@ -17,7 +17,8 @@ dependencies {
testCompile 'junit:junit:4.11'
testCompile 'com.google.android:android:4.1.1.4'
testCompile('com.squareup:fest-android:1.0.8') { exclude module: 'support-v4' }
- testCompile ('org.robolectric:robolectric:2.3') {
+ testCompile 'org.apache.maven:maven-ant-tasks:2.1.3'
+ testCompile ('org.robolectric:robolectric:2.4') {
exclude module: 'classworlds'
exclude module: 'maven-artifact'
exclude module: 'maven-artifact-manager'
diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle
index 0cc09d663..48fc38ca7 100644
--- a/OpenKeychain/build.gradle
+++ b/OpenKeychain/build.gradle
@@ -6,11 +6,23 @@ dependencies {
// NOTE: libraries are pinned to a specific build, see below
// from local Android SDK
- compile 'com.android.support:support-v4:22.1.0'
- compile 'com.android.support:appcompat-v7:22.1.0'
+ compile 'com.android.support:support-v4:22.1.1'
+ compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:recyclerview-v7:22.1.0'
compile 'com.android.support:cardview-v7:22.1.0'
+ // UI testing libs
+ androidTestCompile 'com.android.support.test:runner:0.2'
+ androidTestCompile 'com.android.support.test:rules:0.2'
+ androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
+ androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.1'
+
+ // Temporary workaround for bug: https://code.google.com/p/android-test-kit/issues/detail?id=136
+ // from https://github.com/googlesamples/android-testing/blob/master/build.gradle#L21
+ configurations.all {
+ resolutionStrategy.force 'com.android.support:support-annotations:22.1.1'
+ }
+
// JCenter etc.
compile 'com.eftimoff:android-patternview:1.0.1@aar'
compile 'com.journeyapps:zxing-android-embedded:2.3.0@aar'
@@ -23,16 +35,17 @@ dependencies {
compile "com.splitwise:tokenautocomplete:1.3.3@aar"
compile 'se.emilsjolander:stickylistheaders:2.6.0'
compile 'org.sufficientlysecure:html-textview:1.1'
- compile 'com.mikepenz.materialdrawer:library:2.7.9@aar'
+ compile 'com.mikepenz.materialdrawer:library:2.8.2@aar'
compile 'com.mikepenz.iconics:library:0.9.1@aar'
compile 'com.mikepenz.iconics:octicons-typeface:2.2.0@aar'
compile 'com.mikepenz.iconics:meteocons-typeface:1.1.1@aar'
compile 'com.mikepenz.iconics:community-material-typeface:1.0.0@aar'
compile 'org.thoughtcrime.ssl.pinning:AndroidPinning:1.0.0'
+ compile 'com.nispok:snackbar:2.10.8'
// libs as submodules
- compile project(':extern:openpgp-api-lib')
- compile project(':extern:openkeychain-api-lib')
+ compile project(':extern:openpgp-api-lib:openpgp-api')
+ compile project(':extern:openkeychain-api-lib:openkeychain-intents')
compile project(':extern:spongycastle:core')
compile project(':extern:spongycastle:pg')
compile project(':extern:spongycastle:pkix')
@@ -40,15 +53,14 @@ dependencies {
compile project(':extern:minidns')
compile project(':extern:KeybaseLib:Lib')
compile project(':extern:safeslinger-exchange')
- compile project(':extern:snackbar:lib')
}
// Output of ./gradlew -q calculateChecksums
// Comment out the libs referenced as git submodules!
dependencyVerification {
verify = [
- 'com.android.support:support-v4:74cb322740317b11a785eee1a94969426fade946123c4ae3f471276adaaaf54b',
- 'com.android.support:appcompat-v7:6cc7fc2df4be0676f78ecfc5d3cda388e59890d11308811944f54efd84b047b7',
+ 'com.android.support:support-v4:1e2e4d35ac7fd30db5ce3bc177b92e4d5af86acef2ef93e9221599d733346f56',
+ 'com.android.support:appcompat-v7:9a2355537c2f01cf0b95523605c18606b8d824017e6e94a05c77b0cfc8f21c96',
'com.android.support:recyclerview-v7:522d323079a29bcd76173bd9bc7535223b4af3e5eefef9d9287df1f9e54d0c10',
'com.android.support:cardview-v7:8dc99af71fec000baa4470c3907755264f15f816920861bc015b2babdbb49807',
'com.eftimoff:android-patternview:cec80e7265b8d8278b3c55b5fcdf551e4600ac2c8bf60d8dd76adca538af0b1e',
@@ -61,11 +73,12 @@ dependencyVerification {
'com.splitwise:tokenautocomplete:20bee71cc59b3828eb000b684d46ddf738efd56b8fee453a509cd16fda42c8cb',
'se.emilsjolander:stickylistheaders:8c05981ec5725be33f7cee5e68c13f3db49cd5c75f1aaeb04024920b1ef96ad4',
'org.sufficientlysecure:html-textview:ca24b1522be88378634093815ce9ff1b4920c72e7513a045a7846e14069ef988',
- 'com.mikepenz.materialdrawer:library:3ef80c6e1ca1b29cfcbb27fa7927c02b2246e068c17fe52283703c4897449923',
+ 'com.mikepenz.materialdrawer:library:970317ed1a3cb96317f7b8d62ff592b3103eb46dfd68d9b244e7143623dc6d7a',
'com.mikepenz.iconics:library:4698a36ee4c2af765d0a85779c61474d755b90d66a59020105b6760a8a909e9e',
'com.mikepenz.iconics:octicons-typeface:67ed7d456a9ce5f5307b85f955797bfb3dd674e2f6defb31c6b8bbe2ede290be',
'com.mikepenz.iconics:meteocons-typeface:39a8a9e70cd8287cdb119af57a672a41dd09240dba6697f5a0dbda1ccc33298b',
'com.mikepenz.iconics:community-material-typeface:f1c5afee5f0f10d66beb3ed0df977246a02a9c46de4e05d7c0264bcde53b6b7f',
+ 'com.nispok:snackbar:80bebc8e5d8b3d728cd5f2336e2d0c1cc2a6b7dc4b55d36acd6b75a78265590a',
// 'OpenKeychain.extern:openpgp-api-lib:f05a9215cdad3a6597e4c5ece6fcec92b178d218195a3e88d2c0937c48dd9580',
// 'OpenKeychain.extern:openkeychain-api-lib:50f6ebb5452d3fdc7be137ccf857a0ff44d55539fcb7b91baef495766ed7f429',
// 'com.madgag.spongycastle:core:df8fcc028a95ac5ffab3b78c9163f5cfa672e41cd50128ca55d458b6cfbacf4b',
@@ -76,7 +89,7 @@ dependencyVerification {
// 'OpenKeychain.extern.KeybaseLib:Lib:c91cda4a75692d8664644cd17d8ac962ce5bc0e266ea26673a639805f1eccbdf',
// 'OpenKeychain.extern:safeslinger-exchange:d222721bb35408daaab9f46449364b2657112705ee571d7532f81cbeb9c4a73f',
// 'OpenKeychain.extern.snackbar:lib:52357426e5275412e2063bdf6f0e6b957a3ea74da45e0aef35d22d9afc542e23',
- 'com.android.support:support-annotations:9c59286413a2bb93e199c73261e58d5af32da7ae0a12cbd075f581a5de1fb446',
+ 'com.android.support:support-annotations:7bc07519aa613b186001160403bcfd68260fa82c61cc7e83adeedc9b862b94ae',
]
}
@@ -87,12 +100,21 @@ android {
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
/*
* To sign release build, create file gradle.properties in ~/.gradle/ with this content:
@@ -137,6 +159,10 @@ android {
dexOptions {
preDexLibraries = false
}
+
+ packagingOptions {
+ exclude 'LICENSE.txt'
+ }
}
// NOTE: This disables Lint!
diff --git a/OpenKeychain/proguard-rules.pro b/OpenKeychain/proguard-rules.pro
new file mode 100644
index 000000000..533cae706
--- /dev/null
+++ b/OpenKeychain/proguard-rules.pro
@@ -0,0 +1,27 @@
+# Add project specific ProGuard rules here.
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+
+# Workaround for Samsung Android 4.2 bug
+# https://code.google.com/p/android/issues/detail?id=78377
+# https://code.google.com/p/android/issues/detail?id=78377#c188
+-keepattributes **
+-keep class !android.support.v7.internal.view.menu.**,** {*;}
+-dontpreverify
+-dontoptimize
+-dontshrink
+-dontwarn **
+-dontnote ** \ No newline at end of file
diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/CreateKeyActivityTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/CreateKeyActivityTest.java
new file mode 100644
index 000000000..c3741fdef
--- /dev/null
+++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/CreateKeyActivityTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain;
+
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.action.ViewActions.swipeLeft;
+import static android.support.test.espresso.action.ViewActions.typeText;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.RootMatchers.isDialog;
+import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static android.support.test.espresso.matcher.ViewMatchers.hasSibling;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.hamcrest.Matchers.allOf;
+import static org.sufficientlysecure.keychain.matcher.EditTextMatchers.withError;
+import static org.sufficientlysecure.keychain.matcher.EditTextMatchers.withTransformationMethod;
+
+@RunWith(AndroidJUnit4.class)
+public class CreateKeyActivityTest {
+
+ public static final String SAMPLE_NAME = "Sample Name";
+ public static final String SAMPLE_EMAIL = "sample_email@gmail.com";
+ public static final String SAMPLE_ADDITIONAL_EMAIL = "sample_additional_email@gmail.com";
+ public static final String SAMPLE_PASSWORD = "sample_password";
+
+ @Rule
+ public ActivityTestRule<CreateKeyActivity> mActivityRule = new ActivityTestRule<>(CreateKeyActivity.class);
+
+ @Test
+ public void testCreateMyKey() {
+ // Clicks create my key
+ onView(withId(R.id.create_key_create_key_button))
+ .perform(click());
+
+ // Clicks next with empty name
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+ onView(withId(R.id.create_key_name))
+ .check(matches(withError(R.string.create_key_empty)));
+
+ // Types name and clicks next
+ onView(withId(R.id.create_key_name))
+ .perform(typeText(SAMPLE_NAME));
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+
+ // Clicks next with empty email
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+ onView(withId(R.id.create_key_email))
+ .check(matches(withError(R.string.create_key_empty)));
+
+ // Types email
+ onView(withId(R.id.create_key_email))
+ .perform(typeText(SAMPLE_EMAIL));
+
+ // Adds same email as additional email and dismisses the snackbar
+ onView(withId(R.id.create_key_add_email))
+ .perform(click());
+ onView(withId(R.id.add_email_address))
+ .perform(typeText(SAMPLE_EMAIL));
+ onView(withText(android.R.string.ok))
+ .inRoot(isDialog())
+ .perform(click());
+ onView(allOf(withId(R.id.sb__text), withText(R.string.create_key_email_already_exists_text)))
+ .check(matches(isDisplayed()));
+ onView(allOf(withId(R.id.sb__text), withText(R.string.create_key_email_already_exists_text)))
+ .perform(swipeLeft());
+
+ // Adds additional email
+ onView(withId(R.id.create_key_add_email))
+ .perform(click());
+ onView(withId(R.id.add_email_address))
+ .perform(typeText(SAMPLE_ADDITIONAL_EMAIL));
+ onView(withText(android.R.string.ok))
+ .inRoot(isDialog())
+ .perform(click());
+ onView(withId(R.id.create_key_emails))
+ .check(matches(hasDescendant(allOf(withId(R.id.create_key_email_item_email), withText(SAMPLE_ADDITIONAL_EMAIL)))));
+
+ // Removes additional email and clicks next
+ onView(allOf(withId(R.id.create_key_email_item_delete_button), hasSibling(allOf(withId(R.id.create_key_email_item_email), withText(SAMPLE_ADDITIONAL_EMAIL)))))
+ .perform(click())
+ .check(doesNotExist());
+ onView(withId(R.id.create_key_next_button))
+ .perform(click(click()));
+
+ // Clicks next with empty password
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+ onView(withId(R.id.create_key_passphrase))
+ .check(matches(withError(R.string.create_key_empty)));
+
+ // Types password
+ onView(withId(R.id.create_key_passphrase))
+ .perform(typeText(SAMPLE_PASSWORD));
+
+ // Clicks next with empty confirm password
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+ onView(withId(R.id.create_key_passphrase_again))
+ .check(matches(withError(R.string.create_key_passphrases_not_equal)));
+
+ // Types confirm password
+ onView(withId(R.id.create_key_passphrase_again))
+ .perform(typeText(SAMPLE_PASSWORD));
+
+ // Clicks show password twice and clicks next
+ onView(withId(R.id.create_key_show_passphrase))
+ .perform(click());
+ onView(withId(R.id.create_key_passphrase))
+ .check(matches(withTransformationMethod(HideReturnsTransformationMethod.class)));
+ onView(withId(R.id.create_key_passphrase_again))
+ .check(matches(withTransformationMethod(HideReturnsTransformationMethod.class)));
+ onView(withId(R.id.create_key_show_passphrase))
+ .perform(click());
+ onView(withId(R.id.create_key_passphrase))
+ .check(matches(withTransformationMethod(PasswordTransformationMethod.class)));
+ onView(withId(R.id.create_key_passphrase_again))
+ .check(matches(withTransformationMethod(PasswordTransformationMethod.class)));
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+
+ // Verifies name and email
+ onView(withId(R.id.name))
+ .check(matches(withText(SAMPLE_NAME)));
+ onView(withId(R.id.email))
+ .check(matches(withText(SAMPLE_EMAIL)));
+
+ // Verifies backstack
+ onView(withId(R.id.create_key_back_button))
+ .perform(click());
+ onView(withId(R.id.create_key_back_button))
+ .perform(click());
+ onView(withId(R.id.create_key_back_button))
+ .perform(click());
+
+ onView(withId(R.id.create_key_name))
+ .check(matches(withText(SAMPLE_NAME)));
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+
+ onView(withId(R.id.create_key_email))
+ .check(matches(withText(SAMPLE_EMAIL)));
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+
+ // TODO: Uncomment when fixed in main
+// onView(withId(R.id.create_key_passphrase))
+// .check(matches(withText(SAMPLE_PASSWORD)));
+// onView(withId(R.id.create_key_passphrase_again))
+// .check(matches(withText(SAMPLE_PASSWORD)));
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+
+ onView(withId(R.id.name))
+ .check(matches(withText(SAMPLE_NAME)));
+ onView(withId(R.id.email))
+ .check(matches(withText(SAMPLE_EMAIL)));
+
+ // Clicks create key
+ onView(withId(R.id.create_key_next_button))
+ .perform(click());
+ }
+
+}
diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java
new file mode 100644
index 000000000..7f2a7953b
--- /dev/null
+++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/matcher/EditTextMatchers.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.matcher;
+
+import android.content.Context;
+import android.text.method.TransformationMethod;
+import android.view.View;
+import android.widget.EditText;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+
+public class EditTextMatchers {
+
+ public static TypeSafeMatcher<View> withError(final int errorResId) {
+ return new TypeSafeMatcher<View>() {
+
+ @Override
+ public boolean matchesSafely(View view) {
+ Context context = view.getContext();
+
+ if (view instanceof EditText) {
+ CharSequence error = ((EditText) view).getError();
+ return error != null && error.equals(context.getString(errorResId));
+ }
+
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("EditText with error");
+ }
+
+ };
+ }
+
+ public static TypeSafeMatcher<View> withTransformationMethod(final Class<? extends TransformationMethod> transformationClass) {
+ return new TypeSafeMatcher<View>() {
+
+ @Override
+ public boolean matchesSafely(View view) {
+ if (view instanceof EditText) {
+ TransformationMethod transformation = ((EditText) view).getTransformationMethod();
+ return transformation != null && transformationClass.isInstance(transformation);
+ }
+
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("EditText with transformation method");
+ }
+
+ };
+ }
+
+}
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 5280b3047..f63cf8823 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -3,8 +3,8 @@
xmlns:tools="http://schemas.android.com/tools"
package="org.sufficientlysecure.keychain"
android:installLocation="auto"
- android:versionCode="31203"
- android:versionName="3.2beta3">
+ android:versionCode="32100"
+ android:versionName="3.2.1">
<!--
General remarks
@@ -15,7 +15,7 @@
Association of file types to Keychain
=====================================
General remarks about file ending conventions:
- - *.gpg for binary files
+ - *.gpg,*.pgp for binary files
- *.asc for ascii armored files The actual content can be anything.
The file ending only shows if it is binary or ascii encoded.
@@ -73,8 +73,8 @@
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
- android:theme="@style/KeychainTheme"
- android:label="@string/app_name">
+ android:label="@string/app_name"
+ android:theme="@style/KeychainTheme">
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
@@ -88,11 +88,11 @@
</activity>
<activity
android:name=".ui.CreateKeyActivity"
- android:windowSoftInputMode="adjustResize"
+ android:allowTaskReparenting="true"
android:label="@string/title_manage_my_keys"
android:launchMode="singleTop"
- android:allowTaskReparenting="true"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
@@ -136,8 +136,8 @@
android:name=".ui.SafeSlingerActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_exchange_keys"
- android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
@@ -146,14 +146,13 @@
android:name=".ui.EncryptFilesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_encrypt_files"
- android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
- <!-- Keychain's own Actions -->
- <!-- ENCRYPT with data Uri -->
+ <!-- ENCRYPT_DATA with data Uri -->
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.action.ENCRYPT_DATA" />
@@ -179,14 +178,13 @@
android:name=".ui.EncryptTextActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_encrypt_text"
- android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
- <!-- Keychain's own Actions -->
- <!-- ENCRYPT with text as extra -->
+ <!-- ENCRYPT_TEXT with text as extra -->
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.action.ENCRYPT_TEXT" />
@@ -206,14 +204,13 @@
android:name=".ui.DecryptTextActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
- android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
- <!-- Keychain's own Actions -->
- <!-- DECRYPT with text as extra -->
+ <!-- DECRYPT_TEXT with text as extra -->
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.action.DECRYPT_TEXT" />
@@ -233,13 +230,13 @@
android:name=".ui.DecryptFilesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
- android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.MainActivity">
+ android:parentActivityName=".ui.MainActivity"
+ android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
- <!-- VIEW with mimeType application/octet-stream, application/pgp and text/pgp -->
+ <!-- VIEW with mimeTypes -->
<intent-filter android:label="@string/intent_send_decrypt">
<action android:name="android.intent.action.VIEW" />
@@ -259,9 +256,14 @@
<!-- non-standard MIME types found in the wild -->
<data android:mimeType="application/pgp" />
<data android:mimeType="text/pgp" />
+
+ <!--
+ This links to attached asc files in AOSP mail. It is deactivated because of
+ https://github.com/open-keychain/open-keychain/issues/290
+ -->
+ <!--<data android:mimeType="text/plain" />-->
</intent-filter>
- <!-- Keychain's own Actions -->
- <!-- DECRYPT with data Uri -->
+ <!-- DECRYPT_DATA with data Uri -->
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.action.DECRYPT_DATA" />
@@ -294,7 +296,7 @@
<data android:scheme="file" />
<data android:scheme="content" />
- <!-- GnuPG ASCII data, mostly keys, but sometimes signatures and encrypted data -->
+ <!-- ASCII data, mostly keys, but sometimes signatures and encrypted data -->
<data android:pathPattern=".*\\.asc" />
<data android:pathPattern=".*\\..*\\.asc" />
<data android:pathPattern=".*\\..*\\..*\\.asc" />
@@ -356,7 +358,7 @@
<data android:mimeType="*/*" />
- <!-- GnuPG ASCII data, mostly keys, but sometimes signatures and encrypted data -->
+ <!-- ASCII data, mostly keys, but sometimes signatures and encrypted data -->
<data android:pathPattern=".*\\.asc" />
<data android:pathPattern=".*\\..*\\.asc" />
<data android:pathPattern=".*\\..*\\..*\\.asc" />
@@ -520,7 +522,7 @@
<data android:scheme="file" />
<data android:scheme="content" />
- <!-- GnuPG ASCII data, mostly keys, but sometimes signatures and encrypted data -->
+ <!-- ASCII data, mostly keys, but sometimes signatures and encrypted data -->
<data android:pathPattern=".*\\.asc" />
<data android:pathPattern=".*\\..*\\.asc" />
<data android:pathPattern=".*\\..*\\..*\\.asc" />
@@ -582,7 +584,7 @@
<data android:mimeType="*/*" />
- <!-- GnuPG ASCII data, mostly keys, but sometimes signatures and encrypted data -->
+ <!-- ASCII data, mostly keys, but sometimes signatures and encrypted data -->
<data android:pathPattern=".*\\.asc" />
<data android:pathPattern=".*\\..*\\.asc" />
<data android:pathPattern=".*\\..*\\..*\\.asc" />
@@ -635,17 +637,16 @@
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="https"/>
- <data android:scheme="http"/>
+ <data android:scheme="https" />
+ <data android:scheme="http" />
<!-- if we don't specify a host, pathPattern will be ignored-->
- <data android:host="*"/>
+ <data android:host="*" />
<!-- convention for keyserver paths specified by internet draft
draft-shaw-openpgp-hkp-00.txt
(http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-3) -->
- <data android:pathPattern="/pks/lookup.*"/>
+ <data android:pathPattern="/pks/lookup.*" />
</intent-filter>
- <!-- Keychain's own Actions -->
<!-- IMPORT_KEY with files TODO: does this work? -->
<intent-filter android:label="@string/intent_import_key">
<action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY" />
@@ -693,9 +694,9 @@
-->
<activity
android:name=".ui.NfcOperationActivity"
+ android:allowTaskReparenting="true"
android:launchMode="singleTop"
- android:taskAffinity=":Nfc"
- android:allowTaskReparenting="true" />
+ android:taskAffinity=":Nfc" />
<!--<activity-->
<!--android:name=".ui.NfcIntentActivity"-->
@@ -745,6 +746,11 @@
android:label="@string/app_name"
android:launchMode="singleTop" />
<activity
+ android:name=".remote.ui.SelectAllowedKeysActivity"
+ android:exported="false"
+ android:label="@string/app_name"
+ android:launchMode="singleTop" />
+ <activity
android:name=".remote.ui.AppSettingsActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:exported="false">
@@ -804,8 +810,8 @@
<provider
android:name=".provider.TemporaryStorageProvider"
android:authorities="org.sufficientlysecure.keychain.tempstorage"
- android:writePermission="org.sufficientlysecure.keychain.WRITE_TEMPORARY_STORAGE"
- android:exported="true" />
+ android:exported="true"
+ android:writePermission="org.sufficientlysecure.keychain.WRITE_TEMPORARY_STORAGE" />
</application>
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/linked/resources/TwitterResource.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/linked/resources/TwitterResource.java
index d6b806ee6..73e3d3643 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/linked/resources/TwitterResource.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/linked/resources/TwitterResource.java
@@ -32,10 +32,10 @@ import java.util.regex.Pattern;
public class TwitterResource extends LinkedTokenResource {
- public static final String[] CERT_PINS = new String[] {
- // antec Class 3 Secure Server CA - G4
+ public static final String[] CERT_PINS = null; /*(new String[] {
+ // Symantec Class 3 Secure Server CA - G4
"513fb9743870b73440418d30930699ff"
- };
+ };*/
final String mHandle;
final String mTweetId;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
index b48a1da91..86cfc21a3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
@@ -376,6 +376,8 @@ public class ImportExportOperation extends BaseOperation {
log.add(LogType.MSG_IMPORT_ERROR, 1);
}
+ ContactSyncAdapterService.requestSync();
+
return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret,
importedMasterKeyIdsArray);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java
index 90ec3053f..bf2349734 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java
@@ -1,3 +1,21 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
@@ -32,7 +50,7 @@ public class PgpCertifyOperation {
OperationLog log,
int indent,
CertifyAction action,
- Map<ByteBuffer,byte[]> signedHashes,
+ Map<ByteBuffer, byte[]> signedHashes,
Date creationTimestamp) {
if (!secretKey.isMasterKey()) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
index 8ecb30cdd..9073e81b9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
@@ -178,13 +178,20 @@ public class PgpSignEncryptOperation extends BaseOperation {
case PIN:
case PATTERN:
case PASSPHRASE: {
- if (cryptoInput.getPassphrase() == null) {
+ Passphrase localPassphrase = cryptoInput.getPassphrase();
+ if (localPassphrase == null) {
+ try {
+ localPassphrase = getCachedPassphrase(signingKeyRing.getMasterKeyId(), signingKey.getKeyId());
+ } catch (PassphraseCacheInterface.NoSecretKeyException ignored) {
+ }
+ }
+ if (localPassphrase == null) {
log.add(LogType.MSG_PSE_PENDING_PASSPHRASE, indent + 1);
return new PgpSignEncryptResult(log, RequiredInputParcel.createRequiredSignPassphrase(
signingKeyRing.getMasterKeyId(), signingKey.getKeyId(),
cryptoInput.getSignatureTime()));
}
- if (!signingKey.unlock(cryptoInput.getPassphrase())) {
+ if (!signingKey.unlock(localPassphrase)) {
log.add(LogType.MSG_PSE_ERROR_BAD_PASSPHRASE, indent);
return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
index deb12a146..11d6728e2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
@@ -73,7 +73,7 @@ public class KeychainContract {
interface ApiAppsColumns {
String PACKAGE_NAME = "package_name";
- String PACKAGE_SIGNATURE = "package_signature";
+ String PACKAGE_CERTIFICATE = "package_signature";
}
interface ApiAppsAccountsColumns {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
index 4a162989f..ff661e494 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -148,7 +148,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
"CREATE TABLE IF NOT EXISTS " + Tables.API_APPS + " ("
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ ApiAppsColumns.PACKAGE_NAME + " TEXT NOT NULL UNIQUE, "
- + ApiAppsColumns.PACKAGE_SIGNATURE + " BLOB"
+ + ApiAppsColumns.PACKAGE_CERTIFICATE + " BLOB"
+ ")";
private static final String CREATE_API_APPS_ACCOUNTS =
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index 655bf19ba..bf56417e9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -50,7 +50,6 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.PgpConstants;
-import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
@@ -1415,7 +1414,7 @@ public class ProviderHelper {
private ContentValues contentValueForApiApps(AppSettings appSettings) {
ContentValues values = new ContentValues();
values.put(ApiApps.PACKAGE_NAME, appSettings.getPackageName());
- values.put(ApiApps.PACKAGE_SIGNATURE, appSettings.getPackageSignature());
+ values.put(ApiApps.PACKAGE_CERTIFICATE, appSettings.getPackageSignature());
return values;
}
@@ -1462,7 +1461,7 @@ public class ProviderHelper {
settings.setPackageName(cursor.getString(
cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
settings.setPackageSignature(cursor.getBlob(
- cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
+ cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_CERTIFICATE)));
}
} finally {
if (cursor != null) {
@@ -1554,31 +1553,10 @@ public class ProviderHelper {
mContentResolver.insert(uri, values);
}
- public Set<String> getAllFingerprints(Uri uri) {
- Set<String> fingerprints = new HashSet<>();
- String[] projection = new String[]{KeyRings.FINGERPRINT};
- Cursor cursor = mContentResolver.query(uri, projection, null, null, null);
- try {
- if (cursor != null) {
- int fingerprintColumn = cursor.getColumnIndex(KeyRings.FINGERPRINT);
- while (cursor.moveToNext()) {
- fingerprints.add(
- KeyFormattingUtils.convertFingerprintToHex(cursor.getBlob(fingerprintColumn))
- );
- }
- }
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- return fingerprints;
- }
-
- public byte[] getApiAppSignature(String packageName) {
+ public byte[] getApiAppCertificate(String packageName) {
Uri queryUri = ApiApps.buildByPackageNameUri(packageName);
- String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
+ String[] projection = new String[]{ApiApps.PACKAGE_CERTIFICATE};
Cursor cursor = mContentResolver.query(queryUri, projection, null, null, null);
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java
index a65d222da..45f806960 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java
@@ -31,10 +31,12 @@ import android.provider.OpenableColumns;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.util.DatabaseUtil;
+import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.util.UUID;
public class TemporaryStorageProvider extends ContentProvider {
@@ -44,7 +46,9 @@ public class TemporaryStorageProvider extends ContentProvider {
private static final String COLUMN_NAME = "name";
private static final String COLUMN_TIME = "time";
private static final Uri BASE_URI = Uri.parse("content://org.sufficientlysecure.keychain.tempstorage/");
- private static final int DB_VERSION = 1;
+ private static final int DB_VERSION = 2;
+
+ private static File cacheDir;
public static Uri createFile(Context context, String targetName) {
ContentValues contentValues = new ContentValues();
@@ -66,7 +70,7 @@ public class TemporaryStorageProvider extends ContentProvider {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_FILES + " (" +
- COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
+ COLUMN_ID + " TEXT PRIMARY KEY, " +
COLUMN_NAME + " TEXT, " +
COLUMN_TIME + " INTEGER" +
");");
@@ -74,28 +78,39 @@ public class TemporaryStorageProvider extends ContentProvider {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
+ Log.d(Constants.TAG, "Upgrading files db from " + oldVersion + " to " + newVersion);
+
+ switch (oldVersion) {
+ case 1:
+ db.execSQL("DROP TABLE IF EXISTS files");
+ db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_FILES + " (" +
+ COLUMN_ID + " TEXT PRIMARY KEY, " +
+ COLUMN_NAME + " TEXT, " +
+ COLUMN_TIME + " INTEGER" +
+ ");");
+ }
}
}
- private TemporaryStorageDatabase db;
+ private static TemporaryStorageDatabase db;
private File getFile(Uri uri) throws FileNotFoundException {
try {
- return getFile(Integer.parseInt(uri.getLastPathSegment()));
+ return getFile(uri.getLastPathSegment());
} catch (NumberFormatException e) {
throw new FileNotFoundException();
}
}
- private File getFile(int id) {
- return new File(getContext().getCacheDir(), "temp/" + id);
+ private File getFile(String id) {
+ return new File(cacheDir, "temp/" + id);
}
@Override
public boolean onCreate() {
db = new TemporaryStorageDatabase(getContext());
- return new File(getContext().getCacheDir(), "temp").mkdirs();
+ cacheDir = getContext().getCacheDir();
+ return new File(cacheDir, "temp").mkdirs();
}
@Override
@@ -133,13 +148,15 @@ public class TemporaryStorageProvider extends ContentProvider {
if (!values.containsKey(COLUMN_TIME)) {
values.put(COLUMN_TIME, System.currentTimeMillis());
}
+ String uuid = UUID.randomUUID().toString();
+ values.put(COLUMN_ID, uuid);
int insert = (int) db.getWritableDatabase().insert(TABLE_FILES, null, values);
try {
- getFile(insert).createNewFile();
+ getFile(uuid).createNewFile();
} catch (IOException e) {
return null;
}
- return Uri.withAppendedPath(BASE_URI, Long.toString(insert));
+ return Uri.withAppendedPath(BASE_URI, uuid);
}
@Override
@@ -152,7 +169,7 @@ public class TemporaryStorageProvider extends ContentProvider {
selectionArgs, null, null, null);
if (files != null) {
while (files.moveToNext()) {
- getFile(files.getInt(0)).delete();
+ getFile(files.getString(0)).delete();
}
files.close();
return db.getWritableDatabase().delete(TABLE_FILES, selection, selectionArgs);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index c51edf59c..4a8bf9332 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -34,6 +34,7 @@ import org.openintents.openpgp.util.OpenPgpApi;
import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel;
import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
import org.sufficientlysecure.keychain.pgp.PgpConstants;
@@ -47,6 +48,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
+import org.sufficientlysecure.keychain.remote.ui.SelectAllowedKeysActivity;
import org.sufficientlysecure.keychain.remote.ui.SelectSignKeyIdActivity;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
@@ -205,6 +207,18 @@ public class OpenPgpService extends RemoteService {
PendingIntent.FLAG_CANCEL_CURRENT);
}
+ private PendingIntent getSelectAllowedKeysIntent(Intent data) {
+ // If signature is unknown we return an _additional_ PendingIntent
+ // to retrieve the missing key
+ Intent intent = new Intent(getBaseContext(), SelectAllowedKeysActivity.class);
+ intent.putExtra(SelectAllowedKeysActivity.EXTRA_SERVICE_INTENT, data);
+ intent.setData(KeychainContract.ApiApps.buildByPackageNameUri(getCurrentCallingPackage()));
+
+ return PendingIntent.getActivity(getBaseContext(), 0,
+ intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
+ }
+
private PendingIntent getShowKeyPendingIntent(long masterKeyId) {
Intent intent = new Intent(getBaseContext(), ViewKeyActivity.class);
intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
@@ -403,6 +417,20 @@ public class OpenPgpService extends RemoteService {
.setAdditionalEncryptId(signKeyId); // add sign key for encryption
}
+ // OLD: Even if the message is not signed: Do self-encrypt to account key id
+ if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 7) {
+ String accName = data.getStringExtra(OpenPgpApi.EXTRA_ACCOUNT_NAME);
+ // if no account name is given use name "default"
+ if (TextUtils.isEmpty(accName)) {
+ accName = "default";
+ }
+ final AccountSettings accSettings = getAccSettings(accName);
+ if (accSettings == null || (accSettings.getKeyId() == Constants.key.none)) {
+ return getCreateAccountIntent(data, accName);
+ }
+ pseInput.setAdditionalEncryptId(accSettings.getKeyId());
+ }
+
CryptoInputParcel inputParcel = CryptoInputParcelCacheService.getCryptoInputParcel(this, data);
if (inputParcel == null) {
inputParcel = new CryptoInputParcel();
@@ -476,13 +504,12 @@ public class OpenPgpService extends RemoteService {
}
String currentPkg = getCurrentCallingPackage();
- Set<Long> allowedKeyIds;
+ Set<Long> allowedKeyIds = mProviderHelper.getAllowedKeyIdsForApp(
+ KeychainContract.ApiAllowedKeys.buildBaseUri(currentPkg));
+
if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 7) {
- allowedKeyIds = mProviderHelper.getAllKeyIdsForApp(
- ApiAccounts.buildBaseUri(currentPkg));
- } else {
- allowedKeyIds = mProviderHelper.getAllowedKeyIdsForApp(
- KeychainContract.ApiAllowedKeys.buildBaseUri(currentPkg));
+ allowedKeyIds.addAll(mProviderHelper.getAllKeyIdsForApp(
+ ApiAccounts.buildBaseUri(currentPkg)));
}
long inputLength = is.available();
@@ -575,6 +602,15 @@ public class OpenPgpService extends RemoteService {
return result;
} else {
LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+
+ if (errorMsg.mType == OperationResult.LogType.MSG_DC_ERROR_NO_KEY) {
+ // allow user to select allowed keys
+ Intent result = new Intent();
+ result.putExtra(OpenPgpApi.RESULT_INTENT, getSelectAllowedKeysIntent(data));
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED);
+ return result;
+ }
+
throw new Exception(getString(errorMsg.mType.getMsgId()));
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
index 59dafb505..e4d4ac49a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
@@ -37,6 +37,8 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
import org.sufficientlysecure.keychain.util.Log;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -45,10 +47,10 @@ import java.util.Arrays;
*/
public abstract class RemoteService extends Service {
- public static class WrongPackageSignatureException extends Exception {
+ public static class WrongPackageCertificateException extends Exception {
private static final long serialVersionUID = -8294642703122196028L;
- public WrongPackageSignatureException(String message) {
+ public WrongPackageCertificateException(String message) {
super(message);
}
}
@@ -74,9 +76,9 @@ public abstract class RemoteService extends Service {
String packageName = getCurrentCallingPackage();
Log.d(Constants.TAG, "isAllowed packageName: " + packageName);
- byte[] packageSignature;
+ byte[] packageCertificate;
try {
- packageSignature = getPackageSignature(packageName);
+ packageCertificate = getPackageCertificate(packageName);
} catch (NameNotFoundException e) {
Log.e(Constants.TAG, "Should not happen, returning!", e);
// return error
@@ -91,7 +93,7 @@ public abstract class RemoteService extends Service {
Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class);
intent.setAction(RemoteServiceActivity.ACTION_REGISTER);
intent.putExtra(RemoteServiceActivity.EXTRA_PACKAGE_NAME, packageName);
- intent.putExtra(RemoteServiceActivity.EXTRA_PACKAGE_SIGNATURE, packageSignature);
+ intent.putExtra(RemoteServiceActivity.EXTRA_PACKAGE_SIGNATURE, packageCertificate);
intent.putExtra(RemoteServiceActivity.EXTRA_DATA, data);
PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
@@ -105,7 +107,7 @@ public abstract class RemoteService extends Service {
return result;
}
- } catch (WrongPackageSignatureException e) {
+ } catch (WrongPackageCertificateException e) {
Log.e(Constants.TAG, "wrong signature!", e);
Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class);
@@ -127,14 +129,24 @@ public abstract class RemoteService extends Service {
}
}
- private byte[] getPackageSignature(String packageName) throws NameNotFoundException {
+ private byte[] getPackageCertificate(String packageName) throws NameNotFoundException {
PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName,
PackageManager.GET_SIGNATURES);
- Signature[] signatures = pkgInfo.signatures;
- // TODO: Only first signature?!
- byte[] packageSignature = signatures[0].toByteArray();
+ // NOTE: Silly Android API naming: Signatures are actually certificates
+ Signature[] certificates = pkgInfo.signatures;
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ for (Signature cert : certificates) {
+ try {
+ outputStream.write(cert.toByteArray());
+ } catch (IOException e) {
+ throw new RuntimeException("Should not happen! Writing ByteArrayOutputStream to concat certificates failed");
+ }
+ }
- return packageSignature;
+ // Even if an apk has several certificates, these certificates should never change
+ // Google Play does not allow the introduction of new certificates into an existing apk
+ // Also see this attack: http://stackoverflow.com/a/10567852
+ return outputStream.toByteArray();
}
/**
@@ -144,9 +156,12 @@ public abstract class RemoteService extends Service {
* @return package name
*/
protected String getCurrentCallingPackage() {
- // TODO:
- // callingPackages contains more than one entry when sharedUserId has been used...
String[] callingPackages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
+
+ // NOTE: No support for sharedUserIds
+ // callingPackages contains more than one entry when sharedUserId has been used
+ // No plans to support sharedUserIds due to many bugs connected to them:
+ // http://java-hamster.blogspot.de/2010/05/androids-shareduserid.html
String currentPkg = callingPackages[0];
Log.d(Constants.TAG, "currentPkg: " + currentPkg);
@@ -155,12 +170,12 @@ public abstract class RemoteService extends Service {
/**
* DEPRECATED API
- *
+ * <p/>
* Retrieves AccountSettings from database for the application calling this remote service
*/
protected AccountSettings getAccSettings(String accountName) {
String currentPkg = getCurrentCallingPackage();
- Log.d(Constants.TAG, "getAccSettings accountName: "+ accountName);
+ Log.d(Constants.TAG, "getAccSettings accountName: " + accountName);
Uri uri = KeychainContract.ApiAccounts.buildByPackageAndAccountUri(currentPkg, accountName);
@@ -198,14 +213,14 @@ public abstract class RemoteService extends Service {
*
* @param allowOnlySelf allow only Keychain app itself
* @return true if process is allowed to use this service
- * @throws WrongPackageSignatureException
+ * @throws WrongPackageCertificateException
*/
- private boolean isCallerAllowed(boolean allowOnlySelf) throws WrongPackageSignatureException {
+ private boolean isCallerAllowed(boolean allowOnlySelf) throws WrongPackageCertificateException {
return isUidAllowed(Binder.getCallingUid(), allowOnlySelf);
}
private boolean isUidAllowed(int uid, boolean allowOnlySelf)
- throws WrongPackageSignatureException {
+ throws WrongPackageCertificateException {
if (android.os.Process.myUid() == uid) {
return true;
}
@@ -229,11 +244,9 @@ public abstract class RemoteService extends Service {
/**
* Checks if packageName is a registered app for the API. Does not return true for own package!
*
- * @param packageName
- * @return
- * @throws WrongPackageSignatureException
+ * @throws WrongPackageCertificateException
*/
- private boolean isPackageAllowed(String packageName) throws WrongPackageSignatureException {
+ private boolean isPackageAllowed(String packageName) throws WrongPackageCertificateException {
Log.d(Constants.TAG, "isPackageAllowed packageName: " + packageName);
ArrayList<String> allowedPkgs = mProviderHelper.getRegisteredApiApps();
@@ -244,22 +257,22 @@ public abstract class RemoteService extends Service {
Log.d(Constants.TAG, "Package is allowed! packageName: " + packageName);
// check package signature
- byte[] currentSig;
+ byte[] currentCert;
try {
- currentSig = getPackageSignature(packageName);
+ currentCert = getPackageCertificate(packageName);
} catch (NameNotFoundException e) {
- throw new WrongPackageSignatureException(e.getMessage());
+ throw new WrongPackageCertificateException(e.getMessage());
}
- byte[] storedSig = mProviderHelper.getApiAppSignature(packageName);
- if (Arrays.equals(currentSig, storedSig)) {
+ byte[] storedCert = mProviderHelper.getApiAppCertificate(packageName);
+ if (Arrays.equals(currentCert, storedCert)) {
Log.d(Constants.TAG,
- "Package signature is correct! (equals signature from database)");
+ "Package certificate is correct! (equals certificate from database)");
return true;
} else {
- throw new WrongPackageSignatureException(
- "PACKAGE NOT ALLOWED! Signature wrong! (Signature not " +
- "equals signature from database)");
+ throw new WrongPackageCertificateException(
+ "PACKAGE NOT ALLOWED! Certificate wrong! (Certificate not " +
+ "equals certificate from database)");
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
index f312c0d44..5facde64f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
@@ -45,6 +45,7 @@ import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList;
+// TODO: make extensible BaseRemoteServiceActivity and extend these cases from it
public class RemoteServiceActivity extends BaseActivity {
public static final String ACTION_REGISTER = Constants.INTENT_PREFIX + "API_ACTIVITY_REGISTER";
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectAllowedKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectAllowedKeysActivity.java
new file mode 100644
index 000000000..767106ff0
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectAllowedKeysActivity.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.remote.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.ui.base.BaseActivity;
+import org.sufficientlysecure.keychain.util.Log;
+
+public class SelectAllowedKeysActivity extends BaseActivity {
+
+ public static final String EXTRA_SERVICE_INTENT = "data";
+
+ private Uri mAppUri;
+
+ private AppSettingsAllowedKeysListFragment mAllowedKeysFragment;
+
+ Intent mServiceData;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Inflate a "Done" custom action bar
+ setFullScreenDialogDoneClose(R.string.api_settings_save,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ save();
+ }
+ },
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ cancel();
+ }
+ });
+
+ Intent intent = getIntent();
+ mServiceData = intent.getParcelableExtra(EXTRA_SERVICE_INTENT);
+ mAppUri = intent.getData();
+ if (mAppUri == null) {
+ Log.e(Constants.TAG, "Intent data missing. Should be Uri of app!");
+ finish();
+ return;
+ } else {
+ Log.d(Constants.TAG, "uri: " + mAppUri);
+ loadData(savedInstanceState, mAppUri);
+ }
+ }
+
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.api_remote_select_allowed_keys);
+ }
+
+ private void save() {
+ mAllowedKeysFragment.saveAllowedKeys();
+ setResult(Activity.RESULT_OK, mServiceData);
+ finish();
+ }
+
+ private void cancel() {
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ }
+
+ private void loadData(Bundle savedInstanceState, Uri appUri) {
+ Uri allowedKeysUri = appUri.buildUpon().appendPath(KeychainContract.PATH_ALLOWED_KEYS).build();
+ Log.d(Constants.TAG, "allowedKeysUri: " + allowedKeysUri);
+ startListFragments(savedInstanceState, allowedKeysUri);
+ }
+
+ private void startListFragments(Bundle savedInstanceState, Uri allowedKeysUri) {
+ // However, if we're being restored from a previous state,
+ // then we don't need to do anything and should return or else
+ // we could end up with overlapping fragments.
+ if (savedInstanceState != null) {
+ return;
+ }
+
+ // Create an instance of the fragments
+ mAllowedKeysFragment = AppSettingsAllowedKeysListFragment.newInstance(allowedKeysUri);
+ // Add the fragment to the 'fragment_container' FrameLayout
+ // NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.api_allowed_keys_list_fragment, mAllowedKeysFragment)
+ .commitAllowingStateLoss();
+ // do it immediately!
+ getSupportFragmentManager().executePendingTransactions();
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java
index 180109297..249586f6d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java
@@ -50,18 +50,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/
public class CloudImportService extends Service implements Progressable {
- //required as extras from intent
+ // required as extras from intent
public static final String EXTRA_MESSENGER = "messenger";
public static final String EXTRA_DATA = "data";
- //required by data bundle
+ // required by data bundle
public static final String IMPORT_KEY_LIST = "import_key_list";
public static final String IMPORT_KEY_SERVER = "import_key_server";
// indicates a request to cancel the import
public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL";
- //tells the spawned threads whether the user has requested a cancel
+ // tells the spawned threads whether the user has requested a cancel
private static AtomicBoolean mActionCancelled = new AtomicBoolean(false);
@Override
@@ -86,7 +86,7 @@ public class CloudImportService extends Service implements Progressable {
public KeyImportAccumulator(int totalKeys) {
mTotalKeys = totalKeys;
- //ignore updates from ImportExportOperation for now
+ // ignore updates from ImportExportOperation for now
mImportProgressable = new Progressable() {
@Override
public void setProgress(String message, int current, int total) {
@@ -131,20 +131,17 @@ public class CloudImportService extends Service implements Progressable {
mSecret += result.mSecret;
long[] masterKeyIds = result.getImportedMasterKeyIds();
- for (int i = 0; i < masterKeyIds.length; i++) {
- mImportedMasterKeyIds.add(masterKeyIds[i]);
+ for (long masterKeyId : masterKeyIds) {
+ mImportedMasterKeyIds.add(masterKeyId);
}
// if any key import has been cancelled, set result type to cancelled
// resultType is added to in getConsolidatedKayImport to account for remaining factors
mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED;
-
}
/**
* returns accumulated result of all imports so far
- *
- * @return
*/
public ImportKeyResult getConsolidatedImportKeyResult() {
@@ -205,7 +202,7 @@ public class CloudImportService extends Service implements Progressable {
Bundle data = extras.getBundle(EXTRA_DATA);
final String keyServer = data.getString(IMPORT_KEY_SERVER);
- //keyList being null (in case key list to be reaad from cache) is checked by importKeys
+ // keyList being null (in case key list to be reaad from cache) is checked by importKeys
final ArrayList<ParcelableKeyRing> keyList = data.getParcelableArrayList(IMPORT_KEY_LIST);
// Adding keys to the ThreadPoolExecutor takes time, we don't want to block the main thread
@@ -225,7 +222,7 @@ public class CloudImportService extends Service implements Progressable {
new ParcelableFileCache<>(this, "key_import.pcl");
int totKeys = 0;
Iterator<ParcelableKeyRing> keyListIterator = null;
- //either keyList or cache must be null, no guarantees otherwise
+ // either keyList or cache must be null, no guarantees otherwise
if (keyList == null) {//export from cache, copied from ImportExportOperation.importKeyRings
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
index 0b203614b..e0b728bd4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import org.sufficientlysecure.keychain.R;
@@ -84,7 +83,7 @@ public class CreateKeyActivity extends BaseNfcActivity {
String nfcUserId = intent.getStringExtra(EXTRA_NFC_USER_ID);
byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID);
- Fragment frag2 = CreateKeyYubiImportFragment.createInstance(
+ Fragment frag2 = CreateKeyYubiKeyImportFragment.createInstance(
nfcFingerprints, nfcAid, nfcUserId);
loadFragment(frag2, FragAction.START);
@@ -99,7 +98,7 @@ public class CreateKeyActivity extends BaseNfcActivity {
if (mFirstTime) {
setTitle(R.string.app_name);
- setActionBarIcon(R.drawable.ic_launcher);
+ mToolbar.setNavigationIcon(null);
mToolbar.setNavigationOnClickListener(null);
} else {
setTitle(R.string.title_manage_my_keys);
@@ -131,7 +130,7 @@ public class CreateKeyActivity extends BaseNfcActivity {
finish();
} catch (PgpKeyNotFoundException e) {
- Fragment frag = CreateKeyYubiImportFragment.createInstance(
+ Fragment frag = CreateKeyYubiKeyImportFragment.createInstance(
scannedFingerprints, nfcAid, userId);
loadFragment(frag, FragAction.TO_RIGHT);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
index 85e2f8e9d..597f04d6b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -44,18 +43,17 @@ import org.sufficientlysecure.keychain.ui.widget.EmailEditText;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;
public class CreateKeyEmailFragment extends Fragment {
+ private CreateKeyActivity mCreateKeyActivity;
+ private EmailEditText mEmailEdit;
+ private ArrayList<EmailAdapter.ViewModel> mAdditionalEmailModels = new ArrayList<>();
+ private EmailAdapter mEmailAdapter;
- CreateKeyActivity mCreateKeyActivity;
- EmailEditText mEmailEdit;
- RecyclerView mEmailsRecyclerView;
- View mBackButton;
- View mNextButton;
-
- ArrayList<EmailAdapter.ViewModel> mAdditionalEmailModels;
-
- EmailAdapter mEmailAdapter;
+ // NOTE: Do not use more complicated pattern like defined in android.util.Patterns.EMAIL_ADDRESS
+ // EMAIL_ADDRESS fails for mails with umlauts for example
+ private static final Pattern EMAIL_PATTERN = Pattern.compile("^[\\S]+@[\\S]+\\.[a-z]+$");
/**
* Creates new instance of this fragment
@@ -73,14 +71,13 @@ public class CreateKeyEmailFragment extends Fragment {
* Checks if text of given EditText is not empty. If it is empty an error is
* set and the EditText gets the focus.
*
- * @param context
* @param editText
* @return true if EditText is not empty
*/
- private static boolean isEditTextNotEmpty(Context context, EditText editText) {
+ private boolean isMainEmailValid(EditText editText) {
boolean output = true;
- if (editText.getText().length() == 0) {
- editText.setError(context.getString(R.string.create_key_empty));
+ if (!checkEmail(editText.getText().toString(), false)) {
+ editText.setError(getString(R.string.create_key_empty));
editText.requestFocus();
output = false;
} else {
@@ -95,9 +92,9 @@ public class CreateKeyEmailFragment extends Fragment {
View view = inflater.inflate(R.layout.create_key_email_fragment, container, false);
mEmailEdit = (EmailEditText) view.findViewById(R.id.create_key_email);
- mBackButton = view.findViewById(R.id.create_key_back_button);
- mNextButton = view.findViewById(R.id.create_key_next_button);
- mEmailsRecyclerView = (RecyclerView) view.findViewById(R.id.create_key_emails);
+ View backButton = view.findViewById(R.id.create_key_back_button);
+ View nextButton = view.findViewById(R.id.create_key_next_button);
+ RecyclerView emailsRecyclerView = (RecyclerView) view.findViewById(R.id.create_key_emails);
// initial values
mEmailEdit.setText(mCreateKeyActivity.mEmail);
@@ -106,29 +103,21 @@ public class CreateKeyEmailFragment extends Fragment {
if (mCreateKeyActivity.mEmail == null) {
mEmailEdit.requestFocus();
}
- mBackButton.setOnClickListener(new View.OnClickListener() {
+ backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
}
});
- mNextButton.setOnClickListener(new View.OnClickListener() {
+ nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextClicked();
}
});
- mEmailsRecyclerView.setHasFixedSize(true);
- mEmailsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
- mEmailsRecyclerView.setItemAnimator(new DefaultItemAnimator());
-
- // initial values
- if (mAdditionalEmailModels == null) {
- mAdditionalEmailModels = new ArrayList<>();
- if (mCreateKeyActivity.mAdditionalEmails != null) {
- mEmailAdapter.addAll(mCreateKeyActivity.mAdditionalEmails);
- }
- }
+ emailsRecyclerView.setHasFixedSize(true);
+ emailsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ emailsRecyclerView.setItemAnimator(new DefaultItemAnimator());
if (mEmailAdapter == null) {
mEmailAdapter = new EmailAdapter(mAdditionalEmailModels, new View.OnClickListener() {
@@ -137,13 +126,77 @@ public class CreateKeyEmailFragment extends Fragment {
addEmail();
}
});
+
+ if (mCreateKeyActivity.mAdditionalEmails != null) {
+ mEmailAdapter.addAll(mCreateKeyActivity.mAdditionalEmails);
+ }
}
- mEmailsRecyclerView.setAdapter(mEmailAdapter);
+ emailsRecyclerView.setAdapter(mEmailAdapter);
return view;
}
+ /**
+ * Checks if a given email is valid
+ *
+ * @param email
+ * @param additionalEmail
+ * @return
+ */
+ private boolean checkEmail(String email, boolean additionalEmail) {
+ // check for email format or if the user did any input
+ if (!isEmailFormatValid(email)) {
+ Notify.create(getActivity(),
+ getString(R.string.create_key_email_invalid_email),
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show(CreateKeyEmailFragment.this);
+ return false;
+ }
+
+ // check for duplicated emails
+ if (!additionalEmail && isEmailDuplicatedInsideAdapter(email) || additionalEmail &&
+ mEmailEdit.getText().length() > 0 && email.equals(mEmailEdit.getText().toString())) {
+ Notify.create(getActivity(),
+ getString(R.string.create_key_email_already_exists_text),
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show(CreateKeyEmailFragment.this);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks the email format
+ * Uses the default Android Email Pattern
+ *
+ * @param email
+ * @return
+ */
+ private boolean isEmailFormatValid(String email) {
+ // check for email format or if the user did any input
+ return !(email.length() == 0 || !EMAIL_PATTERN.matcher(email).matches());
+ }
+
+ /**
+ * Checks for duplicated emails inside the additional email adapter.
+ *
+ * @param email
+ * @return
+ */
+ private boolean isEmailDuplicatedInsideAdapter(String email) {
+ //check for duplicated emails inside the adapter
+ for (EmailAdapter.ViewModel model : mAdditionalEmailModels) {
+ if (email.equals(model.email)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Displays a dialog fragment for the user to input a valid email.
+ */
private void addEmail() {
Handler returnHandler = new Handler() {
@Override
@@ -153,34 +206,17 @@ public class CreateKeyEmailFragment extends Fragment {
String email = data.getString(AddEmailDialogFragment.MESSAGE_DATA_EMAIL);
- if (email.length() > 0 && mEmailEdit.getText().length() > 0 &&
- email.equals(mEmailEdit.getText().toString())) {
- Notify.create(getActivity(),
- getString(R.string.create_key_email_already_exists_text),
- Notify.LENGTH_LONG, Notify.Style.ERROR).show();
- return;
- }
- //check for duplicated emails inside the adapter
- for (EmailAdapter.ViewModel model : mAdditionalEmailModels) {
- if (email.equals(model.email)) {
- Notify.create(getActivity(),
- getString(R.string.create_key_email_already_exists_text),
- Notify.LENGTH_LONG, Notify.Style.ERROR).show();
- return;
- }
+ if (checkEmail(email, true)) {
+ // add new user id
+ mEmailAdapter.add(email);
}
-
- // add new user id
- mEmailAdapter.add(email);
}
}
};
-
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(returnHandler);
AddEmailDialogFragment addEmailDialog = AddEmailDialogFragment.newInstance(messenger);
-
addEmailDialog.show(getActivity().getSupportFragmentManager(), "addEmailDialog");
}
@@ -191,7 +227,7 @@ public class CreateKeyEmailFragment extends Fragment {
}
private void nextClicked() {
- if (isEditTextNotEmpty(getActivity(), mEmailEdit)) {
+ if (isMainEmailValid(mEmailEdit)) {
// save state
mCreateKeyActivity.mEmail = mEmailEdit.getText().toString();
mCreateKeyActivity.mAdditionalEmails = getAdditionalEmails();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java
index 32173edf7..3379e0a6d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java
@@ -21,7 +21,6 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.text.Editable;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.LayoutInflater;
@@ -37,9 +36,6 @@ import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
import org.sufficientlysecure.keychain.ui.widget.PassphraseEditText;
import org.sufficientlysecure.keychain.util.Passphrase;
-import java.util.ArrayList;
-import java.util.Arrays;
-
public class CreateKeyPassphraseFragment extends Fragment {
// view
@@ -111,8 +107,8 @@ public class CreateKeyPassphraseFragment extends Fragment {
// initial values
// TODO: using String here is unsafe...
if (mCreateKeyActivity.mPassphrase != null) {
- mPassphraseEdit.setText(Arrays.toString(mCreateKeyActivity.mPassphrase.getCharArray()));
- mPassphraseEditAgain.setText(Arrays.toString(mCreateKeyActivity.mPassphrase.getCharArray()));
+ mPassphraseEdit.setText(new String(mCreateKeyActivity.mPassphrase.getCharArray()));
+ mPassphraseEditAgain.setText(new String(mCreateKeyActivity.mPassphrase.getCharArray()));
}
mPassphraseEdit.requestFocus();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
index 3f56949f5..1a844e6e4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014-2015 Dominik Schürmann <dominik@dominikschuermann.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,37 +18,20 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.Fragment;
-import android.support.v7.widget.DefaultItemAnimator;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageButton;
import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
-import org.sufficientlysecure.keychain.ui.dialog.AddEmailDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
-import org.sufficientlysecure.keychain.ui.widget.EmailEditText;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
-import java.util.ArrayList;
-import java.util.List;
-
public class CreateKeyStartFragment extends Fragment {
CreateKeyActivity mCreateKeyActivity;
@@ -56,8 +39,8 @@ public class CreateKeyStartFragment extends Fragment {
View mCreateKey;
View mImportKey;
View mYubiKey;
- TextView mCancel;
- public static final int REQUEST_CODE_CREATE_OR_IMPORT_KEY = 0x00007012;
+ TextView mSkipOrCancel;
+ public static final int REQUEST_CODE_IMPORT_KEY = 0x00007012;
/**
* Creates new instance of this fragment
@@ -79,12 +62,12 @@ public class CreateKeyStartFragment extends Fragment {
mCreateKey = view.findViewById(R.id.create_key_create_key_button);
mImportKey = view.findViewById(R.id.create_key_import_button);
mYubiKey = view.findViewById(R.id.create_key_yubikey_button);
- mCancel = (TextView) view.findViewById(R.id.create_key_cancel);
+ mSkipOrCancel = (TextView) view.findViewById(R.id.create_key_cancel);
if (mCreateKeyActivity.mFirstTime) {
- mCancel.setText(R.string.first_time_skip);
+ mSkipOrCancel.setText(R.string.first_time_skip);
} else {
- mCancel.setText(R.string.btn_do_not_save);
+ mSkipOrCancel.setText(R.string.btn_do_not_save);
}
mCreateKey.setOnClickListener(new View.OnClickListener() {
@@ -98,7 +81,7 @@ public class CreateKeyStartFragment extends Fragment {
mYubiKey.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- CreateKeyYubiWaitFragment frag = new CreateKeyYubiWaitFragment();
+ CreateKeyYubiKeyWaitFragment frag = new CreateKeyYubiKeyWaitFragment();
mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
}
});
@@ -108,48 +91,48 @@ public class CreateKeyStartFragment extends Fragment {
public void onClick(View v) {
Intent intent = new Intent(mCreateKeyActivity, ImportKeysActivity.class);
intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN);
- startActivityForResult(intent, REQUEST_CODE_CREATE_OR_IMPORT_KEY);
+ startActivityForResult(intent, REQUEST_CODE_IMPORT_KEY);
}
});
- mCancel.setOnClickListener(new View.OnClickListener() {
+ mSkipOrCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- finishSetup(null);
+ if (mCreateKeyActivity.mFirstTime) {
+ Preferences prefs = Preferences.getPreferences(mCreateKeyActivity);
+ prefs.setFirstTime(false);
+ Intent intent = new Intent(mCreateKeyActivity, MainActivity.class);
+ startActivity(intent);
+ mCreateKeyActivity.finish();
+ } else {
+ // just finish activity and return data
+ mCreateKeyActivity.setResult(Activity.RESULT_CANCELED);
+ mCreateKeyActivity.finish();
+ }
}
});
return view;
}
-
- private void finishSetup(Intent srcData) {
- if (mCreateKeyActivity.mFirstTime) {
- Preferences prefs = Preferences.getPreferences(mCreateKeyActivity);
- prefs.setFirstTime(false);
- }
- Intent intent = new Intent(mCreateKeyActivity, MainActivity.class);
- // give intent through to display notify
- if (srcData != null) {
- intent.putExtras(srcData);
- }
- startActivity(intent);
- mCreateKeyActivity.finish();
- }
-
- // workaround for https://code.google.com/p/android/issues/detail?id=61394
-// @Override
-// public boolean onKeyDown(int keyCode, KeyEvent event) {
-// return keyCode == KeyEvent.KEYCODE_MENU || super.onKeyDown(keyCode, event);
-// }
-
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == REQUEST_CODE_CREATE_OR_IMPORT_KEY) {
+ if (requestCode == REQUEST_CODE_IMPORT_KEY) {
if (resultCode == Activity.RESULT_OK) {
- finishSetup(data);
+ if (mCreateKeyActivity.mFirstTime) {
+ Preferences prefs = Preferences.getPreferences(mCreateKeyActivity);
+ prefs.setFirstTime(false);
+ Intent intent = new Intent(mCreateKeyActivity, MainActivity.class);
+ intent.putExtras(data);
+ startActivity(intent);
+ mCreateKeyActivity.finish();
+ } else {
+ // just finish activity and return data
+ mCreateKeyActivity.setResult(Activity.RESULT_OK, data);
+ mCreateKeyActivity.finish();
+ }
}
} else {
Log.e(Constants.TAG, "No valid request code!");
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
index db62d53c5..4c7d1dfbd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
@@ -48,7 +48,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Preferences;
-public class CreateKeyYubiImportFragment extends Fragment implements NfcListenerFragment {
+public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListenerFragment {
private static final String ARG_FINGERPRINT = "fingerprint";
public static final String ARG_AID = "aid";
@@ -67,7 +67,7 @@ public class CreateKeyYubiImportFragment extends Fragment implements NfcListener
public static Fragment createInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) {
- CreateKeyYubiImportFragment frag = new CreateKeyYubiImportFragment();
+ CreateKeyYubiKeyImportFragment frag = new CreateKeyYubiKeyImportFragment();
Bundle args = new Bundle();
args.putByteArray(ARG_FINGERPRINT, scannedFingerprints);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java
index 579dddf79..0b8586c0a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyWaitFragment.java
@@ -28,7 +28,7 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
-public class CreateKeyYubiWaitFragment extends Fragment {
+public class CreateKeyYubiKeyWaitFragment extends Fragment {
CreateKeyActivity mCreateKeyActivity;
View mBackButton;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
index dce2386b5..c9a590c5b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
@@ -25,7 +25,7 @@ import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.util.Log;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
index 6c1902af1..234362edc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
@@ -86,12 +86,12 @@ public class DecryptFilesFragment extends DecryptFragment {
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.decrypt_file_fragment, container, false);
+ View view = inflater.inflate(R.layout.decrypt_files_fragment, container, false);
- mFilename = (TextView) view.findViewById(R.id.decrypt_file_filename);
- mDeleteAfter = (CheckBox) view.findViewById(R.id.decrypt_file_delete_after_decryption);
- mDecryptButton = view.findViewById(R.id.decrypt_file_action_decrypt);
- view.findViewById(R.id.decrypt_file_browse).setOnClickListener(new View.OnClickListener() {
+ mFilename = (TextView) view.findViewById(R.id.decrypt_files_filename);
+ mDeleteAfter = (CheckBox) view.findViewById(R.id.decrypt_files_delete_after_decryption);
+ mDecryptButton = view.findViewById(R.id.decrypt_files_action_decrypt);
+ view.findViewById(R.id.decrypt_files_browse).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
FileHelper.openDocument(DecryptFilesFragment.this, "*/*", REQUEST_CODE_INPUT);
@@ -232,7 +232,6 @@ public class DecryptFilesFragment extends DecryptFragment {
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
if (pgpResult.success()) {
-
switch (mCurrentCryptoOperation) {
case KeychainIntentService.ACTION_DECRYPT_METADATA: {
askForOutputFilename(pgpResult.getDecryptMetadata().getFilename());
@@ -264,9 +263,8 @@ public class DecryptFilesFragment extends DecryptFragment {
break;
}
}
- } else {
- pgpResult.createNotify(getActivity()).show();
}
+ pgpResult.createNotify(getActivity()).show(DecryptFilesFragment.this);
}
}
@@ -309,7 +307,7 @@ public class DecryptFilesFragment extends DecryptFragment {
}
@Override
- protected void onVerifyLoaded(boolean verified) {
+ protected void onVerifyLoaded(boolean hideErrorOverlay) {
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
index 9c51893ce..e9bc42a4d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -30,6 +30,7 @@ import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.View;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -55,24 +56,24 @@ import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.util.Preferences;
-
public abstract class DecryptFragment extends CryptoOperationFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
public static final int LOADER_ID_UNIFIED = 0;
protected LinearLayout mResultLayout;
-
protected ImageView mEncryptionIcon;
protected TextView mEncryptionText;
protected ImageView mSignatureIcon;
protected TextView mSignatureText;
-
protected View mSignatureLayout;
protected TextView mSignatureName;
protected TextView mSignatureEmail;
protected TextView mSignatureAction;
+ private LinearLayout mContentLayout;
+ private LinearLayout mErrorOverlayLayout;
+
private OpenPgpSignatureResult mSignatureResult;
@Override
@@ -82,7 +83,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
// NOTE: These views are inside the activity!
mResultLayout = (LinearLayout) getActivity().findViewById(R.id.result_main_layout);
mResultLayout.setVisibility(View.GONE);
-
mEncryptionIcon = (ImageView) getActivity().findViewById(R.id.result_encryption_icon);
mEncryptionText = (TextView) getActivity().findViewById(R.id.result_encryption_text);
mSignatureIcon = (ImageView) getActivity().findViewById(R.id.result_signature_icon);
@@ -92,6 +92,17 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
mSignatureEmail = (TextView) getActivity().findViewById(R.id.result_signature_email);
mSignatureAction = (TextView) getActivity().findViewById(R.id.result_signature_action);
+ // Overlay
+ mContentLayout = (LinearLayout) view.findViewById(R.id.decrypt_content);
+ mErrorOverlayLayout = (LinearLayout) view.findViewById(R.id.decrypt_error_overlay);
+ Button vErrorOverlayButton = (Button) view.findViewById(R.id.decrypt_error_overlay_button);
+ vErrorOverlayButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+ }
+ });
}
private void lookupUnknownKey(long unknownKeyId) {
@@ -113,12 +124,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
final ImportKeyResult result =
returnData.getParcelable(OperationResult.EXTRA_RESULT);
- // if (!result.success()) {
- result.createNotify(getActivity()).show();
- // }
+ result.createNotify(getActivity()).show();
getLoaderManager().restartLoader(LOADER_ID_UNIFIED, null, DecryptFragment.this);
-
}
}
};
@@ -153,7 +161,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
getActivity().startService(intent);
-
}
private void showKey(long keyId) {
@@ -191,6 +198,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
getLoaderManager().destroyLoader(LOADER_ID_UNIFIED);
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
onVerifyLoaded(true);
return;
@@ -205,7 +215,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
}
getLoaderManager().restartLoader(LOADER_ID_UNIFIED, null, this);
-
}
private void setSignatureLayoutVisibility(int visibility) {
@@ -228,8 +237,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
KeychainContract.KeyRings._ID,
KeychainContract.KeyRings.MASTER_KEY_ID,
KeychainContract.KeyRings.USER_ID,
- KeychainContract.KeyRings.IS_REVOKED,
- KeychainContract.KeyRings.IS_EXPIRED,
KeychainContract.KeyRings.VERIFIED,
KeychainContract.KeyRings.HAS_ANY_SECRET,
};
@@ -237,10 +244,8 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
@SuppressWarnings("unused")
static final int INDEX_MASTER_KEY_ID = 1;
static final int INDEX_USER_ID = 2;
- static final int INDEX_IS_REVOKED = 3;
- static final int INDEX_IS_EXPIRED = 4;
- static final int INDEX_VERIFIED = 5;
- static final int INDEX_HAS_ANY_SECRET = 6;
+ static final int INDEX_VERIFIED = 3;
+ static final int INDEX_HAS_ANY_SECRET = 4;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
@@ -282,8 +287,10 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
getActivity(), mSignatureResult.getKeyId()));
}
- boolean isRevoked = data.getInt(INDEX_IS_REVOKED) != 0;
- boolean isExpired = data.getInt(INDEX_IS_EXPIRED) != 0;
+ // NOTE: Don't use revoked and expired fields from database, they don't show
+ // revoked/expired subkeys
+ boolean isRevoked = mSignatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED;
+ boolean isExpired = mSignatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED;
boolean isVerified = data.getInt(INDEX_VERIFIED) > 0;
boolean isYours = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
@@ -294,6 +301,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
setSignatureLayoutVisibility(View.VISIBLE);
setShowAction(signatureKeyId);
+ mErrorOverlayLayout.setVisibility(View.VISIBLE);
+ mContentLayout.setVisibility(View.GONE);
+
onVerifyLoaded(false);
} else if (isExpired) {
@@ -303,6 +313,22 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
setSignatureLayoutVisibility(View.VISIBLE);
setShowAction(signatureKeyId);
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
+ onVerifyLoaded(true);
+
+ } else if (isYours) {
+
+ mSignatureText.setText(R.string.decrypt_result_signature_secret);
+ KeyFormattingUtils.setStatusImage(getActivity(), mSignatureIcon, mSignatureText, State.VERIFIED);
+
+ setSignatureLayoutVisibility(View.VISIBLE);
+ setShowAction(signatureKeyId);
+
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
onVerifyLoaded(true);
} else if (isYours) {
@@ -322,6 +348,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
setSignatureLayoutVisibility(View.VISIBLE);
setShowAction(signatureKeyId);
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
onVerifyLoaded(true);
} else {
@@ -331,6 +360,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
setSignatureLayoutVisibility(View.VISIBLE);
setShowAction(signatureKeyId);
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
onVerifyLoaded(true);
}
@@ -344,7 +376,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
}
setSignatureLayoutVisibility(View.GONE);
-
}
private void showUnknownKeyStatus() {
@@ -388,6 +419,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
}
});
+ mErrorOverlayLayout.setVisibility(View.GONE);
+ mContentLayout.setVisibility(View.VISIBLE);
+
onVerifyLoaded(true);
break;
@@ -399,6 +433,9 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
setSignatureLayoutVisibility(View.GONE);
+ mErrorOverlayLayout.setVisibility(View.VISIBLE);
+ mContentLayout.setVisibility(View.GONE);
+
onVerifyLoaded(false);
break;
}
@@ -407,6 +444,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements
}
- protected abstract void onVerifyLoaded(boolean verified);
+ protected abstract void onVerifyLoaded(boolean hideErrorOverlay);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
index 728e3ba41..e2eba3947 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2012-2015 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
*
* This program is free software: you can redistribute it and/or modify
@@ -23,16 +23,16 @@ import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
+import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
-import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
import java.util.regex.Matcher;
@@ -138,8 +138,6 @@ public class DecryptTextActivity extends BaseActivity {
/**
* Handles all actions with this intent
- *
- * @param intent
*/
private void handleActions(Bundle savedInstanceState, Intent intent) {
String action = intent.getAction();
@@ -162,10 +160,14 @@ public class DecryptTextActivity extends BaseActivity {
if (sharedText != null) {
loadFragment(savedInstanceState, sharedText);
} else {
- Notify.create(this, R.string.error_invalid_data, Notify.Style.ERROR).show();
+ Log.e(Constants.TAG, "EXTRA_TEXT does not contain PGP content!");
+ Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show();
+ finish();
}
} else {
Log.e(Constants.TAG, "ACTION_SEND received non-plaintext, this should not happen in this activity!");
+ Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show();
+ finish();
}
} else if (ACTION_DECRYPT_TEXT.equals(action)) {
Log.d(Constants.TAG, "ACTION_DECRYPT_TEXT");
@@ -176,7 +178,9 @@ public class DecryptTextActivity extends BaseActivity {
if (extraText != null) {
loadFragment(savedInstanceState, extraText);
} else {
- Notify.create(this, R.string.error_invalid_data, Notify.Style.ERROR).show();
+ Log.e(Constants.TAG, "EXTRA_TEXT does not contain PGP content!");
+ Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show();
+ finish();
}
} else if (ACTION_DECRYPT_FROM_CLIPBOARD.equals(action)) {
Log.d(Constants.TAG, "ACTION_DECRYPT_FROM_CLIPBOARD");
@@ -191,6 +195,7 @@ public class DecryptTextActivity extends BaseActivity {
}
} else if (ACTION_DECRYPT_TEXT.equals(action)) {
Log.e(Constants.TAG, "Include the extra 'text' in your Intent!");
+ Toast.makeText(this, R.string.error_invalid_data, Toast.LENGTH_LONG).show();
finish();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
index 6f576a112..381da6f0d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
@@ -50,8 +50,6 @@ public class DecryptTextFragment extends DecryptFragment {
public static final String ARG_CIPHERTEXT = "ciphertext";
// view
- private LinearLayout mValidLayout;
- private LinearLayout mInvalidLayout;
private TextView mText;
// model
@@ -78,19 +76,8 @@ public class DecryptTextFragment extends DecryptFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.decrypt_text_fragment, container, false);
- mValidLayout = (LinearLayout) view.findViewById(R.id.decrypt_text_valid);
- mInvalidLayout = (LinearLayout) view.findViewById(R.id.decrypt_text_invalid);
mText = (TextView) view.findViewById(R.id.decrypt_text_plaintext);
- Button vInvalidButton = (Button) view.findViewById(R.id.decrypt_text_invalid_button);
- vInvalidButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mInvalidLayout.setVisibility(View.GONE);
- mValidLayout.setVisibility(View.VISIBLE);
- }
- });
-
return view;
}
@@ -203,7 +190,6 @@ public class DecryptTextFragment extends DecryptFragment {
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
if (pgpResult.success()) {
-
byte[] decryptedMessage = returnData
.getByteArray(KeychainIntentService.RESULT_DECRYPTED_BYTES);
String displayMessage;
@@ -219,15 +205,12 @@ public class DecryptTextFragment extends DecryptFragment {
}
mText.setText(displayMessage);
- pgpResult.createNotify(getActivity()).show();
-
// display signature result in activity
loadVerifyResult(pgpResult);
-
} else {
- pgpResult.createNotify(getActivity()).show();
// TODO: show also invalid layout with different text?
}
+ pgpResult.createNotify(getActivity()).show(DecryptTextFragment.this);
}
}
};
@@ -244,18 +227,8 @@ public class DecryptTextFragment extends DecryptFragment {
}
@Override
- protected void onVerifyLoaded(boolean verified) {
-
- mShowMenuOptions = verified;
+ protected void onVerifyLoaded(boolean hideErrorOverlay) {
+ mShowMenuOptions = hideErrorOverlay;
getActivity().supportInvalidateOptionsMenu();
-
- if (verified) {
- mInvalidLayout.setVisibility(View.GONE);
- mValidLayout.setVisibility(View.VISIBLE);
- } else {
- mInvalidLayout.setVisibility(View.VISIBLE);
- mValidLayout.setVisibility(View.GONE);
- }
-
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
index 64e908b1a..b3ec60890 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
@@ -28,7 +28,7 @@ import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.util.Passphrase;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
index dd6dd6594..52d098adc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
@@ -26,7 +26,7 @@ import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Passphrase;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 5d9950db6..4cba62d5b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -30,16 +30,16 @@ import android.view.ViewGroup;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
import org.sufficientlysecure.keychain.service.CloudImportService;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
-import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
@@ -346,60 +346,66 @@ public class ImportKeysActivity extends BaseNfcActivity {
mListFragment.loadNew(loaderState);
}
+ private void handleMessage(Message message) {
+ if (message.arg1 == ServiceProgressHandler.MessageStatus.OKAY.ordinal()) {
+ // get returned data bundle
+ Bundle returnData = message.getData();
+ if (returnData == null) {
+ return;
+ }
+ final ImportKeyResult result =
+ returnData.getParcelable(OperationResult.EXTRA_RESULT);
+ if (result == null) {
+ Log.e(Constants.TAG, "result == null");
+ return;
+ }
+
+ if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction())
+ || ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(getIntent().getAction())) {
+ Intent intent = new Intent();
+ intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
+ ImportKeysActivity.this.setResult(RESULT_OK, intent);
+ ImportKeysActivity.this.finish();
+ return;
+ }
+ if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(getIntent().getAction())) {
+ ImportKeysActivity.this.setResult(RESULT_OK, mPendingIntentData);
+ ImportKeysActivity.this.finish();
+ return;
+ }
+
+ result.createNotify(ImportKeysActivity.this)
+ .show((ViewGroup) findViewById(R.id.import_snackbar));
+ }
+ }
+
/**
* Import keys with mImportData
*/
public void importKeys() {
- // Message is received after importing is done in CloudImportService
- ServiceProgressHandler saveHandler = new ServiceProgressHandler(
- this,
- getString(R.string.progress_importing),
- ProgressDialog.STYLE_HORIZONTAL,
- true,
- ProgressDialogFragment.ServiceType.CLOUD_IMPORT) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final ImportKeyResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- Log.e(Constants.TAG, "result == null");
- return;
- }
-
- if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction())
- || ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(getIntent().getAction())) {
- Intent intent = new Intent();
- intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
- ImportKeysActivity.this.setResult(RESULT_OK, intent);
- ImportKeysActivity.this.finish();
- return;
- }
- if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(getIntent().getAction())) {
- ImportKeysActivity.this.setResult(RESULT_OK, mPendingIntentData);
- ImportKeysActivity.this.finish();
- return;
- }
-
- result.createNotify(ImportKeysActivity.this)
- .show((ViewGroup) findViewById(R.id.import_snackbar));
- }
- }
- };
-
ImportKeysListFragment.LoaderState ls = mListFragment.getLoaderState();
if (ls instanceof ImportKeysListFragment.BytesLoaderState) {
Log.d(Constants.TAG, "importKeys started");
+ ServiceProgressHandler serviceHandler = new ServiceProgressHandler(
+ this,
+ getString(R.string.progress_importing),
+ ProgressDialog.STYLE_HORIZONTAL,
+ true,
+ ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ ImportKeysActivity.this.handleMessage(message);
+ }
+ };
+
+ // TODO: Currently not using CloudImport here due to https://github.com/open-keychain/open-keychain/issues/1221
// Send all information needed to service to import key in other thread
- Intent intent = new Intent(this, CloudImportService.class);
+ Intent intent = new Intent(this, KeychainIntentService.class);
+
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
// fill values for this action
Bundle data = new Bundle();
@@ -417,14 +423,14 @@ public class ImportKeysActivity extends BaseNfcActivity {
new ParcelableFileCache<>(this, "key_import.pcl");
cache.writeCache(selectedEntries);
- intent.putExtra(CloudImportService.EXTRA_DATA, data);
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger);
+ Messenger messenger = new Messenger(serviceHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
- saveHandler.showProgressDialog(this);
+ serviceHandler.showProgressDialog(this);
// start service with intent
startService(intent);
@@ -436,6 +442,20 @@ public class ImportKeysActivity extends BaseNfcActivity {
} else if (ls instanceof ImportKeysListFragment.CloudLoaderState) {
ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls;
+ ServiceProgressHandler serviceHandler = new ServiceProgressHandler(
+ this,
+ getString(R.string.progress_importing),
+ ProgressDialog.STYLE_HORIZONTAL,
+ true,
+ ProgressDialogFragment.ServiceType.CLOUD_IMPORT) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ ImportKeysActivity.this.handleMessage(message);
+ }
+ };
+
// Send all information needed to service to query keys in other thread
Intent intent = new Intent(this, CloudImportService.class);
@@ -460,11 +480,11 @@ public class ImportKeysActivity extends BaseNfcActivity {
intent.putExtra(CloudImportService.EXTRA_DATA, data);
// Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
+ Messenger messenger = new Messenger(serviceHandler);
intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger);
// show progress dialog
- saveHandler.showProgressDialog(this);
+ serviceHandler.showProgressDialog(this);
// start service with intent
startService(intent);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
index 29f2511a0..dc8752d1a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -37,7 +37,7 @@ import com.google.zxing.integration.android.IntentResult;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 8c4ea1884..d8c3e0350 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -70,7 +70,6 @@ import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java
index 05cf64092..f571ba1e6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java
@@ -64,7 +64,7 @@ public class MainActivity extends AppCompatActivity implements FabContainer {
transaction.replace(R.id.main_fragment_container, mainFragment);
transaction.commit();
- mToolbar = (Toolbar) findViewById(R.id.activity_main_toolbar);
+ mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitle(R.string.app_name);
setSupportActionBar(mToolbar);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java
index 6bd3a9303..fde0f62fd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java
@@ -26,6 +26,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
@@ -42,19 +43,24 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.QrCodeUtils;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.NfcHelper;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
import java.io.IOException;
+import java.io.FileNotFoundException;
public class ViewKeyAdvShareFragment extends LoaderFragment implements
@@ -175,11 +181,11 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements
boolean toClipboard) {
try {
String content;
+ byte[] fingerprintData = (byte[]) providerHelper.getGenericData(
+ KeyRings.buildUnifiedKeyRingUri(dataUri),
+ Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
if (fingerprintOnly) {
- byte[] data = (byte[]) providerHelper.getGenericData(
- KeyRings.buildUnifiedKeyRingUri(dataUri),
- Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- String fingerprint = KeyFormattingUtils.convertFingerprintToHex(data);
+ String fingerprint = KeyFormattingUtils.convertFingerprintToHex(fingerprintData);
if (!toClipboard) {
content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
} else {
@@ -213,13 +219,48 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, content);
sendIntent.setType("text/plain");
+
String title;
if (fingerprintOnly) {
title = getResources().getString(R.string.title_share_fingerprint_with);
} else {
title = getResources().getString(R.string.title_share_key);
}
- startActivity(Intent.createChooser(sendIntent, title));
+ Intent shareChooser = Intent.createChooser(sendIntent, title);
+
+ // Bluetooth Share will convert text/plain sent via EXTRA_TEXT to HTML
+ // Add replacement extra to send a text/plain file instead.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ try {
+ String primaryUserId = UncachedKeyRing.decodeFromData(content.getBytes()).
+ getPublicKey().getPrimaryUserIdWithFallback();
+
+ TemporaryStorageProvider shareFileProv = new TemporaryStorageProvider();
+ Uri contentUri = TemporaryStorageProvider.createFile(getActivity(),
+ primaryUserId + Constants.FILE_EXTENSION_ASC);
+
+ BufferedWriter contentWriter = new BufferedWriter(new OutputStreamWriter(
+ new ParcelFileDescriptor.AutoCloseOutputStream(
+ shareFileProv.openFile(contentUri, "w"))));
+ contentWriter.write(content);
+ contentWriter.close();
+
+ // create replacement extras inside try{}:
+ // if file creation fails, just don't add the replacements
+ Bundle replacements = new Bundle();
+ shareChooser.putExtra(Intent.EXTRA_REPLACEMENT_EXTRAS, replacements);
+
+ Bundle bluetoothExtra = new Bundle(sendIntent.getExtras());
+ replacements.putBundle("com.android.bluetooth", bluetoothExtra);
+
+ bluetoothExtra.putParcelable(Intent.EXTRA_STREAM, contentUri);
+ } catch (FileNotFoundException e) {
+ Log.e(Constants.TAG, "error creating temporary Bluetooth key share file!", e);
+ Notify.create(getActivity(), R.string.error_bluetooth_file, Notify.Style.ERROR).show();
+ }
+ }
+
+ startActivity(shareChooser);
}
} catch (PgpGeneralException | IOException e) {
Log.e(Constants.TAG, "error processing key!", e);
@@ -379,4 +420,4 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements
}
-} \ No newline at end of file
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
index d9b1fa279..c01a94286 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -202,6 +202,8 @@ public class ViewKeyFragment extends LoaderFragment implements
* In the case of a secret key, "me" (own profile) contact details are loaded.
*/
private void loadLinkedSystemContact(final long contactId) {
+ // contact doesn't exist, stop
+ if(contactId == -1) return;
final Context context = mSystemContactName.getContext();
final ContentResolver resolver = context.getContentResolver();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java
index f09dc1a4f..3dbae09b6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java
@@ -18,15 +18,12 @@
package org.sufficientlysecure.keychain.ui.adapter;
-import java.util.Calendar;
import java.util.Date;
-import java.util.TimeZone;
import android.content.Context;
import android.database.Cursor;
import android.graphics.PorterDuff;
import android.support.v4.widget.CursorAdapter;
-import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -176,9 +173,8 @@ public class KeyAdapter extends CursorAdapter {
| DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_YEAR
| DateUtils.FORMAT_ABBREV_MONTH);
-
- mCreationDate.setText(context.getString(R.string.label_creation,
- dateTime));
+ mCreationDate.setText(context.getString(R.string.label_key_created,
+ dateTime));
mCreationDate.setVisibility(View.VISIBLE);
} else {
mCreationDate.setVisibility(View.GONE);
@@ -281,20 +277,6 @@ public class KeyAdapter extends CursorAdapter {
}
}
- public boolean hasDuplicate() {
- return mHasDuplicate;
- }
-
- public String getCreationDate(Context context) {
- Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- creationCal.setTime(mCreation);
- // convert from UTC to time zone of device
- creationCal.setTimeZone(TimeZone.getDefault());
-
- return context.getString(R.string.label_creation) + ": "
- + DateFormat.getDateFormat(context).format(creationCal.getTime());
- }
-
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
index 1ccb910d0..6bbf41a88 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
@@ -140,8 +140,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
| DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_YEAR
| DateUtils.FORMAT_ABBREV_MONTH);
-
- h.creation.setText(context.getString(R.string.label_creation, dateTime));
+ h.creation.setText(context.getString(R.string.label_key_created, dateTime));
h.creation.setVisibility(View.VISIBLE);
} else {
h.creation.setVisibility(View.GONE);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java
index 5d5ca533e..5b91b9d37 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEmailDialogFragment.java
@@ -112,9 +112,11 @@ public class AddEmailDialogFragment extends DialogFragment implements OnEditorAc
mEmail.post(new Runnable() {
@Override
public void run() {
- InputMethodManager imm = (InputMethodManager) getActivity()
- .getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.showSoftInput(mEmail, InputMethodManager.SHOW_IMPLICIT);
+ if(getActivity() != null) {
+ InputMethodManager imm = (InputMethodManager) getActivity()
+ .getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.showSoftInput(mEmail, InputMethodManager.SHOW_IMPLICIT);
+ }
}
});
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java
index b58f584c8..af9d175ff 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java
@@ -94,12 +94,12 @@ public class ProgressDialogFragment extends DialogFragment {
/** Updates progress of dialog */
public void setProgress(String message, int progress, int max) {
- if (mIsCancelled) {
+ ProgressDialog dialog = (ProgressDialog) getDialog();
+
+ if (mIsCancelled || dialog == null) {
return;
}
- ProgressDialog dialog = (ProgressDialog) getDialog();
-
dialog.setMessage(message);
dialog.setProgress(progress);
dialog.setMax(max);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
index ac7e7a487..3d98034d2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
@@ -216,7 +216,16 @@ public class KeyFormattingUtils {
* @return
*/
public static String convertFingerprintToHex(byte[] fingerprint) {
- return Hex.toHexString(fingerprint, 0, 20).toLowerCase(Locale.ENGLISH);
+ // NOTE: Even though v3 keys are not imported we need to support both fingerprints for
+ // display/comparison before import
+ // Also better cut of unneeded parts, e.g., for fingerprints returned from YubiKeys
+ if (fingerprint.length < 20) {
+ // v3 key fingerprint with 128 bit (MD5)
+ return Hex.toHexString(fingerprint, 0, 16).toLowerCase(Locale.ENGLISH);
+ } else {
+ // v4 key fingerprint with 160 bit (SHA1)
+ return Hex.toHexString(fingerprint, 0, 20).toLowerCase(Locale.ENGLISH);
+ }
}
public static long getKeyIdFromFingerprint(byte[] fingerprint) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
index 525bc26ca..63a1aade9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
@@ -136,7 +136,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView
where += " AND " + KeyRings.USER_ID + " LIKE ?";
return new CursorLoader(getContext(), baseUri, KeyAdapter.PROJECTION, where,
- new String[] { "%" + query + "%" }, null);
+ new String[]{"%" + query + "%"}, null);
}
mAdapter.setSearchQuery(null);
@@ -156,7 +156,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView
@Override
public void showDropDown() {
- if (mAdapter.getCursor().isClosed()) {
+ if (mAdapter == null || mAdapter.getCursor() == null || mAdapter.getCursor().isClosed()) {
return;
}
super.showDropDown();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
index 8cf15a75a..61b7c718b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
@@ -26,7 +26,7 @@ import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.widget.AppCompatSpinner;
-import android.text.format.DateFormat;
+import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
@@ -42,10 +42,6 @@ import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.util.Log;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
/**
* Use AppCompatSpinner from AppCompat lib instead of Spinner. Fixes white dropdown icon.
* Related: http://stackoverflow.com/a/27713090
@@ -164,14 +160,14 @@ public abstract class KeySpinner extends AppCompatSpinner implements LoaderManag
boolean duplicate = cursor.getLong(mIndexDuplicate) > 0;
if (duplicate) {
- Date creationDate = new Date(cursor.getLong(mIndexCreationDate) * 1000);
- Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- creationCal.setTime(creationDate);
- // convert from UTC to time zone of device
- creationCal.setTimeZone(TimeZone.getDefault());
-
- vDuplicate.setText(context.getString(R.string.label_creation) + ": "
- + DateFormat.getDateFormat(context).format(creationCal.getTime()));
+ String dateTime = DateUtils.formatDateTime(context,
+ cursor.getLong(mIndexCreationDate) * 1000,
+ DateUtils.FORMAT_SHOW_DATE
+ | DateUtils.FORMAT_SHOW_TIME
+ | DateUtils.FORMAT_SHOW_YEAR
+ | DateUtils.FORMAT_ABBREV_MONTH);
+
+ vDuplicate.setText(context.getString(R.string.label_key_created, dateTime));
vDuplicate.setVisibility(View.VISIBLE);
} else {
vDuplicate.setVisibility(View.GONE);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
index 609288bf1..e1efd5abc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
@@ -446,6 +446,13 @@ public class ContactHelper {
writeKeysToMainProfileContact(context, resolver);
+ writeKeysToNormalContacts(context, resolver);
+ }
+
+ private static void writeKeysToNormalContacts(Context context, ContentResolver resolver) {
+ // delete raw contacts flagged for deletion by user so they can be reinserted
+ deleteFlaggedNormalRawContacts(resolver);
+
Set<Long> deletedKeys = getRawContactMasterKeyIds(resolver);
// Load all public Keys from OK
@@ -519,6 +526,9 @@ public class ContactHelper {
* @param context
*/
public static void writeKeysToMainProfileContact(Context context, ContentResolver resolver) {
+ // deletes contacts hidden by the user so they can be reinserted if necessary
+ deleteFlaggedMainProfileRawContacts(resolver);
+
Set<Long> keysToDelete = getMainProfileMasterKeyIds(resolver);
// get all keys which have associated secret keys
@@ -585,7 +595,7 @@ public class ContactHelper {
*
* @param resolver
* @param masterKeyId
- * @return
+ * @return number of rows deleted
*/
private static int deleteMainProfileRawContactByMasterKeyId(ContentResolver resolver,
long masterKeyId) {
@@ -603,6 +613,28 @@ public class ContactHelper {
}
/**
+ * deletes all raw contact entries in the "me" contact flagged for deletion ('hidden'),
+ * presumably by the user
+ *
+ * @param resolver
+ * @return number of raw contacts deleted
+ */
+ private static int deleteFlaggedMainProfileRawContacts(ContentResolver resolver) {
+ // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise
+ // would be just flagged for deletion
+ Uri deleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon().
+ appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
+
+ return resolver.delete(deleteUri,
+ ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " +
+ ContactsContract.RawContacts.DELETED + "=?",
+ new String[]{
+ Constants.ACCOUNT_TYPE,
+ "1"
+ });
+ }
+
+ /**
* Delete all raw contacts associated to OpenKeychain, including those from "me" contact
* defined by ContactsContract.Profile
*
@@ -677,6 +709,21 @@ public class ContactHelper {
});
}
+ private static int deleteFlaggedNormalRawContacts(ContentResolver resolver) {
+ // CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise
+ // would be just flagged for deletion
+ Uri deleteUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().
+ appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
+
+ return resolver.delete(deleteUri,
+ ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " +
+ ContactsContract.RawContacts.DELETED + "=?",
+ new String[]{
+ Constants.ACCOUNT_TYPE,
+ "1"
+ });
+ }
+
/**
* @return a set of all key master key ids currently present in the contact db
*/
diff --git a/OpenKeychain/src/main/res/layout/api_remote_select_allowed_keys.xml b/OpenKeychain/src/main/res/layout/api_remote_select_allowed_keys.xml
new file mode 100644
index 000000000..e052ff333
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/api_remote_select_allowed_keys.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:padding="16dp"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/api_select_keys_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/api_select_keys_text" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <FrameLayout
+ android:id="@+id/api_allowed_keys_list_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </ScrollView>
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
index c7f9821eb..4e4b53118 100644
--- a/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
@@ -22,8 +22,7 @@
android:layout_marginTop="16dp"
android:layout_marginLeft="8dp"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="Hold Yubikey against device dawg"
- />
+ android:text="@string/yubikey_create" />
<ImageView
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
deleted file mode 100644
index 60673e475..000000000
--- a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <View
- android:id="@+id/status_divider"
- android:layout_height="1dip"
- android:layout_width="match_parent"
- android:background="?android:attr/listDivider" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="4dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:orientation="horizontal"
-
- android:id="@+id/decrypt_file_browse"
- android:clickable="true"
- android:background="?android:selectableItemBackground">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/label_file_colon"
- android:gravity="center_vertical" />
-
- <TextView
- android:id="@+id/decrypt_file_filename"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:hint="@string/filemanager_title_open"
- android:drawableRight="@drawable/ic_folder_grey_24dp"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_marginBottom="8dp" />
-
- <CheckBox
- android:id="@+id/decrypt_file_delete_after_decryption"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_delete_after_decryption" />
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TextView
- android:id="@+id/decrypt_file_action_decrypt"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:text="@string/btn_decrypt_verify_file"
- android:clickable="true"
- android:background="?android:selectableItemBackground"
- android:drawableRight="@drawable/ic_save_grey_24dp"
- android:drawablePadding="8dp"
- android:gravity="center_vertical"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_above="@+id/decrypt_file_action_decrypt" />
-
- </RelativeLayout>
- </LinearLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml b/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
index 3d214dbf6..6c8a2e859 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
@@ -5,7 +5,7 @@
<include
android:id="@+id/toolbar_include"
- layout="@layout/toolbar_standalone_white" />
+ layout="@layout/toolbar_result_decrypt" />
<!--
fitsSystemWindows and layout_marginTop from
diff --git a/OpenKeychain/src/main/res/layout/decrypt_files_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_files_fragment.xml
new file mode 100644
index 000000000..22ee7e09f
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/decrypt_files_fragment.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <ScrollView
+ android:fillViewport="true"
+ android:paddingTop="8dp"
+ android:layout_width="match_parent"
+ android:scrollbars="vertical"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <View
+ android:id="@+id/status_divider"
+ android:layout_height="1dip"
+ android:layout_width="match_parent"
+ android:background="?android:attr/listDivider" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="4dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:orientation="horizontal"
+
+ android:id="@+id/decrypt_files_browse"
+ android:clickable="true"
+ android:background="?android:selectableItemBackground">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/label_file_colon"
+ android:gravity="center_vertical" />
+
+ <TextView
+ android:id="@+id/decrypt_files_filename"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:hint="@string/filemanager_title_open"
+ android:drawableRight="@drawable/ic_folder_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginBottom="8dp" />
+
+ <CheckBox
+ android:id="@+id/decrypt_files_delete_after_decryption"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/label_delete_after_decryption" />
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/decrypt_files_action_decrypt"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:text="@string/btn_decrypt_verify_file"
+ android:clickable="true"
+ android:background="?android:selectableItemBackground"
+ android:drawableRight="@drawable/ic_save_grey_24dp"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_above="@+id/decrypt_files_action_decrypt" />
+
+ </RelativeLayout>
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+
+ <!-- TODO: Use this layout later to hide file list -->
+ <LinearLayout
+ android:visibility="gone"
+ android:id="@+id/decrypt_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"></LinearLayout>
+
+ <LinearLayout
+ android:visibility="gone"
+ android:id="@+id/decrypt_error_overlay"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/decrypt_invalid_text"
+ android:padding="16dp"
+ android:layout_gravity="center"
+ android:textColor="@color/android_red_light" />
+
+ <Button
+ android:id="@+id/decrypt_error_overlay_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/button_edgy"
+ android:textColor="@color/android_red_light"
+ android:text="@string/decrypt_invalid_button"
+ android:layout_gravity="center_horizontal" />
+ </LinearLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml
index 33fc78780..9167a2859 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_text_fragment.xml
@@ -7,7 +7,7 @@
<LinearLayout
android:visibility="gone"
- android:id="@+id/decrypt_text_valid"
+ android:id="@+id/decrypt_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
@@ -37,7 +37,7 @@
</LinearLayout>
<LinearLayout
- android:id="@+id/decrypt_text_invalid"
+ android:id="@+id/decrypt_error_overlay"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
@@ -54,7 +54,7 @@
android:textColor="@color/android_red_light" />
<Button
- android:id="@+id/decrypt_text_invalid_button"
+ android:id="@+id/decrypt_error_overlay_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_edgy"
@@ -62,4 +62,4 @@
android:text="@string/decrypt_invalid_button"
android:layout_gravity="center_horizontal" />
</LinearLayout>
-</LinearLayout> \ No newline at end of file
+</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/main_activity.xml b/OpenKeychain/src/main/res/layout/main_activity.xml
index 4a07053ea..45df0df71 100644
--- a/OpenKeychain/src/main/res/layout/main_activity.xml
+++ b/OpenKeychain/src/main/res/layout/main_activity.xml
@@ -1,19 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
- android:id="@+id/activity_main_toolbar"
+ android:id="@+id/toolbar"
android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
+ android:layout_height="wrap_content"
android:elevation="4dp"
- android:background="?attr/colorPrimary"/>
+ android:background="?attr/colorPrimary"
+ android:minHeight="?attr/actionBarSize"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
+ tools:ignore="UnusedAttribute" />
<FrameLayout
android:id="@+id/main_fragment_container"
android:layout_gravity="center"
android:layout_height="match_parent"
- android:layout_width="match_parent"/>
+ android:layout_width="match_parent" />
</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-bg/help_changelog.md b/OpenKeychain/src/main/res/raw-bg/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-bg/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-bg/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-cs/help_changelog.md b/OpenKeychain/src/main/res/raw-cs/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-cs/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-de/help_changelog.md b/OpenKeychain/src/main/res/raw-de/help_changelog.md
index cd0a47f45..171c92403 100644
--- a/OpenKeychain/src/main/res/raw-de/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-de/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material-Design
* QR-Scanner-Integration (benötigt neue Berechtigungen)
diff --git a/OpenKeychain/src/main/res/raw-es/help_changelog.md b/OpenKeychain/src/main/res/raw-es/help_changelog.md
index 7c4367594..4306f3f08 100644
--- a/OpenKeychain/src/main/res/raw-es/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-es/help_changelog.md
@@ -1,8 +1,8 @@
[//]: # (NOTA: ¡Por favor ponga cada frase en su propia línea, Transifex pone cada línea en su propio campo de traducción!)
-## 3.2beta2
+## 3.2
- * Diseño estilo Material
+ * Material design (estilo)
* Integración de QR Scanner (se requieren nuevos permisos)
* Asistente de creación de clave mejorado
* Repara contactos perdidos después de la sincronización
diff --git a/OpenKeychain/src/main/res/raw-et/help_changelog.md b/OpenKeychain/src/main/res/raw-et/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-et/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-et/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-eu/help_changelog.md b/OpenKeychain/src/main/res/raw-eu/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-eu/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-eu/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-fi/help_changelog.md b/OpenKeychain/src/main/res/raw-fi/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-fi/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-fr/help_changelog.md b/OpenKeychain/src/main/res/raw-fr/help_changelog.md
index 9682bacae..b221eda6d 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.md
@@ -1,6 +1,6 @@
[//] : # (NOTE : veuillez mettre chaque phrase sur sa propre ligne. Transifex met chaque ligne dans son propre champ de traduction !)
-## 3.2beta2
+## 3.2
* Conception matérielle
* Intégration du lecteur QR (nouvelles permissions exigées)
diff --git a/OpenKeychain/src/main/res/raw-is/help_changelog.md b/OpenKeychain/src/main/res/raw-is/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-is/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-is/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-it/help_changelog.md b/OpenKeychain/src/main/res/raw-it/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-it/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-it/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-ja/help_certification.md b/OpenKeychain/src/main/res/raw-ja/help_certification.md
index 3518adf73..8b4364c09 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_certification.md
@@ -1,28 +1,28 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
-To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
+## 鍵の検証
+キーが本当に特定の人物に対応するか検証しないで、あなたは使うことができません。
+鍵の検証の最も単純な方法はQRコードのスキャンもしくはNFCでの交換をすることです。
+2人以上の間で鍵の検証するなら、あなたの鍵にある鍵交換メソッドで使えるものを提案します。
-## Key Status
+## 鍵ステータス
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+検証済み:あなたは既に鍵を検証しています、e.g.QRコードのスキャン。
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+未検証: この鍵はまだ検証されていません。あなたはこの鍵が特定の個人と結び付くとして利用することができません。
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+期限切れ: この鍵はすでに有効ではありません。鍵の主だけが鍵の有効期間を拡大することができます。
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+破棄済み: この鍵は有効ではありません。鍵の主がすでに破棄しています。
-## Advanced Information
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
-This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
+## 詳細情報
+OpenKeychainでの"鍵の検証"はOpenPGP標準に準拠した証明を生成する実装がなされています。
+この証明は ["汎用証明 (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) として標準に以下として記述されています:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
-Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
-Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
+歴史的に、証明(またより高いレベルの証明、"肯定的な証明" (0x13)) は OpenPGPによるWeb of Trustとして組織化されます。
+われわれの鍵の証明モデルはとてもシンプルなコンセプトによって関連する一般的なユーザビリティの問題を回避する概念です。
We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings. \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ja/help_changelog.md b/OpenKeychain/src/main/res/raw-ja/help_changelog.md
index c25d91a19..181544767 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* マテリアルデザイン
* QRスキャナの統合 (新しいパーミッションを必要とします)
@@ -47,13 +47,13 @@
## 3.0
* Yubikeyでの署名生成と復号化のフルサポート
- * Propose installable compatible apps in apps list
- * New design for decryption screens
- * Many fixes for key import, also fixes stripped keys
- * Honor and display key authenticate flags
- * User interface to generate custom keys
- * Fixing user id revocation certificates
- * New cloud search (searches over traditional keyservers and keybase.io)
+ * インストールできるAPIの互換性のあるアプリをアプリ内リストで提示します
+ * 復号化画面を新しいデザインに
+ * 鍵のインポートで沢山の修正、また鍵のストリップでも修正
+ * 鍵の認証フラグの表示と設定
+ * カスタムした鍵の生成のユーザーインタフェース
+ * ユーザーID破棄証明の修正
+ * 新しいクラウド検索 (古典的な keyserverと keybase.io から検索します)
* OpenKeychain内で鍵をストリップするのをサポートしました
@@ -115,155 +115,155 @@ Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Catha
## 2.6
* 鍵証明 (ありがとうVincent Breitmoser)
- * Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
- * New design for signature verification
- * Custom key length (thanks to Greg Witczak)
- * Fix share-functionality from other apps
+ * GnuPGの部分秘密鍵のサポート (ありがとうVincent Breitmoser)
+ * 新しいデザインでの署名の検証
+ * カスタムの鍵長 (ありがとうGreg Witczak)
+ * 他のアプリからの共有ファンクションの修正
## 2.5
- * Fix decryption of symmetric OpenPGP messages/files
- * Refactored key edit screen (thanks to Ash Hughes)
- * New modern design for encrypt/decrypt screens
- * OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
+ * 対称暗号化PGPメッセージ/ファイルの復号化を修正
+ * 鍵編集画面のリファクタ (ありがとうAsh Hughes)
+ * 暗号化/復号化画面を新しいモダンなデザインに
+ * OpenPGP API バージョン 3 (複数APIアカウント, 内部修正,鍵検索)
## 2.4
-Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
-Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+このリリースにおいて適用したリッチでバグのない機能を作ってくれたGoogle Summer of Code 2014の参加者たちに感謝を!
+また、以下の人達(アルファベット順)の作ってくれたいくつもの小さなパッチや相当数のパッチにも:
Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.
- * New unified key list
- * Colorized key fingerprint
- * Support for keyserver ports
- * Deactivate possibility to generate weak keys
- * Much more internal work on the API
- * Certify user ids
- * Keyserver query based on machine-readable output
- * Lock navigation drawer on tablets
- * Suggestions for emails on creation of keys
- * Search in public key lists
- * And much more improvements and fixes…
+ * 新しい統合キーリスト
+ * 鍵指紋のカラー化
+ * 鍵サーバのポート設定のサポート
+ * 弱い鍵の生成が可能だったのを無効化
+ * さらなるAPIでの内部動作
+ * ユーザーIDの証明
+ * 鍵サーバへの要求をマシンリーダブル出力を基盤にした
+ * タブレットでのナビゲーションドロワーのロック
+ * 鍵の生成でのメールについての提案
+ * 公開鍵リスト内での検索
+ * そしてさらなる改善と修正...
## 2.3.1
- * Hotfix for crash when upgrading from old versions
+ * 古いバージョンからのアップデートでクラッシュすることに対するホットフィックス
## 2.3
- * Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
- * Fix setting expiry dates on keys (thanks to Ash Hughes)
- * More internal fixes when editing keys (thanks to Ash Hughes)
- * Querying keyservers directly from the import screen
- * Fix layout and dialog style on Android 2.2-3.0
- * Fix crash on keys with empty user ids
- * Fix crash and empty lists when coming back from signing screen
- * Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source
- * Fix upload of key from signing screen
+ * 秘密鍵のエクスポート時における必要でない公開鍵のエクスポートの削除 (ありがとうAsh Hughes)
+ * 鍵の期限日時設定の修正 (ありがとうAsh Hughes)
+ * 鍵編集時のさらなる内部修正 (ありがとうAsh Hughes)
+ * インポート画面から直接鍵サーバへ要求するようにした
+ * Android 2.2から3.0でのレイアウトとダイアログスタイルの修正
+ * 空ユーザIDの鍵でのクラッシュ修正
+ * 署名画面から戻ってきたときにリストが空だとクラッシュするのを修正
+ * Bouncy Castle (cryptography library) を1.47 から 1.50アップデートおよびソースからのビルド
+ * 署名画面からの鍵のアップロード修正
## 2.2
- * New design with navigation drawer
- * New public key list design
- * New public key view
- * Bug fixes for importing of keys
- * Key cross-certification (thanks to Ash Hughes)
- * Handle UTF-8 passwords properly (thanks to Ash Hughes)
- * First version with new languages (thanks to the contributors on Transifex)
- * Sharing of keys via QR Codes fixed and improved
- * Package signature verification for API
+ * ナビゲーションドロワー付きの新しいデザイン
+ * 新しい公開鍵リストデザイン
+ * 新しい公開鍵ビュー
+ * 鍵のインポート時のバグ修正
+ * 鍵のクロス証明 (ありがとうAsh Hughes)
+ * 適切な UTF-8 パスワード処理 (ありがとうAsh Hughes)
+ * 新しい言語での最初のバージョン (ありがとうTransifexの貢献者達)
+ * QRコードによる鍵共有の修正と改善
+ * APIでのパッケージ署名検証
## 2.1.1
- * API Updates, preparation for K-9 Mail integration
+ * APIアップデート、K-9 Mail統合準備
## 2.1
- * Lots of bug fixes
- * New API for developers
- * PRNG bug fix by Google
+ * たくさんのバグ修正
+ * 開発者向け新API
+ * Googleによる擬似乱数生成器バグの修正
## 2.0
- * Complete redesign
- * Share public keys via QR codes, NFC beam
- * Sign keys
- * Upload keys to server
- * Fixes import issues
- * New AIDL API
+ * 再デザイン完了
+ * QRコード、NFCビームでの公開鍵共有
+ * 鍵への署名
+ * 鍵サーバへアップロード
+ * インポート問題修正
+ * 新しいAIDL API
## 1.0.8
- * Basic keyserver support
- * App2sd
- * More choices for passphrase cache: 1, 2, 4, 8, hours
- * Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
- * Bugfixes
- * Optimizations
+ * 鍵サーバの基本サポート
+ * App2SD
+ * パスフレーズのキャッシュ時間についての選択肢追加: 1,2,4,8時間
+ * 翻訳: ノルウェー語 (ありがとう、Sander Danielsen)、中国語 (ありがとう、Zhang Fredrick) 追加
+ * バグ修正
+ * 最適化
## 1.0.7
- * Fixed problem with signature verification of texts with trailing newline
- * More options for passphrase cache time to live (20, 40, 60 mins)
+ * 改行を含まないテキストの署名検証問題の修正
+ * パスフレーズのキャッシュ生存時間 (20,40,60分) のオプション追加
## 1.0.6
- * Account adding crash on Froyo fixed
- * Secure file deletion
- * Option to delete key file after import
- * Stream encryption/decryption (gallery, etc.)
- * New options (language, force v3 signatures)
- * Interface changes
- * Bugfixes
+ * Froyo でのアカウント追加時クラッシュの修正
+ * セキュアファイル削除
+ * 鍵ファイルインポート後の削除オプション
+ * ストリーム暗号化/復号化 (ギャラリーなど)
+ * 新しいオプション (言語、強制V3署名)
+ * インタフェース変更
+ * バグ修正
## 1.0.5
- * German and Italian translation
- * Much smaller package, due to reduced BC sources
- * New preferences GUI
- * Layout adjustment for localization
- * Signature bugfix
+ * ドイツ語およびイタリア語翻訳追加
+ * BCソースが重複してしまっていたことによる、より小さいパッケージ化
+ * 新しい設定GUI
+ * ローカライズでのレイアウトを適合化
+ * 署名バグ修正
## 1.0.4
- * Fixed another crash caused by some SDK bug with query builder
+ * クエリービルダーによるSDKのいくつかのバグによるクラッシュの修正
## 1.0.3
- * Fixed crashes during encryption/signing and possibly key export
+ * 鍵エクスポートできる時と暗号化/署名中のクラッシュ修正
## 1.0.2
- * Filterable key lists
- * Smarter pre-selection of encryption keys
- * New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
- * Fixes and additional features (key preselection) for K-9 Mail, new beta build available
+ * 鍵リストのフィルタ可能化
+ * 暗号化鍵の事前選択のよりスマートな実装
+ * VIEWおよびSENDについて新しいインテントのハンドリング、ファイルマネージャ外のファイルを暗号化/復号化するのを受け付けるようになる。
+ * K-9 Mailにおける修正と追加機能 (鍵事前選択)、新しいベータビルド提供
## 1.0.1
- * GMail account listing was broken in 1.0.0, fixed again
+ * 1.0.0で壊れたGmailアカウントリストアップを再度修正
## 1.0.0
- * K-9 Mail integration, APG supporting beta build of K-9 Mail
- * Support of more file managers (including ASTRO)
- * Slovenian translation
- * New database, much faster, less memory usage
- * Defined Intents and content provider for other apps
- * Bugfixes \ No newline at end of file
+ * K-9 Mail 統合、K-9 MailでのAPG サポートのベータビルド
+ * (ASTROを含む)ファイルマネージャのさらなるサポート
+ * スロベニア語翻訳追加
+ * より早くてメモリ使用量の少ない新しいデータベース
+ * 他のアプリでのインテントおよびコンテンツプロバイダの定義
+ * バグ修正 \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ja/help_start.md b/OpenKeychain/src/main/res/raw-ja/help_start.md
index 4cc331942..da765bb34 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_start.md
+++ b/OpenKeychain/src/main/res/raw-ja/help_start.md
@@ -1,16 +1,16 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## How do I activate OpenKeychain in K-9 Mail?
-To use OpenKeychain with K-9 Mail, you want to follow these steps:
- 1. Open K-9 Mail and long-tap on the account you want to use OpenKeychain with.
- 2. Select "Account settings", scroll to the very bottom and click "Cryptography".
- 3. Click on "OpenPGP Provider" and select OpenKeychain from the list.
+## OpenKeychain を K-9 Mailで有効にするにはどうすればよいか?
+OpenKeychain を K-9 Mail と使うには, 次のステップを進めてください:
+ 1. K-9 Mail を開き、OpenKeychain を使いたいアカウントでロングタップしてください。
+ 2. "アカウントの設定" を選択、下のほうにある"暗号化"までスクロールし、クリックしてください。
+ 3. "OpenPGP プロバイダ" をクリックし、リストからOpenKeychainを選択してください。
-## I found a bug in OpenKeychain!
-Please report the bug using the [issue tracker of OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain/issues).
+## OpenKeychainでバグを発見したなら!
+[OpenKeychainの課題トラッカ](https://github.com/openpgp-keychain/openpgp-keychain/issues)を使ってバグを報告してください。
-## Contribute
-If you want to help us developing OpenKeychain by contributing code [follow our small guide on Github](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code).
+## 提供
+OpenKeychain へコードを提供し、開発を助けてくださるのなら [Githubの小ガイドを参照](https://github.com/openpgp-keychain/openpgp-keychain#contribute-code)してください。
-## Translations
-Help translating OpenKeychain! Everybody can participate at [OpenKeychain on Transifex](https://www.transifex.com/projects/p/open-keychain/). \ No newline at end of file
+## 翻訳
+OpenKeychain の翻訳を助けてください! [TransifexのOpenKeychain](https://www.transifex.com/projects/p/open-keychain/)にだれでも参加することができます。 \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-nl/help_changelog.md b/OpenKeychain/src/main/res/raw-nl/help_changelog.md
index 6fd5d9872..28c008583 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-nl/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integratie van QR-scanner (nieuwe machtigingen vereist)
diff --git a/OpenKeychain/src/main/res/raw-pl/help_changelog.md b/OpenKeychain/src/main/res/raw-pl/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-pt/help_changelog.md b/OpenKeychain/src/main/res/raw-pt/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-pt/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-ro/help_changelog.md b/OpenKeychain/src/main/res/raw-ro/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-ro/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ro/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-ru/help_about.md b/OpenKeychain/src/main/res/raw-ru/help_about.md
index 9d635d9df..9b2e6e78a 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_about.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_about.md
@@ -2,12 +2,12 @@
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+[OpenKeychain](http://www.openkeychain.org) это OpenPGP имплементация для ОС Android.
-License: GPLv3+
+Лицензия: GPLv3+
-## Developers
- * Dominik Schürmann (Maintainer)
+## Разработчики
+ * Dominik Schürmann (Ведущий разработчик)
* Art O Cathain
* Ash Hughes
* Brian C. Barnes
@@ -28,7 +28,7 @@ License: GPLv3+
* Tim Bray
* Vincent Breitmoser
-## Libraries
+## Используемые библиотеки
* [SpongyCastle](http://rtyley.github.com/spongycastle/) (MIT X11 License)
* [SafeSlinger Exchange library](https://github.com/SafeSlingerProject/exchange-android) (MIT License)
* [Android Support Libraries](http://developer.android.com/tools/support-library/index.html) (Apache License v2)
diff --git a/OpenKeychain/src/main/res/raw-ru/help_certification.md b/OpenKeychain/src/main/res/raw-ru/help_certification.md
index 3518adf73..61dfa67a5 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_certification.md
@@ -1,22 +1,22 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
+## Подтверждение ключей
+Без подтверждения Вы не можете быть уверены, что ключ принадлежит определенному человеку.
+Простейший способ подтвердить - отсканировать QR код или получить ключ через NFC.
To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
-## Key Status
+## Статус ключей
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+Подтверждён: Вы уже подтвердили этот ключ, напр. отсканировав QR код.
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+Не подтверждён: Этот ключ ещё не прошел проверку. Вы не можете быть уверены, что ключ принадлежит определенному человеку.
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+Просрочен: Срок годности ключа истёк. Только его владелец может продлить срок годности.
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+Отозван: Этот ключ больше не действителен. Владелец ключа отозвал его.
-## Advanced Information
+## Подробная информация
A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
diff --git a/OpenKeychain/src/main/res/raw-ru/help_changelog.md b/OpenKeychain/src/main/res/raw-ru/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-ru/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-sl/help_changelog.md b/OpenKeychain/src/main/res/raw-sl/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-sl/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-sv/help_changelog.md b/OpenKeychain/src/main/res/raw-sv/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-sv/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-tr/help_changelog.md b/OpenKeychain/src/main/res/raw-tr/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-tr/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-uk/help_changelog.md b/OpenKeychain/src/main/res/raw-uk/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-uk/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
index 9d635d9df..95fca0cec 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.md
@@ -2,9 +2,9 @@
[http://www.openkeychain.org](http://www.openkeychain.org)
-[OpenKeychain](http://www.openkeychain.org) is an OpenPGP implementation for Android.
+<a href="http://www.openkeychain.org">OpenKeychain</a>是一個Android的OpenPGP應用。
-License: GPLv3+
+授權: GPLv3+
## Developers
* Dominik Schürmann (Maintainer)
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
index 3518adf73..a69349fa2 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_certification.md
@@ -1,23 +1,23 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## Key Confirmation
-Without confirmation, you cannot be sure if a key really corresponds to a specific person.
-The simplest way to confirm a key is by scanning the QR Code or exchanging it via NFC.
+金鑰認證
+這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。
+最簡單確認金鑰的方式就是透過掃描QR code或是經由NFC交換。
To confirm keys between more than two persons, we suggest to use the key exchange method available for your keys.
-## Key Status
+## 金鑰狀態
<img src="status_signature_verified_cutout_24dp"/>
-Confirmed: You have already confirmed this key, e.g., by scanning the QR Code.
+已認證: 你已經認證了這個金鑰,例如透過掃描QR Code。
<img src="status_signature_unverified_cutout_24dp"/>
-Unconfirmed: This key has not been confirmed yet. You cannot be sure if the key really corresponds to a specific person.
+未確認:這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。
<img src="status_signature_expired_cutout_24dp"/>
-Expired: This key is no longer valid. Only the owner can extend its validity.
+已過期:這個金鑰因超過有效期限而失效。只有金鑰擁有者可以改變有效期限。
<img src="status_signature_revoked_cutout_24dp"/>
-Revoked: This key is no longer valid. It has been revoked by its owner.
+已撤銷:這個金鑰已經被擁有者撤銷而失效。
## Advanced Information
-A "key confirmation" in OpenKeychain is implemented by creating a certification according to the OpenPGP standard.
+在OpenKeychain中,透過根據標準OpenPGP所建立的證書可以簡單的認證一個金鑰。
This certification is a ["generic certification (0x10)"](http://tools.ietf.org/html/rfc4880#section-5.2.1) described in the standard by:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw-zh/help_changelog.md b/OpenKeychain/src/main/res/raw-zh/help_changelog.md
index 4a7ddb7f2..ab7fa8773 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw-zh/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* Material design
* Integration of QR Scanner (New permissions required)
diff --git a/OpenKeychain/src/main/res/raw/help_changelog.md b/OpenKeychain/src/main/res/raw/help_changelog.md
index 98639de71..6f499d531 100644
--- a/OpenKeychain/src/main/res/raw/help_changelog.md
+++ b/OpenKeychain/src/main/res/raw/help_changelog.md
@@ -1,6 +1,6 @@
[//]: # (NOTE: Please put every sentence in its own line, Transifex puts every line in its own translation field!)
-## 3.2beta2
+## 3.2
* First version with full YubiKey support available from the user interface: Edit keys, bind YubiKey to keys,...
* Material design
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index 2dd1821ee..ce0911af5 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -130,11 +130,13 @@
<plurals name="n_keys">
<item quantity="one">1 ключ</item>
<item quantity="few">%d ключей</item>
+ <item quantity="many">%d ключей</item>
<item quantity="other">%d ключей</item>
</plurals>
<plurals name="n_keyservers">
<item quantity="one">%d сервер ключей</item>
<item quantity="few">%d серверов ключей</item>
+ <item quantity="many">%d серверов ключей</item>
<item quantity="other">%d серверов ключей</item>
</plurals>
<string name="secret_key">Секретный ключ:</string>
@@ -264,6 +266,7 @@
<plurals name="progress_exporting_key">
<item quantity="one">экспорт ключа...</item>
<item quantity="few">экспорт ключей...</item>
+ <item quantity="many">экспорт ключей...</item>
<item quantity="other">экспорт ключей...</item>
</plurals>
<string name="progress_extracting_signature_key">извлечение подписи ключа...</string>
@@ -336,6 +339,7 @@
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Ключ успешно импортирован</item>
<item quantity="few">Успешно добавлено %1$d ключей</item>
+ <item quantity="many">Успешно добавлено %1$d ключей</item>
<item quantity="other">Успешно добавлено %1$d ключей</item>
</plurals>
<string name="import_error_nothing">Нет данных для импорта.</string>
@@ -388,6 +392,7 @@
<plurals name="key_list_selected_keys">
<item quantity="one">1 ключ выбран.</item>
<item quantity="few">%d ключей выбрано.</item>
+ <item quantity="many">%d ключей выбрано.</item>
<item quantity="other">%d ключей выбрано.</item>
</plurals>
<string name="key_list_empty_text1">Ключи не найдены!</string>
@@ -785,6 +790,7 @@
<plurals name="error_import_non_pgp_part">
<item quantity="one">часть загруженного файла содержит данные OpenPGP, но это не ключ</item>
<item quantity="few">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
+ <item quantity="many">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
<item quantity="other">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
</plurals>
<!--Messages for Export Log operation-->
diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
index ffe2d0aae..95fa8a28c 100644
--- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
@@ -436,6 +436,8 @@
<string name="key_view_action_edit">編輯金鑰</string>
<string name="key_view_action_encrypt">加密文字</string>
<string name="key_view_action_encrypt_files">檔案</string>
+ <string name="key_view_action_share_with">分享...</string>
+ <string name="key_view_action_share_nfc">以NFC分享</string>
<string name="key_view_action_upload">上傳到金鑰伺服器</string>
<string name="key_view_tab_main">摘要</string>
<string name="key_view_tab_share">分享</string>
@@ -458,24 +460,37 @@
<item>撤銷身分識別</item>
</string-array>
<string name="edit_key_edit_user_id_revoked">這個身分識別已被撤銷。此動作無法還原。</string>
+ <string name="edit_key_edit_subkey_title">選擇操作動作!</string>
<string-array name="edit_key_edit_subkey">
<item>變更到期日</item>
<item>撤銷子金鑰</item>
<item>Strip Subkey</item>
</string-array>
+ <string name="edit_key_new_subkey">新增子金鑰</string>
<string name="edit_key_error_add_identity">新增至少一組身分識別!</string>
<string name="edit_key_error_add_subkey">新增至少一組子金鑰!</string>
<!--Create key-->
<string name="create_key_empty">必填欄位</string>
<string name="create_key_passphrases_not_equal">口令不相符</string>
<string name="create_key_final_robot_text">建立金鑰可能需要一點時間,來杯咖啡吧…</string>
+ <string name="create_key_name_text">選擇一個名字有關這個金鑰。 這可以是全名John Doe或是暱稱Johnny。</string>
+ <string name="create_key_passphrase_text">選擇一個安全性較佳的口令,當手機遺失或遭竊時可以保護你的金鑰。</string>
+ <string name="create_key_hint_full_name">全名或暱稱</string>
+ <string name="create_key_add_email">新增電子郵件</string>
<!--View key-->
+ <string name="view_key_my_key">我的金鑰:</string>
<!--Navigation Drawer-->
<string name="nav_keys">金鑰</string>
+ <string name="nav_encrypt_decrypt">加密/解密</string>
<string name="nav_apps">應用程式</string>
<string name="my_keys">我的金鑰</string>
<!--hints-->
<!--certs-->
+ <string name="cert_default">預設</string>
+ <string name="cert_none">無</string>
+ <string name="cert_verify_ok">OK</string>
+ <string name="cert_verify_failed">失敗!</string>
+ <string name="cert_verify_error">錯誤!</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
<!--Import Public log entries-->
<!--Import Secret log entries-->
@@ -540,6 +555,7 @@
<string name="error_no_encrypt_subkey">沒有可供加密的子金鑰!</string>
<string name="info_no_manual_account_creation">請不要自行建立OpenKeychain帳戶。\n更多資訊請參考說明。</string>
<string name="exchange_description">要發起金鑰交換,先在右邊選擇與會人數,然後點選〝開始交換〞。\n\n接下來會詢問你兩個問題,以確保會議成員與交換的指紋是正確的。</string>
+ <string name="btn_start_exchange">開始交換</string>
<!--Passphrase wizard-->
<!--TODO: rename all the things!-->
<!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 2c438370a..3de83f9d5 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -42,7 +42,7 @@
<!-- section -->
<string name="section_user_ids">"Identities"</string>
- <string name="section_yubikey">"Yubikey"</string>
+ <string name="section_yubikey">"YubiKey"</string>
<string name="section_linked_system_contact">"Linked System Contact"</string>
<string name="section_should_you_trust">"Should you trust this key?"</string>
<string name="section_proof_details">Proof verification</string>
@@ -138,7 +138,8 @@
<string name="label_file_compression">"File compression"</string>
<string name="label_keyservers">"Keyservers"</string>
<string name="label_key_id">"Key ID"</string>
- <string name="label_creation">"Key created %s"</string>
+ <string name="label_key_created">"Key created %s"</string>
+ <string name="label_creation">"Creation"</string>
<string name="label_expiry">"Expiry"</string>
<string name="label_usage">"Usage"</string>
<string name="label_key_size">"Key Size"</string>
@@ -505,7 +506,7 @@
<string name="api_settings_delete_account">"Delete account"</string>
<string name="api_settings_package_name">"Package Name"</string>
<string name="api_settings_package_signature">"SHA-256 of Package Signature"</string>
- <string name="api_settings_accounts">"Accounts (deprecated API)"</string>
+ <string name="api_settings_accounts">"Accounts (old API)"</string>
<string name="api_settings_advanced">"Extended Information"</string>
<string name="api_settings_allowed_keys">"Allowed Keys"</string>
<string name="api_settings_settings">"Settings"</string>
@@ -523,6 +524,7 @@
<string name="api_select_pub_keys_text_no_user_ids">"Please select the recipients!"</string>
<string name="api_error_wrong_signature">"Signature check failed! Have you installed this app from a different source? If you are sure that this is not an attack, revoke this app's registration in OpenKeychain and then register the app again."</string>
<string name="api_select_sign_key_text">"Please select one of your existing keys or create a new one."</string>
+ <string name="api_select_keys_text">"None of the allowed keys is able to decrypt the content. Please select the allowed keys."</string>
<!-- Share -->
<string name="share_qr_code_dialog_title">"Share with QR Code"</string>
@@ -643,6 +645,7 @@
<string name="create_key_add_email">"Add email address"</string>
<string name="create_key_add_email_text">"Additional email addresses are also associated to this key and can be used for secure communication."</string>
<string name="create_key_email_already_exists_text">"Email address has already been added"</string>
+ <string name="create_key_email_invalid_email">"Email address format is invalid"</string>
<!-- View key -->
<string name="view_key_revoked">"Revoked: Key must not be used anymore!"</string>
@@ -1302,13 +1305,15 @@
<string name="yubikey_serno">"Serial No: %s"</string>
<string name="yubikey_key_holder">"Key holder: "</string>
<string name="yubikey_key_holder_unset">"Key holder: &lt;unset&gt;"</string>
- <string name="yubikey_status_bound">"Yubikey matches and is bound to key"</string>
- <string name="yubikey_status_unbound">"Yubikey matches, can be bound to key"</string>
- <string name="yubikey_status_partly">"Yubikey matches, partly bound to key"</string>
+ <string name="yubikey_status_bound">"YubiKey matches and is bound to key"</string>
+ <string name="yubikey_status_unbound">"YubiKey matches, can be bound to key"</string>
+ <string name="yubikey_status_partly">"YubiKey matches, partly bound to key"</string>
+ <string name="yubikey_create">"Hold YubiKey against the back of your device."</string>
<string name="btn_import">"Import"</string>
- <string name="snack_yubi_other">Different key stored on Yubikey!</string>
+ <string name="snack_yubi_other">Different key stored on YubiKey!</string>
<string name="error_nfc">"NFC Error: %s"</string>
<string name="error_pin_nodefault">Default PIN was rejected!</string>
+ <string name="error_bluetooth_file">Error creating temporary file. Bluetooth sharing will fail.</string>
<string name="linked_create_https_1_1">"By creating a Linked Identity of this type, you can link your key to a website you control."</string>
<string name="linked_create_https_1_2">"To do this, you publish a text file on this website, then create a Linked Identity which links to it."</string>
diff --git a/OpenKeychain/src/main/res/values/themes.xml b/OpenKeychain/src/main/res/values/themes.xml
index 96d09151d..6ac09c5d7 100644
--- a/OpenKeychain/src/main/res/values/themes.xml
+++ b/OpenKeychain/src/main/res/values/themes.xml
@@ -8,17 +8,12 @@
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
+ <!-- remove actionbar and title, we use toolbar! -->
<item name="windowNoTitle">true</item>
- <!-- remove actionbar, we use toolbar! -->
<item name="windowActionBar">false</item>
<!-- multi selection should overlay Toolbar! http://stackoverflow.com/a/26450875 -->
<item name="windowActionModeOverlay">true</item>
<item name="searchViewStyle">@style/MySearchViewStyle</item>
-
- <!-- dark action bar... -->
- <item name="theme">@style/ThemeOverlay.AppCompat.Dark</item>
- <!-- ...but light popup menu (white background) -->
- <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
</style>
<!-- http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html -->
diff --git a/README.md b/README.md
index c9191b228..a9f287044 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,9 @@ Specification will follow.
OpenKeychain is an OpenPGP implementation for Android.
For a more detailed description and installation instructions go to http://www.openkeychain.org .
-### Travis CI Build Status
+### Travis CI Build Status of development branch
-[![Build Status](https://travis-ci.org/open-keychain/open-keychain.png?branch=master)](https://travis-ci.org/open-keychain/open-keychain)
+[![Build Status](https://travis-ci.org/open-keychain/open-keychain.png?branch=development)](https://travis-ci.org/open-keychain/open-keychain)
## How to help the project?
@@ -21,12 +21,16 @@ Translations are managed at Transifex, please contribute there at https://www.tr
### Contribute Code
+1. Lookout for interesting issues on Github. We have tagged issues were we explicitly like to see contributions: https://github.com/open-keychain/open-keychain/labels/help-wanted
+2. Read this README, especially the notes about coding style
+3. Fork OpenKeychain and contribute code (the best part :sunglasses: )
+4. Open a pull request on Github. We will help with occuring problems and merge your changes back into the main project.
+5. PROFIT
+
+### For bigger changes
+
1. Join the development mailinglist at http://groups.google.com/d/forum/openpgp-keychain-dev
-2. Lookout for interesting issues on Github. We have tagged issues were we explicitly like to see contributions: https://github.com/open-keychain/open-keychain/labels/help-wanted
-3. Tell us about your plans on the mailinglist
-4. Read this README, especially the notes about coding style
-5. Fork OpenKeychain and contribute code (the best part ;) )
-6. Open a pull request on Github. I will help with occuring problems and merge your changes back into the main project.
+2. Propose bigger changes and discuss the consequences
I am happy about every code contribution and appreciate your effort to help us developing OpenKeychain!
@@ -36,32 +40,28 @@ Development mailinglist at http://groups.google.com/d/forum/openpgp-keychain-dev
### Build with Gradle
-1. Get all external submodules with ``git submodule update --init --recursive``
-2. Have Android SDK "tools", "platform-tools", and "build-tools" directories in your PATH (http://developer.android.com/sdk/index.html)
-3. Open the Android SDK Manager (shell command: ``android``).
-Expand the Tools directory and select "Android SDK Build-tools (Version 21.1.1)".
+1. Clone the project from GitHub
+2. Get all external submodules with ``git submodule update --init --recursive``
+3. Have Android SDK "tools", "platform-tools", and "build-tools" directories in your PATH (http://developer.android.com/sdk/index.html)
+4. Open the Android SDK Manager (shell command: ``android``).
+Expand the Tools directory and select "Android SDK Build-tools (Version 21.1.2)".
Expand the Extras directory and install "Android Support Repository"
-Select everything for the newest SDK Platform (API-Level 21)
-4. Export ANDROID_HOME pointing to your Android SDK
-5. Execute ``./gradlew build``
-6. You can install the app with ``adb install -r OpenKeychain/build/outputs/apk/OpenKeychain-debug-unaligned.apk``
+Select everything for the newest SDK Platform, API 22, and also API 21
+5. Export ANDROID_HOME pointing to your Android SDK
+6. Execute ``./gradlew build``
+7. You can install the app with ``adb install -r OpenKeychain/build/outputs/apk/OpenKeychain-debug-unaligned.apk``
### Run Tests
1. Use OpenJDK instead of Oracle JDK
-3. Execute ``./gradlew test``
-
-### Build API Demo with Gradle
-
-1. Follow 1-4 from above
-2. The example code is available at https://github.com/open-keychain/api-example
-3. Execute ``./gradlew build``
+2. Execute ``./gradlew test``
### Development with Android Studio
We are using the newest [Android Studio](http://developer.android.com/sdk/installing/studio.html) for development. Development with Eclipse is currently not possible because we are using the new [project structure](http://developer.android.com/sdk/installing/studio-tips.html).
1. Clone the project from Github
-2. From Android Studio: File -> Import Project -> Select the cloned top folder
+2. Get all external submodules with ``git submodule update --init --recursive``
+3. From Android Studio: File -> Import Project -> Select the cloned top folder
## Libraries
diff --git a/build.gradle b/build.gradle
index baa1f8d97..4fc97ff6d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,6 +7,8 @@ buildscript {
// NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information
classpath 'com.android.tools.build:gradle:1.1.3'
classpath files('gradle-witness.jar')
+ // bintray dependency to satisfy dependency of openpgp-api lib
+ classpath 'com.novoda:bintray-release:0.2.7'
}
}
diff --git a/extern/openkeychain-api-lib b/extern/openkeychain-api-lib
-Subproject 9259075028e0906d0cb085e0c4578e23829dc3c
+Subproject 2a6cc7999f35c6e85e80ab6f98965d0e64974a9
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
-Subproject 70259ab74889fb5b785da0afc74259816f0b34b
+Subproject 5a24bb3428e89d394861d71bd50b46d941d6c87
diff --git a/extern/snackbar b/extern/snackbar
deleted file mode 160000
-Subproject 97cda0806d9ead9a3aacf3d4f7275ac0e38d960
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 085a1cdc2..cb5ccd9f1 100644
--- a/gradle/wrapper/gradle-wrapper.jar
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 8308df30c..6e00d9230 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -4,3 +4,4 @@ distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-bin.zip
+distributionSha256Sum=010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774 \ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 19f651b89..1b9038344 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,6 +1,6 @@
include ':OpenKeychain'
-include ':extern:openpgp-api-lib'
-include ':extern:openkeychain-api-lib'
+include ':extern:openpgp-api-lib:openpgp-api'
+include ':extern:openkeychain-api-lib:openkeychain-intents'
include ':extern:spongycastle:core'
include ':extern:spongycastle:pg'
include ':extern:spongycastle:pkix'
@@ -8,5 +8,4 @@ include ':extern:spongycastle:prov'
include ':extern:minidns'
include ':extern:KeybaseLib:Lib'
include ':extern:safeslinger-exchange'
-include ':extern:snackbar:lib'
include ':OpenKeychain-Test'